Added resilience against file database corruption/deletion on error_tolerance > 1

This commit is contained in:
Frisk 2022-01-06 15:36:53 +01:00
parent 977894036a
commit 71b7188d97
No known key found for this signature in database
GPG key ID: 213F7C15068AF8AC
2 changed files with 30 additions and 3 deletions

View file

@ -20,6 +20,26 @@ from src.configloader import settings
logger = logging.getLogger("rcgcdw.fileio.database")
def catch_db_OperationalError(func):
def catcher(*args, **kwargs):
global db_connection, db_cursor
try:
func(*args, **kwargs)
except sqlite3.OperationalError:
if settings.get("error_tolerance", 0) > 1:
logger.error("SQL database has been damaged during operation. This can indicate it has been deleted "
"during runtime or damaged in some way. If it wasn't purposeful you may want to take a look "
"at your disk state. In the meantime, RcGcDw will attempt to recover by re-creating empty database.")
db_connection, db_cursor = create_connection()
check_tables()
func(*args, **kwargs)
else:
raise
return func
return catcher
def create_schema():
"""Creates a SQLite database schema"""
logger.info("Creating database schema...")
@ -59,6 +79,7 @@ def check_tables():
create_schema()
@catch_db_OperationalError
def add_entry(pageid: int, revid: int, logid: int, message, message_id: str):
"""Add an edit or log entry to the DB
:param message:
@ -68,21 +89,27 @@ def add_entry(pageid: int, revid: int, logid: int, message, message_id: str):
:param message_id:
"""
db_cursor.execute("INSERT INTO messages (message_id, content) VALUES (?, ?)", (message_id, message))
db_cursor.execute("INSERT INTO event (pageid, revid, logid, msg_id) VALUES (?, ?, ?, ?)", (pageid, revid, logid, message_id))
logger.debug("Adding an entry to the database (pageid: {}, revid: {}, logid: {}, message: {})".format(pageid, revid, logid, message))
db_cursor.execute("INSERT INTO event (pageid, revid, logid, msg_id) VALUES (?, ?, ?, ?)",
(pageid, revid, logid, message_id))
logger.debug(
"Adding an entry to the database (pageid: {}, revid: {}, logid: {}, message: {})".format(pageid, revid, logid,
message))
db_connection.commit()
@catch_db_OperationalError
def clean_entries():
"""Cleans entries that are 50+"""
cleanup = db_cursor.execute(
"SELECT message_id FROM messages WHERE message_id NOT IN (SELECT message_id FROM messages ORDER BY message_id desc LIMIT 50);")
for row in cleanup:
db_cursor.execute("DELETE FROM messages WHERE message_id = ?", (row[0],))
cleanup = db_cursor.execute("SELECT msg_id FROM event WHERE msg_id NOT IN (SELECT msg_id FROM event ORDER BY msg_id desc LIMIT 50);")
cleanup = db_cursor.execute(
"SELECT msg_id FROM event WHERE msg_id NOT IN (SELECT msg_id FROM event ORDER BY msg_id desc LIMIT 50);")
for row in cleanup:
db_cursor.execute("DELETE FROM event WHERE msg_id = ?", (row[0],))
db_connection.commit()
db_connection, db_cursor = create_connection()
check_tables()

View file