From ba5e00b24bb7671507dde16a66d2ae7f6f9ed093 Mon Sep 17 00:00:00 2001 From: matteo porta Date: Wed, 12 Oct 2022 10:49:18 +0200 Subject: [PATCH] fix db locked error --- src/components/archive_synchronizer.py | 1 - src/test/tdb.py | 87 ++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/test/tdb.py diff --git a/src/components/archive_synchronizer.py b/src/components/archive_synchronizer.py index bb9bb2a..d56512e 100644 --- a/src/components/archive_synchronizer.py +++ b/src/components/archive_synchronizer.py @@ -36,7 +36,6 @@ class ArchiveSynchronizer(Component): self.gcs_bucket = None @db.connection_context() - @db.atomic() def _get(self): for record in Archive.select().where((Archive.archived != True) | (Archive.uploaded != True)): # using "is not True" breaks the query. if not self.simulate: diff --git a/src/test/tdb.py b/src/test/tdb.py new file mode 100644 index 0000000..5e4b773 --- /dev/null +++ b/src/test/tdb.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +import faulthandler +import signal +import sys +from uuid import uuid4 as uuid + +from peewee import AutoField, Model, TextField +from playhouse.sqlite_ext import SqliteExtDatabase +from PyQt5.QtCore import QObject, QThread, QTimer + +# SETUP QUITTING ON CTRL+C +signal.signal(signal.SIGINT, quit) + +# SETUP FAULTHANDLER +faulthandler.enable(file=sys.stderr, all_threads=True) + + +db = SqliteExtDatabase( + "/tmp/tdb.sqlite3", + pragmas={ # see https://www.sqlite.org/pragma.html + "auto_vacuum": 1, + "busy_timeout": 5000, + "cache_size": round(-64e3), + "foreign_keys": 1, + "ignore_check_constraints": 0, + "journal_mode": "wal", + "synchronous": 0, + }, + timeout=5 +) + + +class BaseModel(Model): + """A base model that will use our Sqlite database.""" + + class Meta: + global db + database = db + + +class Data(BaseModel): + id = AutoField(primary_key=True, unique=True, null=False) + data = TextField(null=True, default=lambda: uuid().hex) + + +models_reference = { + "data": Data, +} + +db.connect() +db.create_tables(list(models_reference.values())) + + +class Threaded(QObject): + def __init__(self): + super().__init__() + self._timer = QTimer() + + @db.connection_context() + # @db.atomic() + def start(self): + while True: + data = Data() + data.save() + print(str(int(QThread.currentThreadId())), data.id, flush=True) + # QThread.msleep(2000) + + +components = {1: Threaded()} +threads = {} +for component_name in components: + threads[component_name] = QThread() + threads[component_name].setTerminationEnabled(True) + components[component_name].moveToThread(threads[component_name]) +for component_name, thread in threads.items(): + component = components[component_name] + thread.started.connect(component.start) + thread.start() + if "--debugger-workaround" in sys.argv: + QApplication.processEvents() + # QThread.msleep(1000) + QApplication.processEvents() +while True: + data = Data() + data.save() + print("main", data.id, flush=True) + # QThread.msleep(2000)