home · contact · privacy
Add creation, validation, setting of rump database file.
authorChristian Heller <c.heller@plomlompom.de>
Sun, 17 Mar 2024 02:15:55 +0000 (03:15 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sun, 17 Mar 2024 02:15:55 +0000 (03:15 +0100)
plomtask/db.py [new file with mode: 0644]
run.py
scripts/init.sql [new file with mode: 0644]

diff --git a/plomtask/db.py b/plomtask/db.py
new file mode 100644 (file)
index 0000000..a8bdbec
--- /dev/null
@@ -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 d94905dc69bc97379567fb3f79d5f7288c7bbc57..e0cdd8b8150dfbc0d8d54447a308ef79f6795037 100755 (executable)
--- 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 (file)
index 0000000..1aba8a4
--- /dev/null
@@ -0,0 +1,3 @@
+CREATE TABLE days (
+    date TEXT PRIMARY KEY
+);