One more fix to connection handling.
[jenirok] / src / common / cache.cpp
index 56e37d0..5f9a165 100644 (file)
@@ -54,7 +54,8 @@ int Cache::clear()
 
     return ret;
 }
-bool Cache::findItem(QString const& number, Eniro::Result& result)
+
+bool Cache::findItem(QString const& number, Source::Result& result)
 {
     bool connected = DB::connected();
 
@@ -63,13 +64,14 @@ bool Cache::findItem(QString const& number, Eniro::Result& result)
         DB::connect();
     }
 
-    QSqlQuery query;
-    query.prepare("SELECT name, street, city FROM cache WHERE number = :number");
-    query.bindValue(":number", number);
+    QSqlQuery query("SELECT name, street, city FROM cache WHERE number LIKE '%" + number.right(7) + "'");
+
+    //query.prepare("SELECT name, street, city FROM cache WHERE number = :number");
+    //query.bindValue(":number", number);
 
     bool ret = false;
 
-    if(query.exec() && query.next())
+    if(query.next())
     {
         result.number = number;
         result.name = query.value(0).toString();
@@ -87,7 +89,7 @@ bool Cache::findItem(QString const& number, Eniro::Result& result)
     return ret;
 }
 
-bool Cache::addItem(Eniro::Result const& result)
+bool Cache::addItem(Source::Result const& result)
 {
     bool connected = DB::connected();
 
@@ -106,9 +108,12 @@ bool Cache::addItem(Eniro::Result const& result)
     query.bindValue(":street", result.street);
     query.bindValue(":city", result.city);
 
+    qDebug() << result.number << result.name << result.street << result.city;
+
 
     if(!query.exec())
     {
+        qDebug() << "Unable to add item to cache";
         ret = false;
     }
 
@@ -155,6 +160,134 @@ bool Cache::addItem(Eniro::Result const& result)
 
 }
 
+bool Cache::logItem(Source::Result const& result, bool missed, unsigned int time)
+{
+    bool connected = DB::connected();
+
+    if(!connected)
+    {
+        DB::connect();
+    }
+
+    bool ret = true;
+
+    QSqlQuery query;
+
+    query.prepare("INSERT INTO log(number, name, street, city, country, time, missed) VALUES(:number, :name, :street, :city, :country, :time, :missed)");
+    query.bindValue(":number", result.number);
+    query.bindValue(":name", result.name);
+    query.bindValue(":street", result.street);
+    query.bindValue(":city", result.city);
+    query.bindValue(":country", result.country);
+    query.bindValue(":time", time);
+    int misVal = missed ? 1 : 0;
+
+    query.bindValue(":missed", misVal);
+
+    if(!query.exec())
+    {
+        ret = false;
+    }
+
+    query.clear();
+
+    // Delete old entries from cache
+    if(LOG_MAX_SIZE > 0)
+    {
+        if(query.exec("SELECT COUNT(*) FROM log") && query.next())
+        {
+            int itemsToDelete = query.value(0).toInt() - LOG_MAX_SIZE;
+
+            for(int i = 0; i < itemsToDelete; i++)
+            {
+                query.clear();
+
+                if(!query.exec("DELETE FROM cache WHERE id = (SELECT MIN(id) FROM cache)"))
+                {
+                    QSqlError error = query.lastError();
+                    qDebug() << "Unable to delete old cache entries: " << error.text();
+                    ret = false;
+                }
+            }
+        }
+        else
+        {
+            QSqlError error = query.lastError();
+            qDebug() << "Unable to get count for cache entries: " << error.text();
+            ret = false;
+        }
+
+    }
+
+    if(!connected)
+    {
+        DB::disconnect();
+    }
+
+    return ret;
+
+}
+
+void Cache::getLogItems(QList<Cache::LogDetails>& items, int limit)
+{
+    bool connected = DB::connected();
+
+    if(!connected)
+    {
+        DB::connect();
+    }
+
+    QSqlQuery query("SELECT number, name, street, city, country, time, missed FROM log ORDER BY time DESC LIMIT " + QString::number(limit));
+
+    while(query.next())
+    {
+        LogDetails details;
+        details.result.number = query.value(0).toString();
+        details.result.name = query.value(1).toString();
+        details.result.street = query.value(2).toString();
+        details.result.city = query.value(3).toString();
+        details.result.country = query.value(4).toString();
+        details.time = query.value(5).toInt();
+
+        int missed = query.value(6).toInt();
+
+        details.missed = missed ? true : false;
+
+        items.push_back(details);
+    }
+
+    if(!connected)
+    {
+        DB::disconnect();
+    }
+
+}
+
+int Cache::clearLog()
+{
+    bool connected = DB::connected();
+
+    if(!connected)
+    {
+        DB::connect();
+    }
+
+    QSqlQuery query;
+    int ret = -1;
+
+    if(query.exec("DELETE FROM log"))
+    {
+        ret = query.numRowsAffected();
+    }
+
+    if(!connected)
+    {
+        DB::disconnect();
+    }
+
+    return ret;
+}
+
 Cache& Cache::instance()
 {
     if(!instance_)