| import os |
| import sqlite3 |
|
|
|
|
| class MemoryDB: |
| def __init__(self, db=None): |
| self.db_file = db |
| if db is None: |
| self.db_file = f"{os.getcwd()}/mem.sqlite3" |
| |
| try: |
| self.cnx = sqlite3.connect(self.db_file) |
| except Exception as e: |
| print("Exception connecting to memory database file:", e) |
| self.cnx = None |
| finally: |
| if self.cnx is None: |
| |
| self.db_file = ":memory:" |
| self.cnx = sqlite3.connect(self.db_file) |
| self.cnx.execute( |
| "CREATE VIRTUAL TABLE \ |
| IF NOT EXISTS text USING FTS5 \ |
| (session, \ |
| key, \ |
| block);" |
| ) |
| self.session_id = int(self.get_max_session_id()) + 1 |
| self.cnx.commit() |
|
|
| def get_cnx(self): |
| if self.cnx is None: |
| self.cnx = sqlite3.connect(self.db_file) |
| return self.cnx |
|
|
| |
| def get_max_session_id(self): |
| id = None |
| cmd_str = f"SELECT MAX(session) FROM text;" |
| cnx = self.get_cnx() |
| max_id = cnx.execute(cmd_str).fetchone()[0] |
| if max_id is None: |
| id = 0 |
| else: |
| id = max_id |
| return id |
|
|
| |
| def get_next_key(self): |
| next_key = None |
| cmd_str = f"SELECT MAX(key) FROM text \ |
| where session = {self.session_id};" |
| cnx = self.get_cnx() |
| next_key = cnx.execute(cmd_str).fetchone()[0] |
| if next_key is None: |
| next_key = 0 |
| else: |
| next_key = int(next_key) + 1 |
| return next_key |
|
|
| |
| def insert(self, text=None): |
| if text is not None: |
| key = self.get_next_key() |
| session_id = self.session_id |
| cmd_str = f"REPLACE INTO text(session, key, block) \ |
| VALUES (?, ?, ?);" |
| cnx = self.get_cnx() |
| cnx.execute(cmd_str, (session_id, key, text)) |
| cnx.commit() |
|
|
| |
| def overwrite(self, key, text): |
| self.delete_memory(key) |
| session_id = self.session_id |
| cmd_str = f"REPLACE INTO text(session, key, block) \ |
| VALUES (?, ?, ?);" |
| cnx = self.get_cnx() |
| cnx.execute(cmd_str, (session_id, key, text)) |
| cnx.commit() |
|
|
| def delete_memory(self, key, session_id=None): |
| session = session_id |
| if session is None: |
| session = self.session_id |
| cmd_str = f"DELETE FROM text WHERE session = {session} AND key = {key};" |
| cnx = self.get_cnx() |
| cnx.execute(cmd_str) |
| cnx.commit() |
|
|
| def search(self, text): |
| cmd_str = f"SELECT * FROM text('{text}')" |
| cnx = self.get_cnx() |
| rows = cnx.execute(cmd_str).fetchall() |
| lines = [] |
| for r in rows: |
| lines.append(r[2]) |
| return lines |
|
|
| |
| def get_session(self, id=None): |
| if id is None: |
| id = self.session_id |
| cmd_str = f"SELECT * FROM text where session = {id}" |
| cnx = self.get_cnx() |
| rows = cnx.execute(cmd_str).fetchall() |
| lines = [] |
| for r in rows: |
| lines.append(r[2]) |
| return lines |
|
|
| |
| def quit(self): |
| self.cnx.commit() |
| self.cnx.close() |
|
|
|
|
| permanent_memory = MemoryDB() |
|
|
| |
| |
| |
| |
|
|