activityfw/activityserviceplugin/src/activitydatastorage.cpp
author hgs
Fri, 14 May 2010 17:24:44 +0300
changeset 94 dbb8300717f7
parent 92 activityfw/activityserviceplugin/activitydatastorage.cpp@782e3408c2ab
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
89
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
92
hgs
parents: 90
diff changeset
    14
* Description:
89
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include "activitydatastorage.h"
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <QSqlDatabase>
hgs
parents:
diff changeset
    20
#include <QSqlQuery>
hgs
parents:
diff changeset
    21
#include <QSqlError>
hgs
parents:
diff changeset
    22
#include <QStringList>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const char KConnectionName[] = "ActivityDataStorage";
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
ActivityDataStorage::ActivityDataStorage()
hgs
parents:
diff changeset
    27
{
hgs
parents:
diff changeset
    28
    QSqlDatabase database;
hgs
parents:
diff changeset
    29
    if (QSqlDatabase::contains(KConnectionName)) {
hgs
parents:
diff changeset
    30
        database = QSqlDatabase::database(KConnectionName);
92
hgs
parents: 90
diff changeset
    31
    } else {
89
hgs
parents:
diff changeset
    32
        database = QSqlDatabase::addDatabase("QSQLITE", KConnectionName);
92
hgs
parents: 90
diff changeset
    33
        database.setDatabaseName("activitydatastorage.db");
89
hgs
parents:
diff changeset
    34
        if (!database.open()) {
hgs
parents:
diff changeset
    35
            qFatal(qPrintable(database.lastError().text()));
hgs
parents:
diff changeset
    36
        }
hgs
parents:
diff changeset
    37
    }
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
    if (!checkTables()) {
hgs
parents:
diff changeset
    40
        recreateTables();
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
ActivityDataStorage::~ActivityDataStorage()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    QSqlDatabase::database(KConnectionName).close();
hgs
parents:
diff changeset
    47
}
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
bool ActivityDataStorage::addActivity(const QString &activityId, const QVariant &data)
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
92
hgs
parents: 90
diff changeset
    52
89
hgs
parents:
diff changeset
    53
    QByteArray streamedData;
hgs
parents:
diff changeset
    54
    {
hgs
parents:
diff changeset
    55
        QDataStream stream(&streamedData, QIODevice::WriteOnly);
hgs
parents:
diff changeset
    56
        stream << data;
92
hgs
parents: 90
diff changeset
    57
    }
hgs
parents: 90
diff changeset
    58
89
hgs
parents:
diff changeset
    59
    // insert data
hgs
parents:
diff changeset
    60
    QSqlQuery query(database);
hgs
parents:
diff changeset
    61
    if (!query.prepare("INSERT INTO Activities(Name, Data) VALUES(:Name, :Data)")) {
hgs
parents:
diff changeset
    62
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
    63
        return false;
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
    query.bindValue(":Name", activityId);
hgs
parents:
diff changeset
    66
    query.bindValue(":Data", streamedData);
hgs
parents:
diff changeset
    67
    if (!query.exec()) {
hgs
parents:
diff changeset
    68
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
    69
        return false;
92
hgs
parents: 90
diff changeset
    70
    }
hgs
parents: 90
diff changeset
    71
89
hgs
parents:
diff changeset
    72
    return true;
hgs
parents:
diff changeset
    73
}
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
bool ActivityDataStorage::removeActivity(const QString &activityId)
hgs
parents:
diff changeset
    76
{
hgs
parents:
diff changeset
    77
    QString sqlCommand = QString("DELETE FROM Activities WHERE Name = '%1'").arg(activityId);
hgs
parents:
diff changeset
    78
    QSqlQuery query(QSqlDatabase::database(KConnectionName));
hgs
parents:
diff changeset
    79
    if (!query.exec(sqlCommand)) {
hgs
parents:
diff changeset
    80
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
    81
        return false;
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
    return query.numRowsAffected() > 0;
hgs
parents:
diff changeset
    84
}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
bool ActivityDataStorage::updateActivity(const QString &activityId, const QVariant &data)
hgs
parents:
diff changeset
    87
{
hgs
parents:
diff changeset
    88
    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
92
hgs
parents: 90
diff changeset
    89
89
hgs
parents:
diff changeset
    90
    QByteArray streamedData;
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
        QDataStream stream(&streamedData, QIODevice::WriteOnly);
hgs
parents:
diff changeset
    93
        stream << data;
92
hgs
parents: 90
diff changeset
    94
    }
hgs
parents: 90
diff changeset
    95
89
hgs
parents:
diff changeset
    96
    // update data
hgs
parents:
diff changeset
    97
    QSqlQuery query(database);
hgs
parents:
diff changeset
    98
    if (!query.prepare("UPDATE Activities SET Data = :Data WHERE Name = :Name")) {
hgs
parents:
diff changeset
    99
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
   100
        return false;
hgs
parents:
diff changeset
   101
    }
hgs
parents:
diff changeset
   102
    query.bindValue(":Data", streamedData);
hgs
parents:
diff changeset
   103
    query.bindValue(":Name", activityId);
hgs
parents:
diff changeset
   104
    if (!query.exec()) {
hgs
parents:
diff changeset
   105
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
   106
        return false;
hgs
parents:
diff changeset
   107
    }
92
hgs
parents: 90
diff changeset
   108
89
hgs
parents:
diff changeset
   109
    return query.numRowsAffected() > 0;
hgs
parents:
diff changeset
   110
}
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
QVariant ActivityDataStorage::activityData(const QString &activityId) const
hgs
parents:
diff changeset
   113
{
hgs
parents:
diff changeset
   114
    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
hgs
parents:
diff changeset
   115
    QSqlQuery query(database);
hgs
parents:
diff changeset
   116
    if (!query.exec(QString("SELECT Data FROM Activities WHERE Name = '%1'").arg(activityId))) {
hgs
parents:
diff changeset
   117
        qCritical(qPrintable(query.lastError().text()));
hgs
parents:
diff changeset
   118
        return QVariant();
hgs
parents:
diff changeset
   119
    }
92
hgs
parents: 90
diff changeset
   120
89
hgs
parents:
diff changeset
   121
    QVariant result;
hgs
parents:
diff changeset
   122
    if (query.next()) {
hgs
parents:
diff changeset
   123
        QByteArray data(query.value(0).toByteArray());
hgs
parents:
diff changeset
   124
        QDataStream stream(&data, QIODevice::ReadOnly);
hgs
parents:
diff changeset
   125
        stream >> result;
92
hgs
parents: 90
diff changeset
   126
    }
89
hgs
parents:
diff changeset
   127
    return result;
hgs
parents:
diff changeset
   128
}
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
bool ActivityDataStorage::checkTables()
hgs
parents:
diff changeset
   131
{
hgs
parents:
diff changeset
   132
    QStringList expectedTables("Activities");
hgs
parents:
diff changeset
   133
    QStringList actualTables = QSqlDatabase::database(KConnectionName).tables();
92
hgs
parents: 90
diff changeset
   134
    return (expectedTables == actualTables);
89
hgs
parents:
diff changeset
   135
}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
void ActivityDataStorage::recreateTables()
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    QSqlDatabase database = QSqlDatabase::database(KConnectionName);
92
hgs
parents: 90
diff changeset
   140
89
hgs
parents:
diff changeset
   141
    if (!database.transaction()) {
hgs
parents:
diff changeset
   142
        qFatal(qPrintable(database.lastError().text()));
hgs
parents:
diff changeset
   143
    }
92
hgs
parents: 90
diff changeset
   144
89
hgs
parents:
diff changeset
   145
    // drop any existing tables
hgs
parents:
diff changeset
   146
    {
hgs
parents:
diff changeset
   147
        QSqlQuery dropQuery(database);
hgs
parents:
diff changeset
   148
        foreach(const QString &tableName, database.tables()) {
hgs
parents:
diff changeset
   149
            if (!dropQuery.exec(QString("DROP TABLE %1").arg(tableName))) {
hgs
parents:
diff changeset
   150
                qFatal(qPrintable(dropQuery.lastError().text()));
hgs
parents:
diff changeset
   151
            }
hgs
parents:
diff changeset
   152
        }
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
    // create new table
hgs
parents:
diff changeset
   156
    {
hgs
parents:
diff changeset
   157
        QSqlQuery createQuery(database);
hgs
parents:
diff changeset
   158
        QString statement(
hgs
parents:
diff changeset
   159
            "CREATE TABLE Activities("
hgs
parents:
diff changeset
   160
            "Name TEXT NOT NULL PRIMARY KEY UNIQUE,"
92
hgs
parents: 90
diff changeset
   161
            "Data BLOB NOT NULL)");
hgs
parents: 90
diff changeset
   162
89
hgs
parents:
diff changeset
   163
        if (!createQuery.exec(statement)) {
hgs
parents:
diff changeset
   164
            qFatal(qPrintable(createQuery.lastError().text()));
hgs
parents:
diff changeset
   165
        }
hgs
parents:
diff changeset
   166
    }
92
hgs
parents: 90
diff changeset
   167
89
hgs
parents:
diff changeset
   168
    if (!database.commit()) {
hgs
parents:
diff changeset
   169
        qFatal(qPrintable(database.lastError().text()));
92
hgs
parents: 90
diff changeset
   170
    }
89
hgs
parents:
diff changeset
   171
}