From 9244d12b8b40402d057dad296cd1c2b20e22930c Mon Sep 17 00:00:00 2001 From: Enar Vaikene Date: Mon, 4 Jun 2012 10:06:36 +0300 Subject: [PATCH] Added 'suffix' option, which can be used to generate different password versions for the same application. --- src/apps/PswGen/Storage/istorage.h | 17 ++++++++++-- src/apps/PswGen/Storage/module.cpp | 42 +++++++++++++++++++++++------- src/apps/PswGen/Storage/module.h | 12 ++++++++- src/apps/PswGen/Storage/version.h | 6 ++--- 4 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/apps/PswGen/Storage/istorage.h b/src/apps/PswGen/Storage/istorage.h index 48226d0..e9abef9 100644 --- a/src/apps/PswGen/Storage/istorage.h +++ b/src/apps/PswGen/Storage/istorage.h @@ -3,7 +3,7 @@ * @brief Interface for password storage modules * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2012 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -43,14 +43,16 @@ public: : QSharedData() , mModified(false) , mName(name) + , mSuffix() , mLength(0) , mFlags(0) {} - Data(QString const & name, int l, uint f = 0) + Data(QString const & name, QString const & suffix, int l, uint f = 0) : QSharedData() , mModified(false) , mName(name) + , mSuffix(suffix) , mLength(l) , mFlags(f) {} @@ -58,6 +60,16 @@ public: /// Name of the password inline QString const & name() const { return mName; } + /// Optional suffix added to the name + inline QString const & suffix() const { return mSuffix; } + void setSuffix(QString const & suffix) + { + if (suffix != mSuffix) { + mSuffix = suffix; + mModified = true; + } + } + /// Length of the generated password inline int length() const { return mLength; } inline void setLength(int value) @@ -89,6 +101,7 @@ private: bool mModified; QString mName; + QString mSuffix; int mLength; uint mFlags; diff --git a/src/apps/PswGen/Storage/module.cpp b/src/apps/PswGen/Storage/module.cpp index b7676ab..12fda42 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 Enar Vaikene + * Copyright (c) 2011-2012 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -150,8 +150,8 @@ bool StorageImpl::save(QString const & name, QExplicitlySharedDataPointermodified()) { QSqlQuery q(mDb); - if (!q.exec(QString("UPDATE data SET length = \'%1\', flags = \'%2\' WHERE name = \'%3\';") - .arg(data->length()).arg(data->flags()).arg(name))) { + 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(); EVAF_ERROR("Failed to update \'%s\' : %s", qPrintable(name), qPrintable(err.text())); return false; @@ -161,8 +161,8 @@ bool StorageImpl::save(QString const & name, QExplicitlySharedDataPointerlength()) + if (!q.exec(QString("INSERT INTO data (name, suffix, length, flags) VALUES (\'%1\', \'%2\', %3, %4);") + .arg(name).arg(data->suffix()).arg(data->length()) .arg(int(data->flags())))) { QSqlError err = mDb.lastError(); EVAF_ERROR("Failed to insert \'%s\' : %s", qPrintable(name), qPrintable(err.text())); @@ -210,11 +210,13 @@ bool StorageImpl::createTables() return false; } - if (q.isActive() && q.isSelect() && q.first()) - return true; // We already have a table called 'data' + if (q.isActive() && q.isSelect() && q.first()) { + // Check if the table needs to be upgraded + return upgradeTables(); + } // Create the 'data' table - if (!q.exec("CREATE TABLE data (name text primary key not null, length integer, flags integer);")) { + if (!q.exec("CREATE TABLE data (name text primary key not null, suffix text, length integer, flags integer);")) { QSqlError err = mDb.lastError(); EVAF_ERROR("Failed to create table \'data\' : %s", qPrintable(err.text())); return false; @@ -223,10 +225,29 @@ bool StorageImpl::createTables() return true; } +bool StorageImpl::upgradeTables() +{ + QSqlQuery q(mDb); + + // Check if the 'suffix' column exists + if (q.exec("SELECT suffix from data;")) { + return true; + } + + // Add the 'suffix' columnt + if (!q.exec("ALTER TABLE data ADD COLUMN suffix TEXT;")) { + QSqlError err = mDb.lastError(); + EVAF_ERROR("Failed to upgrade table \'data\' : %s", qPrintable(err.text())); + return false; + } + + return true; +} + bool StorageImpl::loadData() { QSqlQuery q(mDb); - if (!q.exec("SELECT name, length, flags FROM data;")) { + if (!q.exec("SELECT name, suffix, length, flags FROM data;")) { QSqlError err = mDb.lastError(); EVAF_ERROR("Failed to query database : %s", qPrintable(err.text())); return false; @@ -234,7 +255,8 @@ bool StorageImpl::loadData() while (q.next()) { QString name = q.value(0).toString(); - QExplicitlySharedDataPointer data(new Storage::Data(name, q.value(1).toInt(), uint(q.value(2).toInt()))); + QExplicitlySharedDataPointer data( + new Storage::Data(name, q.value(1).toString(), q.value(2).toInt(), uint(q.value(3).toInt()))); mData.insert(name, data); } diff --git a/src/apps/PswGen/Storage/module.h b/src/apps/PswGen/Storage/module.h index 95b935f..7f53b26 100644 --- a/src/apps/PswGen/Storage/module.h +++ b/src/apps/PswGen/Storage/module.h @@ -3,7 +3,7 @@ * @brief Implementation of the iStorage interface * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2012 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -139,6 +139,16 @@ private: // Methods */ bool createTables(); + /** + * Upgrades database tables if necessary + * @return True if ok; false if failed + * + * This function checks if database tables need to upgraded and + * performs the upgrade without a loss of data if possible. + * Returns false if upgrade is not possible or fails. + */ + bool upgradeTables(); + /** * Loads data from the database * @return True if ok; false if failed diff --git a/src/apps/PswGen/Storage/version.h b/src/apps/PswGen/Storage/version.h index 2712b36..cbcf67f 100644 --- a/src/apps/PswGen/Storage/version.h +++ b/src/apps/PswGen/Storage/version.h @@ -3,7 +3,7 @@ * @brief Version information for eVaf modules * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2012 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -25,12 +25,12 @@ /** * Module/library version number in the form major,minor,release,build */ -#define VER_FILE_VERSION 0,1,2,2 +#define VER_FILE_VERSION 0,2,1,3 /** * Module/library version number in the string format (shall end with \0) */ -#define VER_FILE_VERSION_STR "0.1.2.2\0" +#define VER_FILE_VERSION_STR "0.2.1.3\0" /** * Module/library name (shall end with \0) -- 2.47.0