activityfw/activityserviceplugin/win/activitydatabase_p.cpp
changeset 66 32469d7d46ff
parent 61 8e5041d13c84
equal deleted inserted replaced
61:8e5041d13c84 66:32469d7d46ff
     9 * Initial Contributors:
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
    13 *
    13 *
    14 * Description: 
    14 * Description:
    15 *
    15 *
    16 */
    16 */
    17 #include "activitydatabase_p.h"
    17 #include "activitydatabase_p.h"
    18 
    18 
    19 #include <QSqlDatabase>
    19 #include <QSqlDatabase>
    36     QString databaseFile = settings.value("activitydatabase").toString();
    36     QString databaseFile = settings.value("activitydatabase").toString();
    37 
    37 
    38     QSqlDatabase database;
    38     QSqlDatabase database;
    39     if (QSqlDatabase::contains(KConnectionName)) {
    39     if (QSqlDatabase::contains(KConnectionName)) {
    40         database = QSqlDatabase::database(KConnectionName);
    40         database = QSqlDatabase::database(KConnectionName);
    41     } else {   
    41     } else {
    42         database = QSqlDatabase::addDatabase("QSQLITE", KConnectionName);
    42         database = QSqlDatabase::addDatabase("QSQLITE", KConnectionName);
    43         database.setDatabaseName(databaseFile);    
    43         database.setDatabaseName(databaseFile);
    44         if (!database.open()) {
    44         if (!database.open()) {
    45             qFatal(qPrintable(database.lastError().text()));
    45             qFatal(qPrintable(database.lastError().text()));
    46         }
    46         }
    47     }    
    47     }
    48     
    48 
    49     if (!checkTables()) {
    49     if (!checkTables()) {
    50         recreateTables();
    50         recreateTables();
    51     }
    51     }
    52 }
    52 }
    53 
    53 
    54 ActivityDatabasePrivate::~ActivityDatabasePrivate()
    54 ActivityDatabasePrivate::~ActivityDatabasePrivate()
    55 {
    55 {
    56     QSqlDatabase::database(KConnectionName).close();
    56     QSqlDatabase::database(KConnectionName).close();
    57 }
    57 }
    58 
    58 
    59 void ActivityDatabasePrivate::saveActivity(const QString &applicationName, const QString &activityName, const QVariantHash &activityMetadata) 
    59 void ActivityDatabasePrivate::saveActivity(const QString &applicationName, const QString &activityName, const QVariantHash &activityMetadata)
    60 {
    60 {
    61     if (applicationName.isEmpty() || activityName.isEmpty() || activityMetadata.value("screenshot").isNull()) {
    61     if (applicationName.isEmpty() || activityName.isEmpty() || activityMetadata.value("screenshot").isNull()) {
    62         qWarning("Activity entry is invalid, aborting save");
    62         qWarning("Activity entry is invalid, aborting save");
    63         return;
    63         return;
    64     }
    64     }
    65     
    65 
    66     QVariantHash activityData(activityMetadata);
    66     QVariantHash activityData(activityMetadata);
    67     activityData.insert(ActivityApplicationKeyword, applicationName);
    67     activityData.insert(ActivityApplicationKeyword, applicationName);
    68     activityData.insert(ActivityActivityKeyword, activityName);    
    68     activityData.insert(ActivityActivityKeyword, activityName);
    69     
    69 
    70     // stream whole entry to bytearray
    70     // stream whole entry to bytearray
    71     QByteArray streamedData;
    71     QByteArray streamedData;
    72     {
    72     {
    73         QDataStream stream(&streamedData, QIODevice::WriteOnly);
    73         QDataStream stream(&streamedData, QIODevice::WriteOnly);
    74         stream << activityData;
    74         stream << activityData;
    75     }  
    75     }
    76 
    76 
    77     QSqlDatabase database = QSqlDatabase::database(KConnectionName);
    77     QSqlDatabase database = QSqlDatabase::database(KConnectionName);
    78     
    78 
    79     if (!database.transaction()) {
    79     if (!database.transaction()) {
    80         qFatal(qPrintable(database.lastError().text()));
    80         qFatal(qPrintable(database.lastError().text()));
    81     }
    81     }
    82         
    82 
    83     // update or insert data
    83     // update or insert data
    84     {
    84     {
    85         QSqlQuery query(database);
    85         QSqlQuery query(database);
    86         if (!query.exec(QString("SELECT ApplicationName FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
    86         if (!query.exec(QString("SELECT ApplicationName FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
    87             qFatal(qPrintable(query.lastError().text()));
    87             qFatal(qPrintable(query.lastError().text()));
   104             query.bindValue(":ApplicationName", applicationName);
   104             query.bindValue(":ApplicationName", applicationName);
   105             query.bindValue(":ActivityName", activityName);
   105             query.bindValue(":ActivityName", activityName);
   106             query.bindValue(":Data", streamedData);
   106             query.bindValue(":Data", streamedData);
   107             if (!query.exec()) {
   107             if (!query.exec()) {
   108                 qFatal(qPrintable(query.lastError().text()));
   108                 qFatal(qPrintable(query.lastError().text()));
   109             }        
   109             }
   110         }
   110         }
   111     }
   111     }
   112     
   112 
   113     if (!database.commit()) {
   113     if (!database.commit()) {
   114         qFatal(qPrintable(database.lastError().text()));
   114         qFatal(qPrintable(database.lastError().text()));
   115     } 
   115     }
   116 }
   116 }
   117 
   117 
   118 void ActivityDatabasePrivate::deleteActivity(const QString &applicationName, const QString &activityName)
   118 void ActivityDatabasePrivate::deleteActivity(const QString &applicationName, const QString &activityName)
   119 {
   119 {
   120     QString sqlCommand = QString("DELETE FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName);
   120     QString sqlCommand = QString("DELETE FROM Activities WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName);
   141 QList<QVariantHash> ActivityDatabasePrivate::applicationActivitiesList(const QString &applicationName)
   141 QList<QVariantHash> ActivityDatabasePrivate::applicationActivitiesList(const QString &applicationName)
   142 {
   142 {
   143     return activitiesList(QString("SELECT Data FROM Activities WHERE ApplicationName = '%1'").arg(applicationName));
   143     return activitiesList(QString("SELECT Data FROM Activities WHERE ApplicationName = '%1'").arg(applicationName));
   144 }
   144 }
   145 
   145 
   146 QList<QVariantHash> ActivityDatabasePrivate::activitiesList(const QString& sqlCommand)
   146 QList<QVariantHash> ActivityDatabasePrivate::activitiesList(const QString &sqlCommand)
   147 {   
   147 {
   148     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   148     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   149     if (!query.exec(sqlCommand)) {
   149     if (!query.exec(sqlCommand)) {
   150         qFatal(qPrintable(query.lastError().text()));
   150         qFatal(qPrintable(query.lastError().text()));
   151     }
   151     }
   152     
   152 
   153     QList<QVariantHash> result;
   153     QList<QVariantHash> result;
   154     while (query.next()) {
   154     while (query.next()) {
   155         QVariantHash activityEntry;
   155         QVariantHash activityEntry;
   156         {
   156         {
   157             QByteArray data(query.value(0).toByteArray());
   157             QByteArray data(query.value(0).toByteArray());
   158             QDataStream stream(&data, QIODevice::ReadOnly);
   158             QDataStream stream(&data, QIODevice::ReadOnly);
   159             stream >> activityEntry;
   159             stream >> activityEntry;
   160         }
   160         }
   161         result.append(activityEntry);
   161         result.append(activityEntry);
   162     }   
   162     }
   163     return result;
   163     return result;
   164 }
   164 }
   165 
   165 
   166 QString ActivityDatabasePrivate::requestedActivityName(const QString &applicationName)
   166 QString ActivityDatabasePrivate::requestedActivityName(const QString &applicationName)
   167 {
   167 {
   168     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   168     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   169     if (!query.exec(QString("SELECT ActivityName FROM Activities WHERE ApplicationName = '%1' AND RequestFlag").arg(applicationName))) {
   169     if (!query.exec(QString("SELECT ActivityName FROM Activities WHERE ApplicationName = '%1' AND RequestFlag").arg(applicationName))) {
   170         qFatal(qPrintable(query.lastError().text()));
   170         qFatal(qPrintable(query.lastError().text()));
   171     }
   171     }
   172     
   172 
   173     QString result;
   173     QString result;
   174     if (query.next()) {
   174     if (query.next()) {
   175         result = query.value(0).toString();
   175         result = query.value(0).toString();
   176     }   
   176     }
   177     return result;
   177     return result;
   178 }
   178 }
   179 
   179 
   180 void ActivityDatabasePrivate::setActivityRequestFlag(const QString &applicationName, const QString &activityName)
   180 void ActivityDatabasePrivate::setActivityRequestFlag(const QString &applicationName, const QString &activityName)
   181 {
   181 {
   182     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   182     QSqlQuery query(QSqlDatabase::database(KConnectionName));
   183     
   183 
   184     // clear old requests for given application
   184     // clear old requests for given application
   185     if (!query.exec(QString("UPDATE Activities SET RequestFlag=0 WHERE ApplicationName = '%1'").arg(applicationName))) {
   185     if (!query.exec(QString("UPDATE Activities SET RequestFlag=0 WHERE ApplicationName = '%1'").arg(applicationName))) {
   186         qFatal(qPrintable(query.lastError().text()));
   186         qFatal(qPrintable(query.lastError().text()));
   187     }
   187     }
   188     
   188 
   189     // set new request
   189     // set new request
   190     if (!query.exec(QString("UPDATE Activities SET RequestFlag=1 WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
   190     if (!query.exec(QString("UPDATE Activities SET RequestFlag=1 WHERE ApplicationName = '%1' AND ActivityName = '%2'").arg(applicationName).arg(activityName))) {
   191         qFatal(qPrintable(query.lastError().text()));
   191         qFatal(qPrintable(query.lastError().text()));
   192     }
   192     }
   193 }
   193 }
   204 
   204 
   205 bool ActivityDatabasePrivate::checkTables()
   205 bool ActivityDatabasePrivate::checkTables()
   206 {
   206 {
   207     QStringList expectedTables("Activities");
   207     QStringList expectedTables("Activities");
   208     QStringList actualTables = QSqlDatabase::database(KConnectionName).tables();
   208     QStringList actualTables = QSqlDatabase::database(KConnectionName).tables();
   209     return (expectedTables == actualTables); 
   209     return (expectedTables == actualTables);
   210 }
   210 }
   211 
   211 
   212 void ActivityDatabasePrivate::recreateTables()
   212 void ActivityDatabasePrivate::recreateTables()
   213 {
   213 {
   214     QSqlDatabase database = QSqlDatabase::database(KConnectionName);
   214     QSqlDatabase database = QSqlDatabase::database(KConnectionName);
   215     
   215 
   216     if (!database.transaction()) {
   216     if (!database.transaction()) {
   217         qFatal(qPrintable(database.lastError().text()));
   217         qFatal(qPrintable(database.lastError().text()));
   218     }
   218     }
   219     
   219 
   220     // drop any existing tables
   220     // drop any existing tables
   221     {
   221     {
   222         QSqlQuery dropQuery(database);
   222         QSqlQuery dropQuery(database);
   223         foreach(const QString &tableName, database.tables()) {
   223         foreach(const QString &tableName, database.tables()) {
   224             if (!dropQuery.exec(QString("DROP TABLE %1").arg(tableName))) {
   224             if (!dropQuery.exec(QString("DROP TABLE %1").arg(tableName))) {
   235             "ApplicationName TEXT NOT NULL,"
   235             "ApplicationName TEXT NOT NULL,"
   236             "ActivityName TEXT NOT NULL,"
   236             "ActivityName TEXT NOT NULL,"
   237             "RequestFlag BOOL NOT NULL DEFAULT FALSE,"
   237             "RequestFlag BOOL NOT NULL DEFAULT FALSE,"
   238             "Data BLOB NOT NULL,"
   238             "Data BLOB NOT NULL,"
   239             "PRIMARY KEY(ActivityName, ApplicationName))");
   239             "PRIMARY KEY(ActivityName, ApplicationName))");
   240         
   240 
   241         if (!createQuery.exec(statement)) {
   241         if (!createQuery.exec(statement)) {
   242             qFatal(qPrintable(createQuery.lastError().text()));
   242             qFatal(qPrintable(createQuery.lastError().text()));
   243         }
   243         }
   244     }
   244     }
   245     
   245 
   246     if (!database.commit()) {
   246     if (!database.commit()) {
   247         qFatal(qPrintable(database.lastError().text()));
   247         qFatal(qPrintable(database.lastError().text()));
   248     }  
   248     }
   249 }
   249 }