activityfw/activityserviceplugin/win/src/activitydatabase_p.cpp
changeset 94 dbb8300717f7
parent 92 782e3408c2ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/activityfw/activityserviceplugin/win/src/activitydatabase_p.cpp	Fri May 14 17:24:44 2010 +0300
@@ -0,0 +1,249 @@
+/*
+* 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 "activitydatabase_p.h"
+
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QStringList>
+#include <QSettings>
+
+#include <hsactivitydbclient.h>
+
+const char KConnectionName[] = "ActivityDatabase";
+
+ActivityDatabasePrivate::ActivityDatabasePrivate()
+{
+    // determine database localization
+    QSettings settings("nokia", "activities");
+    if (!settings.contains("activitydatabase")) {
+        settings.setValue("activitydatabase", "C:\\activitydatabase.db");
+    }
+    QString databaseFile = settings.value("activitydatabase").toString();
+
+    QSqlDatabase database;
+    if (QSqlDatabase::contains(KConnectionName)) {
+        database = QSqlDatabase::database(KConnectionName);
+    } else {
+        database = QSqlDatabase::addDatabase("QSQLITE", KConnectionName);
+        database.setDatabaseName(databaseFile);
+        if (!database.open()) {
+            qFatal(qPrintable(database.lastError().text()));
+        }
+    }
+
+    if (!checkTables()) {
+        recreateTables();
+    }
+}
+
+ActivityDatabasePrivate::~ActivityDatabasePrivate()
+{
+    QSqlDatabase::database(KConnectionName).close();
+}
+
+void ActivityDatabasePrivate::saveActivity(const QString &applicationName, const QString &activityName, const QVariantHash &activityMetadata)
+{
+    if (applicationName.isEmpty() || activityName.isEmpty() || activityMetadata.value("screenshot").isNull()) {
+        qWarning("Activity entry is invalid, aborting save");
+        return;
+    }
+
+    QVariantHash activityData(activityMetadata);
+    activityData.insert(ActivityApplicationKeyword, applicationName);
+    activityData.insert(ActivityActivityKeyword, activityName);
+
+    // stream whole entry to bytearray
+    QByteArray streamedData;
+    {
+        QDataStream stream(&streamedData, QIODevice::WriteOnly);
+        stream << activityData;
+    }
+
+    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
+
+    if (!database.transaction()) {
+        qFatal(qPrintable(database.lastError().text()));
+    }
+
+    // update or insert data
+    {
+        QSqlQuery query(database);
+        if (!query.exec(QString("SELECT ApplicationName FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
+            qFatal(qPrintable(query.lastError().text()));
+        }
+
+        if (query.next()) {
+            if (!query.prepare("UPDATE Activities SET Data = :Data WHERE ApplicationName = :ApplicationName AND ActivityName = :ActivityName")) {
+                qFatal(qPrintable(query.lastError().text()));
+            }
+            query.bindValue(":Data", streamedData);
+            query.bindValue(":ApplicationName", applicationName);
+            query.bindValue(":ActivityName", activityName);
+            if (!query.exec()) {
+                qFatal(qPrintable(query.lastError().text()));
+            }
+        } else {
+            if (!query.prepare("INSERT INTO Activities(ApplicationName, ActivityName, Data) VALUES(:ApplicationName, :ActivityName, :Data)")) {
+                qFatal(qPrintable(query.lastError().text()));
+            }
+            query.bindValue(":ApplicationName", applicationName);
+            query.bindValue(":ActivityName", activityName);
+            query.bindValue(":Data", streamedData);
+            if (!query.exec()) {
+                qFatal(qPrintable(query.lastError().text()));
+            }
+        }
+    }
+
+    if (!database.commit()) {
+        qFatal(qPrintable(database.lastError().text()));
+    }
+}
+
+void ActivityDatabasePrivate::deleteActivity(const QString &applicationName, const QString &activityName)
+{
+    QString sqlCommand = QString("DELETE FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName);
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+    if (!query.exec(sqlCommand)) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+}
+
+void ActivityDatabasePrivate::deleteApplicationActivities(const QString &applicationName)
+{
+    QString sqlCommand = QString("DELETE FROM Activities WHERE ApplicationName = '%1'").arg(applicationName);
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+    if (!query.exec(sqlCommand)) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+}
+
+QList<QVariantHash> ActivityDatabasePrivate::allActivitiesList()
+{
+    return activitiesList("SELECT Data FROM Activities");
+}
+
+QList<QVariantHash> ActivityDatabasePrivate::applicationActivitiesList(const QString &applicationName)
+{
+    return activitiesList(QString("SELECT Data FROM Activities WHERE ApplicationName = '%1'").arg(applicationName));
+}
+
+QList<QVariantHash> ActivityDatabasePrivate::activitiesList(const QString &sqlCommand)
+{
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+    if (!query.exec(sqlCommand)) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+
+    QList<QVariantHash> result;
+    while (query.next()) {
+        QVariantHash activityEntry;
+        {
+            QByteArray data(query.value(0).toByteArray());
+            QDataStream stream(&data, QIODevice::ReadOnly);
+            stream >> activityEntry;
+        }
+        result.append(activityEntry);
+    }
+    return result;
+}
+
+QString ActivityDatabasePrivate::requestedActivityName(const QString &applicationName)
+{
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+    if (!query.exec(QString("SELECT ActivityName FROM Activities WHERE ApplicationName = '%1' AND RequestFlag").arg(applicationName))) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+
+    QString result;
+    if (query.next()) {
+        result = query.value(0).toString();
+    }
+    return result;
+}
+
+void ActivityDatabasePrivate::setActivityRequestFlag(const QString &applicationName, const QString &activityName)
+{
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+
+    // clear old requests for given application
+    if (!query.exec(QString("UPDATE Activities SET RequestFlag=0 WHERE ApplicationName = '%1'").arg(applicationName))) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+
+    // set new request
+    if (!query.exec(QString("UPDATE Activities SET RequestFlag=1 WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+}
+
+void ActivityDatabasePrivate::clearActivityRequestFlag(const QString &applicationName, const QString &activityName)
+{
+    QSqlQuery query(QSqlDatabase::database(KConnectionName));
+
+    // just clear the given request
+    if (!query.exec(QString("UPDATE Activities SET RequestFlag=0 WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
+        qFatal(qPrintable(query.lastError().text()));
+    }
+}
+
+bool ActivityDatabasePrivate::checkTables()
+{
+    QStringList expectedTables("Activities");
+    QStringList actualTables = QSqlDatabase::database(KConnectionName).tables();
+    return (expectedTables == actualTables);
+}
+
+void ActivityDatabasePrivate::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("
+            "ApplicationName TEXT NOT NULL,"
+            "ActivityName TEXT NOT NULL,"
+            "RequestFlag BOOL NOT NULL DEFAULT FALSE,"
+            "Data BLOB NOT NULL,"
+            "PRIMARY KEY(ActivityName, ApplicationName))");
+
+        if (!createQuery.exec(statement)) {
+            qFatal(qPrintable(createQuery.lastError().text()));
+        }
+    }
+
+    if (!database.commit()) {
+        qFatal(qPrintable(database.lastError().text()));
+    }
+}