From de775913e841e2252376d150e38aea54992d8a5c Mon Sep 17 00:00:00 2001 From: jay817 Date: Fri, 23 Aug 2024 08:03:33 -0400 Subject: [PATCH] Add sqlite3/db.py --- sqlite3/db.py | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 sqlite3/db.py diff --git a/sqlite3/db.py b/sqlite3/db.py new file mode 100644 index 0000000..ecf1d89 --- /dev/null +++ b/sqlite3/db.py @@ -0,0 +1,52 @@ +import sqlite3, json + +class DB(sqlite3.Connection): + def __init__(self, db_name="db.sqlite"): + super().__init__(db_name) + with self: + self.execute(''' + CREATE TABLE IF NOT EXISTS kv_store + (key TEXT PRIMARY KEY, value BLOB) + ''') + + def __setitem__(self, key, value): + if not isinstance(value, bytes): value = json.dumps(value) + with self: + cur = self.execute(''' + INSERT OR REPLACE INTO kv_store + (key, value) VALUES (?, ?) + ''', (key, value)) + return {"modified_count": cur.rowcount} + + def __getitem__(self, key): + with self: + result = self.execute(''' + SELECT value FROM kv_store + WHERE key = ? + ''', (key,)).fetchone() + if result: + if isinstance(result[0], str): + try: return json.loads(result[0]) + except json.JSONDecodeError: pass + return result[0] + + def delete(self, key): + with self: + cur = self.execute(''' + DELETE FROM kv_store + WHERE key = ? + ''', (key,)) + return {"deleted_count": cur.rowcount} + + def keys(self, pattern='*'): + pattern = pattern.translate(str.maketrans({ + '\\': '\\\\', '%': '\\%', '_': '\\_', '*': '%', '?': '_' + })) + with self: + result = self.execute(''' + SELECT key FROM kv_store + WHERE key LIKE ? ESCAPE '\\' + ''', (pattern,)).fetchall() + return [row[0] for row in result] + + def __repr__(self): return repr(self.keys()) \ No newline at end of file