summaryrefslogtreecommitdiff
path: root/src/pyssg/db/database.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pyssg/db/database.py')
-rw-r--r--src/pyssg/db/database.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/pyssg/db/database.py b/src/pyssg/db/database.py
new file mode 100644
index 0000000..24b7e8b
--- /dev/null
+++ b/src/pyssg/db/database.py
@@ -0,0 +1,78 @@
+import json
+import sqlite3
+from logging import Logger, getLogger
+from sqlite3 import PARSE_DECLTYPES, Connection, Cursor
+from typing import Any, Sequence
+
+from pyssg.db.tuple import adapt_tuple, convert_tuple
+from pyssg.db.queries import CREATE_FILES_TABLE, SELECT_FILE, SELECT_FILE_ALL, INSERT_FILE, UPDATE_FILE, UPDATE_FILE_TAGS
+
+log: Logger = getLogger(__name__)
+
+
+class Database:
+ def __init__(self, path: str) -> None:
+ sqlite3.register_adapter(tuple, adapt_tuple)
+ sqlite3.register_converter("tuple", convert_tuple)
+ self.con: Connection = sqlite3.connect(path, detect_types=PARSE_DECLTYPES)
+ self.cur: Cursor = self.con.cursor()
+ # create statements are always commited
+ self.query(CREATE_FILES_TABLE)
+
+
+ # commits the transactions, closes connection and cursor
+ def write(self) -> None:
+ self.con.commit()
+ self.cur.close()
+ self.con.close()
+
+
+ def query(self, sql: str,
+ params: dict | Sequence = ()) -> list[Any]:
+ return self.cur.execute(sql, params).fetchall()
+
+
+ # commit query, doesn't wait until calling con.commit()
+ def cquery(self, sql: str,
+ params: dict | Sequence = ()) -> list[Any]:
+ out: list[Any]
+ with self.con:
+ out = self.query(sql, params)
+ return out
+
+
+ def select(self, fname: str) -> tuple | None:
+ out: list[Any]
+ out = self.query(SELECT_FILE, (fname,))
+ return out[0] if out else None
+
+
+ def select_all(self) -> list[Any] | None:
+ out: list[Any] = self.query(SELECT_FILE_ALL)
+ return out if out else None
+
+
+ def insert(self, fname: str,
+ ctime: float,
+ checksum: str,
+ tags: tuple | None = None) -> None:
+ params: tuple = (fname, ctime, checksum, tags)
+ out: tuple = self.query(INSERT_FILE, params)[0]
+ log.debug("insert %s", out)
+
+
+ def update(self, fname: str,
+ mtime: float,
+ checksum: str,
+ tags: tuple | None = None) -> None:
+ params: tuple = (mtime, checksum, tags, fname)
+ out: tuple = self.query(UPDATE_FILE, params)[0]
+ log.debug("update %s", out)
+
+
+ def update_tags(self, fname: str,
+ tags: tuple | None = None) -> None:
+ params: tuple = (tags, fname)
+ out: tuple = self.query(UPDATE_FILE_TAGS, params)[0]
+ log.debug("update %s", out)
+