From e458127fb5de663bf6f3d48706509a690a34128b Mon Sep 17 00:00:00 2001 From: jesopo Date: Thu, 19 Dec 2019 13:56:11 +0000 Subject: move --database/data-dir/log-dir to bot.conf, do some work for diff db engines --- src/DatabaseEngines.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/DatabaseEngines.py (limited to 'src/DatabaseEngines.py') diff --git a/src/DatabaseEngines.py b/src/DatabaseEngines.py new file mode 100644 index 00000000..165e64d5 --- /dev/null +++ b/src/DatabaseEngines.py @@ -0,0 +1,64 @@ +import dataclasses, typing +import sqlite3 + +class DatabaseEngineCursor(object): + def execute(self, query: str, args: typing.List[str]): + pass + def fetchone(self) -> typing.Any: + pass + def fetchall(self) -> typing.List[typing.Any]: + pass + +class DatabaseEngine(object): + def config(self, hostname: str=None, port: int=None, path: str=None, + username: str=None, password: str=None): + self.hostname = hostname + self.port = port + self.path = path + self.username = username + self.password = password + + def database_name(self): + return self.path + def connect(self): + pass + def cursor(self) -> DatabaseEngineCursor: + pass + def has_table(self, name: str): + pass + + def execute(self, query: str, args: typing.List[str]): + pass + def fetchone(self, query: str, args: typing.List[str]): + pass + def fetchall(self, query: str, args: typing.List[str]): + pass + +class SQLite3Cursor(DatabaseEngineCursor): + def __init__(self, cursor: sqlite3.Cursor): + self._cursor = cursor + def execute(self, query: str, args: typing.List[str]): + self._cursor.execute(query, args) + def fetchone(self): + return self._cursor.fetchone() + def fetchall(self): + return self._cursor.fetchall() +class SQLite3Engine(DatabaseEngine): + _connection: sqlite3.Connection + + def connect(self): + sqlite3.register_converter("BOOLEAN", lambda v: bool(int(v))) + self._connection = sqlite3.connect(self.path, + check_same_thread=False, isolation_level=None, + detect_types=sqlite3.PARSE_DECLTYPES) + self._connection.execute("PRAGMA foreign_keys = ON") + + def has_table(self, name: str): + cursor = self.cursor() + cursor.execute( + "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=?", + [name]) + return cursor.fetchone()[0] == 1 + + def cursor(self): + return SQLite3Cursor(self._connection.cursor()) -- cgit v1.3.1-10-gc9f91