From 1f25adc0edfa1de1b31a9d4d1655798a6cc0f83c Mon Sep 17 00:00:00 2001 From: apeters Date: Wed, 21 May 2025 08:06:38 +0000 Subject: [PATCH] Ignore update Signed-off-by: apeters --- .gitignore | 2 +- components/database/__init__.py | 66 +++++++++++++++++++++++++++++++++ database/.gitkeep | 0 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 components/database/__init__.py create mode 100644 database/.gitkeep diff --git a/.gitignore b/.gitignore index 17d1877..10c5e3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ system/certs/* -database/ +database/* logs/* misc/* diff --git a/components/database/__init__.py b/components/database/__init__.py new file mode 100644 index 0000000..2463c6f --- /dev/null +++ b/components/database/__init__.py @@ -0,0 +1,66 @@ +import contextvars +import os +import shutil +import json + +from aiotinydb import AIOTinyDB as TinyDB +from aiotinydb.storage import AIOStorage +from copy import copy +from tinydb import Query +from tinydb.table import Document +from components.utils import is_path_within_cwd + +__all__ = [ + "TinyDB", + "Query", + "Document", + "TINYDB_PARAMS", + "IN_MEMORY_DB", + "CTX_TICKET", + "evaluate_db_params", + "dbcommit", +] + +TinyDB.DEFAULT_TABLE_KWARGS = {"cache_size": 0} +TINYDB_PARAMS = { + "filename": "database/main", + "indent": 2, + "sort_keys": True, +} +IN_MEMORY_DB = dict() +CTX_TICKET = contextvars.ContextVar("CTX_TICKET", default=None) + + +def evaluate_db_params(ticket: str | None = None): + db_params = copy(TINYDB_PARAMS) + transaction_file = ( + f"database/main.{ticket}" + if ticket + else f"database/main.{CTX_TICKET.get() or ''}".rstrip(".") + ) + + if transaction_file != "database/main" and is_path_within_cwd(transaction_file): + if not os.path.exists(transaction_file): + shutil.copy("database/main", transaction_file) + + db_params["filename"] = transaction_file + return db_params + + +async def dbcommit(commit_tables: set, ticket: str | None = None) -> None: + assert commit_tables + db_params = evaluate_db_params(ticket) + + with open(db_params["filename"], "r") as f: + modified_db = json.load(f) + + async with TinyDB(**TINYDB_PARAMS) as db: + current_db = json.load(db._storage._handle) + for t in commit_tables: + current_db[t] = modified_db[t] + db._storage._handle.seek(0) + serialized = json.dumps(current_db, **db._storage.kwargs) + db._storage._handle.write(serialized) + db._storage._handle.flush() + db._storage._handle.truncate() + os.unlink(db_params["filename"]) diff --git a/database/.gitkeep b/database/.gitkeep new file mode 100644 index 0000000..e69de29