--- /dev/null
+"""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)
#!/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}')
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)