* @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.
*
: 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)
{}
/// 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)
bool mModified;
QString mName;
+ QString mSuffix;
int mLength;
uint mFlags;
* @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.
*
// This is an update
if (data->modified()) {
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;
else {
// Store to the database
QSqlQuery q(mDb);
- if (!q.exec(QString("INSERT INTO data (name, length, flags) VALUES (\'%1\', %2, %3);")
- .arg(name).arg(data->length())
+ 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()));
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;
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;
while (q.next()) {
QString name = q.value(0).toString();
- QExplicitlySharedDataPointer<Storage::Data> data(new Storage::Data(name, q.value(1).toInt(), uint(q.value(2).toInt())));
+ QExplicitlySharedDataPointer<Storage::Data> data(
+ new Storage::Data(name, q.value(1).toString(), q.value(2).toInt(), uint(q.value(3).toInt())));
mData.insert(name, data);
}
* @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.
*
/**
* 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)