*/
#include <QtCore/QDir>
+#include <QtCore/QDebug>
+#include <QtCore/QVariant>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include "db.h"
-#include <QDebug>
namespace
{
- const QString SQL_DRIVER = "QSQLITE";
- const QString SQL_DATABASE = ".jenirok.db";
+ const QString SQL_DRIVER = "QSQLITE";
+ const QString SQL_DATABASE = ".jenirok.db";
+ const int DB_VERSION = 2;
}
bool DB::initialized_ = false;
bool DB::connect()
{
- if(!initialized_)
- {
- db_ = QSqlDatabase::addDatabase(SQL_DRIVER);
- QString path = QDir::home().path() + QDir::separator() + SQL_DATABASE;
- db_.setDatabaseName(QDir::toNativeSeparators(path));
- }
-
- bool ret = db_.open();
-
- if(!ret)
- {
- QSqlError error = db_.lastError();
- qDebug() << error.text();
- }
-
- if(ret && !initialized_)
- {
- QSqlQuery query("SELECT value FROM settings WHERE name = 'initialized'");
-
- if(!query.next())
- {
- ret = createTables();
- }
- }
-
- if(!initialized_)
- {
- initialized_ = true;
- }
-
- return ret;
+ if(!initialized_)
+ {
+ db_ = QSqlDatabase::addDatabase(SQL_DRIVER);
+ QString path = QDir::home().path() + QDir::separator() + SQL_DATABASE;
+ db_.setDatabaseName(QDir::toNativeSeparators(path));
+ }
+
+ bool ret = db_.open();
+
+ if(!ret)
+ {
+ QSqlError error = db_.lastError();
+ qDebug() << error.text();
+ }
+
+ if(ret && !initialized_)
+ {
+ QSqlQuery query("SELECT value FROM settings WHERE name = 'db_version'");
+
+ if(query.next())
+ {
+ int currentVersion = query.value(0).toString().toInt();
+
+ if(currentVersion < DB_VERSION)
+ {
+ ret = createTables(true);
+ }
+ }
+ else
+ {
+ ret = createTables(false);
+ }
+ }
+
+ if(!initialized_)
+ {
+ initialized_ = true;
+ }
+
+ return ret;
}
void DB::disconnect()
{
- db_.close();
+ db_.close();
}
void DB::removeDatabase()
{
- db_.close();
- db_ = QSqlDatabase();
- QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);
- initialized_ = false;
+ if(!initialized_)
+ {
+ return;
+ }
+
+ db_.close();
+ db_ = QSqlDatabase();
+ QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);
+ initialized_ = false;
}
bool DB::connected()
{
- return db_.isOpen();
+ return db_.isOpen();
}
QSqlDatabase& DB::instance()
{
- return db_;
+ return db_;
}
-bool DB::createTables()
+bool DB::createTables(bool update)
{
- QSqlQuery query;
+ QSqlQuery query;
- bool ret = true;
+ bool ret = true;
- ret = ret && query.exec("CREATE TABLE cache (id INTEGER PRIMARY KEY, number VARCHAR(32) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL, street VARCHAR(255) NOT NULL, city VARCHAR(255) NOT NULL)");
- ret = ret && query.exec("CREATE TABLE settings (name VARCHAR(255) NOT NULL PRIMARY KEY, value VARCHAR(255) NOT NULL)");
- ret = ret && query.exec("INSERT INTO settings(name, value) VALUES('initialized', '1')");
+ ret = ret && query.exec("CREATE TABLE IF NOT EXISTS cache (id INTEGER PRIMARY KEY, number VARCHAR(32) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL, street VARCHAR(255) NOT NULL, city VARCHAR(255) NOT NULL)");
+ ret = ret && query.exec("CREATE TABLE IF NOT EXISTS settings (name VARCHAR(255) NOT NULL PRIMARY KEY, value VARCHAR(255) NOT NULL)");
+ ret = ret && query.exec("CREATE TABLE IF NOT EXISTS log (id INTEGER PRIMARY KEY, number VARCHAR(32) NOT NULL, name VARCHAR(255), street VARCHAR(255), city VARCHAR(255), country VARCHAR(255), time INTEGER NOT NULL, missed INTEGER NOT NULL)");
- return ret;
+ if(update)
+ {
+ ret = ret && query.exec("UPDATE settings SET value = '" + QString::number(DB_VERSION) + "' WHERE name = 'db_version'");
+ }
+ else
+ {
+ ret = ret && query.exec("INSERT INTO settings(name, value) VALUES('db_version', '" + QString::number(DB_VERSION) + "')");
+ }
+
+ return ret;
}