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 } |