From 99b9f50784dfca56ef0a9576d61ac81dc3e45834 Mon Sep 17 00:00:00 2001 From: WorldTeacher Date: Tue, 13 May 2025 11:37:25 +0200 Subject: [PATCH] rework database to use json string instead of dataclass dump. Prevents failed decodings, makes contents searchable, if needed --- src/backend/database.py | 42 ++++++++++++++++++++++++++--------------- src/backend/db.py | 2 +- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/backend/database.py b/src/backend/database.py index 432cb0d..c5b79fb 100644 --- a/src/backend/database.py +++ b/src/backend/database.py @@ -5,7 +5,8 @@ from pathlib import Path from src import settings from typing import Any, List, Optional, Tuple, Union import datetime - +import json +from dataclasses import asdict from src.backend.db import ( CREATE_ELSA_FILES_TABLE, CREATE_ELSA_MEDIA_TABLE, @@ -21,7 +22,6 @@ from src.backend.db import ( from src.errors import AppPresentError, NoResultError from src.logic import ApparatData, BookData, Prof, Apparat, ELSA from src.logic.constants import SEMAP_MEDIA_ACCOUNTS -from src.utils import create_blob, dump_pickle, load_pickle from .semester import Semester from string import ascii_lowercase as lower, digits, punctuation import sys @@ -29,7 +29,7 @@ from loguru import logger as log logger = log logger.remove() -logger.add("logs/application.log", rotation="1 week", enqueue=True) +logger.add("logs/application.log", rotation="1 week", retention="1 month", enqueue=True) log.add( "logs/database.log", ) @@ -230,19 +230,23 @@ class Database: logger.debug(t_query) # # logger.debug(t_query) result = cursor.execute(t_query).fetchall() - result = [load_pickle(i[0]) for i in result] + result = [BookData().from_string(i[0]) for i in result] if bookdata in result: # logger.debug("Bookdata already in database") # check if the book was deleted in the apparat query = ( "SELECT deleted FROM media WHERE app_id=? AND prof_id=? AND bookdata=?" ) - params = (app_id, prof_id, dump_pickle(bookdata)) + params = (app_id, prof_id, json.dumps(asdict(bookdata), ensure_ascii=False)) result = cursor.execute(query, params).fetchone() if result[0] == 1: # logger.debug("Book was deleted, updating bookdata") query = "UPDATE media SET deleted=0 WHERE app_id=? AND prof_id=? AND bookdata=?" - params = (app_id, prof_id, dump_pickle(bookdata)) + params = ( + app_id, + prof_id, + json.dumps(asdict(bookdata), ensure_ascii=False), + ) cursor.execute(query, params) conn.commit() return @@ -250,7 +254,7 @@ class Database: query = ( "INSERT INTO media (bookdata, app_id, prof_id,deleted) VALUES (?, ?, ?,?)" ) - converted = dump_pickle(bookdata) + converted = json.dumps(asdict(bookdata), ensure_ascii=False) params = (converted, app_id, prof_id, 0) cursor.execute(query, params) logMessage = f"Added book with signature {bookdata.signature} to database, data: {converted}" @@ -276,7 +280,7 @@ class Database: "SELECT bookdata, id FROM media WHERE app_id=? AND prof_id=?", (app_id, prof_id), ) - books = [(load_pickle(i[0]), i[1]) for i in result] + books = [(BookData().from_string(i[0]), i[1]) for i in result] book = [i for i in books if i[0].signature == signature][0][1] return book @@ -297,7 +301,7 @@ class Database: result = self.query_db( "SELECT bookdata FROM media WHERE app_id=? AND prof_id=?", (app_id, prof_id) ) - books: list[BookData] = [load_pickle(i[0]) for i in result] + books: list[BookData] = [BookData().from_string(i[0]) for i in result] book = [i for i in books if i.signature == signature][0] return book @@ -336,7 +340,7 @@ class Database: return None ret = [] for book in rdata: - bookdata = load_pickle(book[1]) + bookdata = BookData().from_string(book[1]) app_id = book[2] prof_id = book[3] if mode == 1: @@ -395,14 +399,14 @@ class Database: Returns: BookData: The metadata of the book wrapped in a BookData object """ - return load_pickle( + return BookData().from_string( self.query_db( "SELECT bookdata FROM media WHERE id=?", (book_id,), one=True )[0] ) def getBooks( - self, app_id: Union[str, int], prof_id: Union[str, int], deleted=0 + self, app_id: Union[str, int], prof_id: Union[str, int], deleted: int = 0 ) -> list[dict[str, Union[BookData, int]]]: """ Get the Books based on the apparat id and the professor id @@ -424,7 +428,7 @@ class Database: for result_a in qdata: data: dict[str, Any] = {"id": int, "bookdata": BookData, "available": int} data["id"] = result_a[0] - data["bookdata"] = load_pickle(result_a[1]) + data["bookdata"] = BookData().from_string(result_a[1]) data["available"] = result_a[2] ret_result.append(data) return ret_result @@ -438,10 +442,10 @@ class Database: bookdata (BookData): The new metadata of the book """ query = "UPDATE media SET bookdata= ? WHERE id=?" - book = dump_pickle(bookdata) + book = bookdata.to_dict self.query_db(query, (book, book_id)) - def deleteBook(self, book_id): + def deleteBook(self, book_id: int): """ Delete a book from the database @@ -1656,3 +1660,11 @@ class Database: return data[0][0] else: return None + + def fetch_one(self, query: str, args: tuple[Any, ...] = ()) -> tuple[Any, ...]: + connection = self.connect() + cursor = connection.cursor() + cursor.execute(query, args) + result = cursor.fetchone() + connection.close() + return result \ No newline at end of file diff --git a/src/backend/db.py b/src/backend/db.py index 5416b90..0ee03fb 100644 --- a/src/backend/db.py +++ b/src/backend/db.py @@ -17,7 +17,7 @@ CREATE_TABLE_APPARAT = """CREATE TABLE semesterapparat ( )""" CREATE_TABLE_MEDIA = """CREATE TABLE media ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - bookdata BLOB, + bookdata TEXT, app_id INTEGER, prof_id INTEGER, deleted INTEGER DEFAULT (0),