X-Git-Url: https://vaikene.ee/gitweb/pswgen11.html?a=blobdiff_plain;ds=inline;f=src%2Fapps%2FPswGen%2FStorage%2Fmodule.cpp;h=8e65360d2c8a29e323b090113a77e56a34565796;hb=HEAD;hp=12fda4213118132b30768af23720beb78cfbd5bd;hpb=19bb35ea710505eb1951108bb4c9461315ad77a7;p=evaf
diff --git a/src/apps/PswGen/Storage/module.cpp b/src/apps/PswGen/Storage/module.cpp
index 12fda42..8e65360 100644
--- a/src/apps/PswGen/Storage/module.cpp
+++ b/src/apps/PswGen/Storage/module.cpp
@@ -3,7 +3,7 @@
* @brief Implementation of the iStorage interface
* @author Enar Vaikene
*
- * Copyright (c) 2011-2012 Enar Vaikene
+ * Copyright (c) 2011-2019 Enar Vaikene
*
* This file is part of the eVaf C++ cross-platform application development framework.
*
@@ -18,7 +18,6 @@
*/
#include "module.h"
-#include "version.h"
#include
#include
@@ -27,9 +26,10 @@
#include
#include
+#include
+
VER_EXPORT_VERSION_INFO()
-Q_EXPORT_PLUGIN2(VER_MODULE_NAME_STR, eVaf::PswGen::Storage::Module)
using namespace eVaf;
using namespace eVaf::PswGen;
@@ -57,7 +57,7 @@ Module::~Module()
bool Module::init(QString const & args)
{
- Q_UNUSED(args);
+ Q_UNUSED(args)
if (!mStorage->init())
return false;
@@ -103,27 +103,29 @@ StorageImpl::~StorageImpl()
bool StorageImpl::init()
{
// Open the database
+ QSqlDatabase db;
if (!QSqlDatabase::contains(DbConnectionName)) {
// No database connection yet
- mDb = QSqlDatabase::addDatabase("QSQLITE", DbConnectionName);
- mDb.setDatabaseName(Common::iApp::instance()->dataRootDir() + DbName);
- if (!mDb.open()) {
- QSqlError err = mDb.lastError();
+ db = QSqlDatabase::addDatabase("QSQLITE", DbConnectionName);
+ EVAF_INFO("Added database %s", DbConnectionName);
+ db.setDatabaseName(Common::iApp::instance()->dataRootDir() + DbName);
+ if (!db.open()) {
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to open database : %s", qPrintable(err.text()));
return false;
}
}
else {
// Database connection already exists
- mDb = QSqlDatabase::database(DbConnectionName);
+ db = QSqlDatabase::database(DbConnectionName);
}
// Create tables if necessary
- if (!createTables())
+ if (!createTables(db))
return false;
// Load data
- if (!loadData())
+ if (!loadData(db))
return false;
/// Register our interface
@@ -137,22 +139,34 @@ bool StorageImpl::init()
void StorageImpl::done()
{
mData.clear();
+ if (QSqlDatabase::contains(DbConnectionName))
+ {
+ QSqlDatabase::removeDatabase(DbConnectionName);
+ EVAF_INFO("Removed database %s", DbConnectionName);
+ }
EVAF_INFO("%s finalized", qPrintable(objectName()));
}
bool StorageImpl::save(QString const & name, QExplicitlySharedDataPointer data)
{
- EVAF_TEST_X(data, "Data cannot be null");
- EVAF_TEST_X(!name.isEmpty(), "Name cannot be empty");
+ EVAF_TEST_X(data, "Data cannot be null")
+ EVAF_TEST_X(!name.isEmpty(), "Name cannot be empty")
+
+ if (!QSqlDatabase::contains(DbConnectionName))
+ {
+ EVAF_ERROR("Failed to get DB connection");
+ return false;
+ }
+ QSqlDatabase db = QSqlDatabase::database(DbConnectionName);
// Is it an update or a new data record?
if (mData.constFind(name) != mData.constEnd()) {
// This is an update
if (data->modified()) {
- QSqlQuery q(mDb);
+ QSqlQuery q(db);
if (!q.exec(QString("UPDATE data SET suffix = \'%1\', length = \'%2\', flags = \'%3\' WHERE name = \'%4\';")
.arg(data->suffix()).arg(data->length()).arg(data->flags()).arg(name))) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to update \'%s\' : %s", qPrintable(name), qPrintable(err.text()));
return false;
}
@@ -160,20 +174,20 @@ bool StorageImpl::save(QString const & name, QExplicitlySharedDataPointersuffix()).arg(data->length())
.arg(int(data->flags())))) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to insert \'%s\' : %s", qPrintable(name), qPrintable(err.text()));
return false;
}
// Store also into the local hash
+ beginResetModel();
mData.insert(name, data);
+ endResetModel();
- // Reset the model
- reset();
}
data->reset();
@@ -201,23 +215,23 @@ QVariant StorageImpl::data(QModelIndex const & index, int role) const
return QVariant();
}
-bool StorageImpl::createTables()
+bool StorageImpl::createTables(QSqlDatabase & db)
{
- QSqlQuery q(mDb);
+ QSqlQuery q(db);
if (!q.exec("SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'data\';")) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to query database : %s", qPrintable(err.text()));
return false;
}
if (q.isActive() && q.isSelect() && q.first()) {
// Check if the table needs to be upgraded
- return upgradeTables();
+ return upgradeTables(db);
}
// Create the 'data' table
if (!q.exec("CREATE TABLE data (name text primary key not null, suffix text, length integer, flags integer);")) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to create table \'data\' : %s", qPrintable(err.text()));
return false;
}
@@ -225,9 +239,9 @@ bool StorageImpl::createTables()
return true;
}
-bool StorageImpl::upgradeTables()
+bool StorageImpl::upgradeTables(QSqlDatabase & db)
{
- QSqlQuery q(mDb);
+ QSqlQuery q(db);
// Check if the 'suffix' column exists
if (q.exec("SELECT suffix from data;")) {
@@ -236,7 +250,7 @@ bool StorageImpl::upgradeTables()
// Add the 'suffix' columnt
if (!q.exec("ALTER TABLE data ADD COLUMN suffix TEXT;")) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to upgrade table \'data\' : %s", qPrintable(err.text()));
return false;
}
@@ -244,23 +258,23 @@ bool StorageImpl::upgradeTables()
return true;
}
-bool StorageImpl::loadData()
+bool StorageImpl::loadData(QSqlDatabase & db)
{
- QSqlQuery q(mDb);
+ QSqlQuery q(db);
if (!q.exec("SELECT name, suffix, length, flags FROM data;")) {
- QSqlError err = mDb.lastError();
+ QSqlError err = db.lastError();
EVAF_ERROR("Failed to query database : %s", qPrintable(err.text()));
return false;
}
+ beginResetModel();
while (q.next()) {
QString name = q.value(0).toString();
QExplicitlySharedDataPointer data(
new Storage::Data(name, q.value(1).toString(), q.value(2).toInt(), uint(q.value(3).toInt())));
mData.insert(name, data);
}
-
- reset();
+ endResetModel();
return true;
}