From 6fd17fbdf5cb44867ccae8dacd058e0d3c97a651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Tue, 18 Mar 2025 14:46:08 +0100 Subject: [PATCH] Use only single database --- batchprocessing.cpp | 5 +++-- batchprocessing.h | 5 ++++- database.cpp | 17 ++++++++++++----- database.h | 3 ++- mainwindow.cpp | 2 +- scriptengine.cpp | 22 +++++++++++++--------- scriptengine.h | 6 +++--- 7 files changed, 38 insertions(+), 22 deletions(-) diff --git a/batchprocessing.cpp b/batchprocessing.cpp index 88044ef..3fd4747 100644 --- a/batchprocessing.cpp +++ b/batchprocessing.cpp @@ -67,7 +67,8 @@ void BatchProcessing::scanScriptDir() if(idx>=0)_ui->scriptsList->setCurrentRow(idx); } -BatchProcessing::BatchProcessing(QWidget *parent) : QDialog(parent) +BatchProcessing::BatchProcessing(Database *database, QWidget *parent) : QDialog(parent) + , _database(database) { _ui = new Ui::BatchProcessing; _ui->setupUi(this); @@ -200,7 +201,7 @@ void BatchProcessing::runScript() auto selectedItems = _ui->scriptsList->selectedItems(); if(selectedItems.size()) { - _engineThread = new Script::ScriptEngineThread(this); + _engineThread = new Script::ScriptEngineThread(_database, this); connect(_engineThread, &Script::ScriptEngineThread::newMessage, this, &BatchProcessing::newMessage); connect(_engineThread, &Script::ScriptEngineThread::finished, this, &BatchProcessing::scriptFinished); QStringList paths; diff --git a/batchprocessing.h b/batchprocessing.h index 55e5227..e1de9c3 100644 --- a/batchprocessing.h +++ b/batchprocessing.h @@ -7,6 +7,8 @@ namespace Ui { class BatchProcessing; } +class Database; + class BatchProcessing : public QDialog { Q_OBJECT @@ -15,10 +17,11 @@ class BatchProcessing : public QDialog QFileSystemWatcher _fileWatcher; Script::ScriptEngineThread *_engineThread = nullptr; QColor _textColor; + Database *_database; private slots: void scanScriptDir(); public: - explicit BatchProcessing(QWidget *parent = nullptr); + explicit BatchProcessing(Database *database, QWidget *parent = nullptr); ~BatchProcessing(); protected: void closeEvent(QCloseEvent *event); diff --git a/database.cpp b/database.cpp index 90d6089..99309d4 100644 --- a/database.cpp +++ b/database.cpp @@ -15,7 +15,7 @@ bool Database::init(const QLatin1String &connectionName) QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir dir(path); - QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", connectionName); + database = QSqlDatabase::addDatabase("QSQLITE", connectionName); if(!dir.mkpath(".")) return false; @@ -27,7 +27,7 @@ bool Database::init(const QLatin1String &connectionName) { QSqlQuery query(database); query.exec("PRAGMA foreign_keys = ON"); - int version = checkVersion(); + int version = checkVersion(database); if(version == 0) { query.exec("PRAGMA user_version = 1"); @@ -76,6 +76,14 @@ bool Database::init(const QLatin1String &connectionName) } qDebug() << error.text(); } + else + { + qDebug() << "Failed to open database" << connectionName; + } + } + else + { + qDebug() << "Database is invalid"; } return false; } @@ -146,10 +154,9 @@ bool Database::checkError(QSqlQuery &query) } } -int Database::checkVersion() +int Database::checkVersion(QSqlDatabase &db) { - QSqlDatabase db = QSqlDatabase::database(); - QSqlQuery query("PRAGMA user_version"); + QSqlQuery query("PRAGMA user_version", db); if(query.next()) return query.value(0).toInt(); return -1; diff --git a/database.h b/database.h index 4c6d682..ff4e435 100644 --- a/database.h +++ b/database.h @@ -10,6 +10,7 @@ class Database : public QObject { Q_OBJECT + QSqlDatabase database; QSqlQuery m_markQuery; QSqlQuery m_unmarkQuery; QSqlQuery m_isMarkedQuery; @@ -40,7 +41,7 @@ protected: bool indexDir2(const QDir &dir, QProgressDialog *progress, QStringList &scannedDirs); bool indexFile(const QFileInfo &file); bool checkError(QSqlQuery &query); - int checkVersion(); + int checkVersion(QSqlDatabase &db); signals: void databaseChanged(); }; diff --git a/mainwindow.cpp b/mainwindow.cpp index c8e8e6c..20954d7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -167,7 +167,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) fileMenu->addAction(tr("Reindex files"), this, SLOT(reindex())); fileMenu->addAction(tr("Export database to CSV"), this, &MainWindow::exportCSV); fileMenu->addAction(tr("Batch processing"), Qt::Key_B | Qt::CTRL, [this](){ - BatchProcessing *batchProcessing = new BatchProcessing(this); + BatchProcessing *batchProcessing = new BatchProcessing(m_database, this); batchProcessing->exec(); delete batchProcessing; }); diff --git a/scriptengine.cpp b/scriptengine.cpp index f7d9758..126bd9a 100644 --- a/scriptengine.cpp +++ b/scriptengine.cpp @@ -17,9 +17,9 @@ namespace Script { -ScriptEngine::ScriptEngine(BatchProcessing *parent) +ScriptEngine::ScriptEngine(Database *database, BatchProcessing *parent) : _jsEngine(new QJSEngine(this)) - , _database(new Database(this)) + , _database(database) , _parent(parent) , _pool(new QThreadPool(this)) { @@ -27,7 +27,6 @@ ScriptEngine::ScriptEngine(BatchProcessing *parent) _jsEngine->globalObject().setProperty("core", core); QJSValue fitsRecordObject = _jsEngine->newQMetaObject(&FITSRecordModify::staticMetaObject); _jsEngine->globalObject().setProperty("FITSRecordModify", fitsRecordObject); - _database->init(QLatin1String("scriptengine")); _semaphore.release(_pool->maxThreadCount()); _pool->setThreadPriority(QThread::LowPriority); @@ -73,17 +72,22 @@ void ScriptEngine::log(const QString &message) void ScriptEngine::mark(File *file) { - _database->mark(file->absoluteFilePath()); + QString path = file->absoluteFilePath(); + QMetaObject::invokeMethod(_database, [this, path](){ _database->mark(path); }, Qt::QueuedConnection); } void ScriptEngine::unmark(File *file) { - _database->unmark(file->absoluteFilePath()); + QString path = file->absoluteFilePath(); + QMetaObject::invokeMethod(_database, [this, path](){ _database->unmark(path); }, Qt::QueuedConnection); } -bool ScriptEngine::isMarked(const File *file) const +bool ScriptEngine::isMarked(const File *file) { - return _database->isMarked(file->absoluteFilePath()); + bool ret; + QString path = file->absoluteFilePath(); + QMetaObject::invokeMethod(_database, [this, path](){ _database->isMarked(path); }, Qt::BlockingQueuedConnection, &ret); + return ret; } void ScriptEngine::setMaxThread(int maxthread) @@ -765,11 +769,11 @@ QJSValue File::extractStars(bool hfr) } #endif // PLATESOLVER -ScriptEngineThread::ScriptEngineThread(BatchProcessing *parent) : QObject(parent) +ScriptEngineThread::ScriptEngineThread(Database *database, BatchProcessing *parent) : QObject(parent) { _thread = new QThread(); _thread->setObjectName("ScriptEngine"); - _engine = new ScriptEngine(parent); + _engine = new ScriptEngine(database, parent); _engine->moveToThread(_thread); connect(_engine, &ScriptEngine::finished, _thread, &QThread::quit); connect(_engine, &ScriptEngine::newMessage, this, &ScriptEngineThread::newMessage); diff --git a/scriptengine.h b/scriptengine.h index 57d94e0..145d188 100644 --- a/scriptengine.h +++ b/scriptengine.h @@ -31,7 +31,7 @@ class ScriptEngine : public QObject QList> _paths; Solver *_solver = nullptr; public: - explicit ScriptEngine(BatchProcessing *parent = nullptr); + explicit ScriptEngine(Database *database, BatchProcessing *parent = nullptr); void setParams(const QString &scriptPath, const QList> &paths, const QString &outputDir); void reportError(const QString &message); const QString& outputDir() const; @@ -40,7 +40,7 @@ public: Q_INVOKABLE void log(const QString &message); Q_INVOKABLE void mark(File *file); Q_INVOKABLE void unmark(File *file); - Q_INVOKABLE bool isMarked(const File *file) const; + Q_INVOKABLE bool isMarked(const File *file); Q_INVOKABLE void setMaxThread(int maxthread); Q_INVOKABLE void sync(); Q_INVOKABLE QJSValue getString(const QString &label = QString(), const QString &text = QString()) const; @@ -71,7 +71,7 @@ class ScriptEngineThread : public QObject QThread *_thread; ScriptEngine *_engine; public: - ScriptEngineThread(BatchProcessing *parent = nullptr); + ScriptEngineThread(Database *database, BatchProcessing *parent = nullptr); ~ScriptEngineThread(); void setParams(const QString &scriptPath, const QList> &paths, const QString &outputDir); void start();