rework database to use json string instead of dataclass dump. Prevents failed decodings, makes contents searchable, if needed
This commit is contained in:
@@ -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
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user