activityfw/activityserviceplugin/activitydatastorage.cpp
changeset 61 8e5041d13c84
child 66 32469d7d46ff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/activityfw/activityserviceplugin/activitydatastorage.cpp	Fri Apr 16 15:16:09 2010 +0300
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include "activitydatastorage.h"
+
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QStringList>
+
+const char KConnectionName[] = "ActivityDataStorage";
+
+ActivityDataStorage::ActivityDataStorage()
+{
+    QSqlDatabase database;
+    if (QSqlDatabase::contains(KConnectionName)) {
+        database = QSqlDatabase::database(KConnectionName);
+    } else {   
+        database = QSqlDatabase::addDatabase("QSQLITE", KConnectionName);
+        database.setDatabaseName("activitydatastorage.db");    
+        if (!database.open()) {
+            qFatal(qPrintable(database.lastError().text()));
+        }
+    }
+
+    if (!checkTables()) {
+        recreateTables();
+    }
+}
+
+ActivityDataStorage::~ActivityDataStorage()
+{
+    QSqlDatabase::database(KConnectionName).close();
+}
+
+bool ActivityDataStorage::addActivity(const QString &activityId, const QVariant &data)
+{
+    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
+    
+    QByteArray streamedData;
+    {
+        QDataStream stream(&streamedData, QIODevice::WriteOnly);
+        stream << data;
+    }    
+    
+    // insert data
+    QSqlQuery query(database);
+    if (!query.prepare("INSERT INTO Activities(Name, Data) VALUES(:Name, :Data)")) {
+        qCritical(qPrintable(query.lastError().text()));
+        return false;
+    }
+    query.bindValue(":Name", activityId);
+    query.bindValue(":Data", streamedData);
+    if (!query.exec()) {
+        qCritical(qPrintable(query.lastError().text()));
+        return false;
+    }        
+    
+    return true;
+}
+
+bool ActivityDataStorage::removeActivity(const QString &activityId)
+{
+    QString sqlCommand = QString("DELETE FROM Activities WHERE Name = '%1'").arg(activityId);
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+    if (!query.exec(sqlCommand)) {
+        qCritical(qPrintable(query.lastError().text()));
+        return false;
+    }
+    return query.numRowsAffected() > 0;
+}
+
+bool ActivityDataStorage::updateActivity(const QString &activityId, const QVariant &data)
+{
+    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
+    
+    QByteArray streamedData;
+    {
+        QDataStream stream(&streamedData, QIODevice::WriteOnly);
+        stream << data;
+    }    
+    
+    // update data
+    QSqlQuery query(database);
+    if (!query.prepare("UPDATE Activities SET Data = :Data WHERE Name = :Name")) {
+        qCritical(qPrintable(query.lastError().text()));
+        return false;
+    }
+    query.bindValue(":Data", streamedData);
+    query.bindValue(":Name", activityId);
+    if (!query.exec()) {
+        qCritical(qPrintable(query.lastError().text()));
+        return false;
+    }
+    
+    return query.numRowsAffected() > 0;
+}
+
+QVariant ActivityDataStorage::activityData(const QString &activityId) const
+{
+    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
+    QSqlQuery query(database);
+    if (!query.exec(QString("SELECT Data FROM Activities WHERE Name = '%1'").arg(activityId))) {
+        qCritical(qPrintable(query.lastError().text()));
+        return QVariant();
+    }
+    
+    QVariant result;
+    if (query.next()) {
+        QByteArray data(query.value(0).toByteArray());
+        QDataStream stream(&data, QIODevice::ReadOnly);
+        stream >> result;
+    }   
+    return result;
+}
+
+bool ActivityDataStorage::checkTables()
+{
+    QStringList expectedTables("Activities");
+    QStringList actualTables = QSqlDatabase::database(KConnectionName).tables();
+    return (expectedTables == actualTables);    
+}
+
+void ActivityDataStorage::recreateTables()
+{
+    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
+    
+    if (!database.transaction()) {
+        qFatal(qPrintable(database.lastError().text()));
+    }
+    
+    // drop any existing tables
+    {
+        QSqlQuery dropQuery(database);
+        foreach(const QString &tableName, database.tables()) {
+            if (!dropQuery.exec(QString("DROP TABLE %1").arg(tableName))) {
+                qFatal(qPrintable(dropQuery.lastError().text()));
+            }
+        }
+    }
+
+    // create new table
+    {
+        QSqlQuery createQuery(database);
+        QString statement(
+            "CREATE TABLE Activities("
+            "Name TEXT NOT NULL PRIMARY KEY UNIQUE,"
+            "Data BLOB NOT NULL)");    
+        
+        if (!createQuery.exec(statement)) {
+            qFatal(qPrintable(createQuery.lastError().text()));
+        }
+    }
+    
+    if (!database.commit()) {
+        qFatal(qPrintable(database.lastError().text()));
+    }    
+}