From 5f21169afe2cf50ddffede8647d85ab033a72dcb Mon Sep 17 00:00:00 2001 From: lifegpc Date: Wed, 5 May 2021 21:17:48 +0800 Subject: [PATCH] remove config table and add version table --- database.py | 69 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/database.py b/database.py index b573dd8..c99205c 100644 --- a/database.py +++ b/database.py @@ -23,6 +23,16 @@ from hashl import sha256WithBase64 from time import time +VERSION_TABLE = '''CREATE TABLE version ( +id TEXT, +v1 INT, +v2 INT, +v3 INT, +v4 INT, +PRIMARY KEY (id) +);''' + + def dealtext(s: str): return s.replace("'", "''") @@ -35,41 +45,30 @@ class userStatus(Enum): class database: def __check_database(self): - cur = self._db.execute('SELECT * FROM main.sqlite_master;') - self._exist_tables = {} - for i in cur: - if i[0] == 'table': - self._exist_tables[i[1]] = i - for i in ['config', 'RSSList', 'chatList', 'userStatus', 'hashList']: - if i not in self._exist_tables: - return False + self.__updateExistsTable() v = self.__read_version() if v is None: return False if v < self._version: if v == [1, 0, 0, 0]: self._db.execute('ALTER TABLE RSSList ADD lasterrortime INT;') - self._db.commit() if v < [1, 0, 0, 2]: self._db.execute( 'ALTER TABLE RSSList ADD forceupdate BOOLEAN;') self._db.execute('UPDATE RSSList SET forceupdate=false;') - self._db.commit() if v < [1, 0, 0, 3]: self._db.execute('ALTER TABLE RSSList ADD errorcount INT;') self._db.execute('UPDATE RSSList SET errorcount=0;') - self._db.commit() + if v < [1, 0, 0, 4]: + self._db.execute('DROP TABLE config;') + self._db.execute(VERSION_TABLE) + self.__updateExistsTable() self.__write_version() return True def __create_table(self): - if 'config' not in self._exist_tables: - self._db.execute(f'''CREATE TABLE config ( -version1 INT, -version2 INT, -version3 INT, -version4 INT -);''') + if 'version' not in self._exist_tables: + self._db.execute(VERSION_TABLE) self.__write_version() if 'RSSList' not in self._exist_tables: self._db.execute(f'''CREATE TABLE RSSList ( @@ -106,7 +105,7 @@ PRIMARY KEY (hash) self._db.commit() def __init__(self, m, loc: str): - self._version = [1, 0, 0, 3] + self._version = [1, 0, 0, 4] self._value_lock = Lock() self._db = sqlite3.connect(loc, check_same_thread=False) ok = self.__check_database() @@ -115,6 +114,12 @@ PRIMARY KEY (hash) from rssbot import main self._main: main = m + def __isNewVersionType(self): + if 'version' in self._exist_tables: + return True + else: + return False + def __removeRSSEntry(self, id: str) -> bool: try: self._db.execute(f'DELETE FROM RSSList WHERE id="{id}"') @@ -125,15 +130,31 @@ PRIMARY KEY (hash) return False def __write_version(self): - self._db.execute('DELETE FROM config;') - self._db.execute( - f'INSERT INTO config VALUES ({self._version[0]}, {self._version[1]}, {self._version[2]}, {self._version[3]});') + if self.__read_version() is None: + self._db.execute('INSERT INTO version VALUES (?, ?, ?, ?, ?);', + tuple(['main'] + self._version)) + else: + self._db.execute( + "UPDATE version SET v1=?, v2=?, v3=?, v4=? WHERE id='main';", + tuple(self._version)) self._db.commit() def __read_version(self) -> List[int]: - cur = self._db.execute(f'SELECT * FROM config;') + if self.__isNewVersionType(): + cur = self._db.execute("SELECT * FROM version WHERE id='main';") + for i in cur: + return [k for k in i if isinstance(k, int)] + else: + cur = self._db.execute(f'SELECT * FROM config;') + for i in cur: + return [k for k in i] + + def __updateExistsTable(self): + cur = self._db.execute('SELECT * FROM main.sqlite_master;') + self._exist_tables = {} for i in cur: - return [k for k in i] + if i[0] == 'table': + self._exist_tables[i[1]] = i def addRSSList(self, title: str, url: str, chatId: int, config: RSSConfig, ttl: int = None, hashEntries: HashEntries = None): with self._value_lock: