Update the post insert behaviour of the RtcomEventLogger backend to update storage...
[qwerkisync] / DBBackends / RtcomEventLogger.cpp
index c34a8df..0766fa2 100644 (file)
@@ -329,6 +329,10 @@ void RtcomEventLogger::Insert(EventTypes::iEvent &event, const NumberToNameLooku
 
 void RtcomEventLogger::PostInsert()
 {
+       // Our new events get the specified storage times ignored, and some things
+       // use these, so bodge them for now.
+       UpdateInsertedStorageTimes();
+
        // Reorder the DB IDs as Nokia are guilty of both premature
        // optimisation as well as closed source UIs...
        Reindex();
@@ -341,19 +345,59 @@ void RtcomEventLogger::ClearInsertedIDs()
        InsertedIDs().clear();
 }
 
-// Reorder the DB IDs as Nokia are guilty of both premature
-// optimisation as well as closed source UIs...
-void RtcomEventLogger::Reindex()
+void RtcomEventLogger::UpdateInsertedStorageTimes()
 {
        // Set up the database connection...
        QSqlDatabase db(QSqlDatabase::addDatabase("QSQLITE"));
 
        db.setDatabaseName(CurrentSettings().DBPath());
-       if(!db.open())
+       if(db.open())
        {
-               throw std::runtime_error("Cannot open database: Unable to establish database connection");
+               // Update storage time as some software uses it...
+               QSqlQuery * updateStorageTimeQuery(new QSqlQuery(db));
+               if(updateStorageTimeQuery != NULL)
+               {
+                       updateStorageTimeQuery->setForwardOnly( true );
+
+                       if(db.transaction())
+                       {
+                               try
+                               {
+                                       QString sqlUpdateStorageTime(QString("UPDATE events SET storage_time = start_time WHERE id IN (%1)")
+                                               .arg(IntsToStringList(InsertedIDs()).join(",")));
+                                       if (!updateStorageTimeQuery->exec(sqlUpdateStorageTime))
+                                       {
+                                               qDebug() << "Query Failed: " << sqlUpdateStorageTime;
+                                               throw std::exception();
+                                       }
+
+                                       qDebug() << "Committing.";
+                                       db.commit();
+                               }
+                               catch(...)
+                               {
+                                       qDebug() << "Rolling back.";
+                                       db.rollback();
+                               }
+                       }
+                       else
+                               qDebug() << "Unable to start transaction.";
+               }
        }
        else
+               throw std::runtime_error("Cannot open database: Unable to establish database connection");
+}
+
+// Reorder the DB IDs as Nokia are guilty of both premature
+// optimisation as well as closed source UIs...
+// NOTE: The InsertedID list will be invalid after this so call it last...
+void RtcomEventLogger::Reindex()
+{
+       // Set up the database connection...
+       QSqlDatabase db(QSqlDatabase::addDatabase("QSQLITE"));
+
+       db.setDatabaseName(CurrentSettings().DBPath());
+       if(db.open())
        {
                // Reorder the evnts by their start time
                uint changesRequired(0);
@@ -527,10 +571,23 @@ void RtcomEventLogger::Reindex()
                db.close();
                QSqlDatabase::removeDatabase( "QSQLITE" );
        }
+       else
+               throw std::runtime_error("Cannot open database: Unable to establish database connection");
 
        return;
 }
 
+QStringList RtcomEventLogger::IntsToStringList(QList<uint> &values)
+{
+       QStringList returnValues;
+       returnValues.reserve(values.count());
+
+       foreach(uint value, values)
+               returnValues.append(QString::number(value));
+
+       return returnValues;
+}
+
 QDebug operator<<(QDebug dbg, RTComElEvent &event)
 {
        dbg.nospace() << "\tid:\t\t" << event.fld_id << "\n";