Some fixes to connection manager.
[jenirok] / src / common / db.cpp
index e5ce316..fd12f34 100644 (file)
  */
 
 #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;
@@ -33,71 +35,94 @@ QSqlDatabase DB::db_;
 
 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;
 }