From 78d82605facbfd468584f7cc6e6f5515af4be8be Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sun, 17 Mar 2024 03:15:55 +0100 Subject: [PATCH] Add creation, validation, setting of rump database file. --- plomtask/db.py | 39 +++++++++++++++++++++++++++++++++++++++ run.py | 17 ++++++++++++++++- scripts/init.sql | 3 +++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 plomtask/db.py create mode 100644 scripts/init.sql diff --git a/plomtask/db.py b/plomtask/db.py new file mode 100644 index 0000000..a8bdbec --- /dev/null +++ b/plomtask/db.py @@ -0,0 +1,39 @@ +"""Database management.""" +from os.path import isfile +from sqlite3 import connect as sql_connect +from plomtask.misc import HandledException + +PATH_DB_SCHEMA = 'scripts/init.sql' + + +class DatabaseFile: + """Represents the sqlite3 database's file.""" + + def __init__(self, path): + self.path = path + self.check() + + def check(self): + """Check file exists and is of proper schema.""" + self.exists = isfile(self.path) + if self.exists: + self.validate_schema() + + def remake(self): + """Create tables in self.path file as per PATH_DB_SCHEMA sql file.""" + with sql_connect(self.path) as conn: + with open(PATH_DB_SCHEMA, 'r', encoding='utf-8') as f: + conn.executescript(f.read()) + self.check() + + def validate_schema(self): + """Compare found schema with what's stored at PATH_DB_SCHEMA.""" + sql_for_schema = 'SELECT sql FROM sqlite_master ORDER BY sql' + msg_wrong_schema = 'Database has wrong tables schema.' + with sql_connect(self.path) as conn: + schema_rows = [r[0] for r in conn.execute(sql_for_schema) if r[0]] + retrieved_schema = ';\n'.join(schema_rows) + ';' + with open(PATH_DB_SCHEMA, 'r', encoding='utf-8') as f: + stored_schema = f.read().rstrip() + if stored_schema != retrieved_schema: + raise HandledException(msg_wrong_schema) diff --git a/run.py b/run.py index d94905d..e0cdd8b 100755 --- a/run.py +++ b/run.py @@ -1,15 +1,30 @@ #!/usr/bin/env python3 """Call this to start the application.""" from sys import exit as sys_exit +from os import environ from plomtask.misc import HandledException from plomtask.http import TaskHandler, TaskServer +from plomtask.db import DatabaseFile +PATH_DB = environ.get('PATH_DB') HTTP_PORT = 8082 TEMPLATES_DIR = 'templates' +DB_CREATION_ASK = 'Database file not found. Create? Y/n\n' if __name__ == '__main__': try: + if not PATH_DB: + raise HandledException('PATH_DB not set.') + db_file = DatabaseFile(PATH_DB) + if not db_file.exists: + legal_yesses = {'y', 'yes', 'yes.', 'yes!'} + reply = input(DB_CREATION_ASK) + if reply.lower() in legal_yesses: + db_file.remake() + else: + print('Not recognizing reply as "yes".') + raise HandledException('Cannot run without database.') server = TaskServer(TEMPLATES_DIR, ('localhost', HTTP_PORT), TaskHandler) print(f'running at port {HTTP_PORT}') @@ -19,5 +34,5 @@ if __name__ == '__main__': print('aborting due to keyboard interrupt') server.server_close() except HandledException as e: - print(f'Aborting due to: {e}') + print(f'Aborting because: {e}') sys_exit(1) diff --git a/scripts/init.sql b/scripts/init.sql new file mode 100644 index 0000000..1aba8a4 --- /dev/null +++ b/scripts/init.sql @@ -0,0 +1,3 @@ +CREATE TABLE days ( + date TEXT PRIMARY KEY +); -- 2.30.2