8 Database::Database(QObject *parent) :
11 qDebug() << __PRETTY_FUNCTION__;
16 qDebug() << __PRETTY_FUNCTION__;
19 bool Database::addTag(qulonglong userId, const QString &tag)
21 qDebug() << __PRETTY_FUNCTION__;
26 if (m_database.isOpen()) {
28 ret = tagQuery.exec(QString("SELECT id, count FROM tag WHERE name = '%1'")
32 if (ret && tagQuery.next()) {
33 qWarning() << tagQuery.value(1).toInt();
34 int count = tagQuery.value(1).toInt() + 1;
36 QSqlQuery tagUpdateQuery;
37 tagUpdateQuery.exec(QString("UPDATE tag SET count = '%1' WHERE id = '%2'")
38 .arg(count).arg(tagQuery.value(0).toString()));
39 tagId = tagQuery.value(0).toULongLong();
40 qWarning() << tagUpdateQuery.lastQuery();
43 QSqlQuery tagInsertQuery;
44 ret = tagInsertQuery.exec(QString("INSERT INTO tag VALUES(NULL, '%1')")
48 tagId = tagInsertQuery.lastInsertId().toULongLong();
52 if (ret && (tagId != 0)) {
53 QSqlQuery userTagQuery;
55 ret = userTagQuery.exec(QString("INSERT INTO usertag VALUES('%1', '%2')")
56 .arg(userId).arg(tagId));
63 bool Database::createNotificationTable()
65 qDebug() << __PRETTY_FUNCTION__;
69 if (m_database.isOpen()) {
72 created = query.exec("CREATE TABLE IF NOT EXISTS notification ("
73 "id INTEGER PRIMARY KEY,"
76 "timestamp VARCHAR(20),"
80 "FOREIGN KEY(senderid) REFERENCES user(id),"
81 "FOREIGN KEY(receiverid) REFERENCES user(id)"
88 bool Database::createTagTable()
90 qDebug() << __PRETTY_FUNCTION__;
94 if (m_database.isOpen()) {
97 created = query.exec("CREATE TABLE IF NOT EXISTS tag ("
98 "id INTEGER PRIMARY KEY,"
99 "name VARCHAR(30) UNIQUE"
106 bool Database::createUserTable()
108 qDebug() << __PRETTY_FUNCTION__;
110 bool created = false;
112 if (m_database.isOpen()) {
115 created = query.exec("CREATE TABLE IF NOT EXISTS user ("
116 "id INTEGER PRIMARY KEY,"
127 bool Database::createUserTagTable()
129 qDebug() << __PRETTY_FUNCTION__;
131 bool created = false;
133 if (m_database.isOpen()) {
136 created = query.exec("CREATE TABLE IF NOT EXISTS usertag ("
139 "PRIMARY KEY(userid, tagid),"
140 "FOREIGN KEY(userid) REFERENCES user(id),"
141 "FOREIGN KEY(tagid) REFERENCES tag(id)"
148 QByteArray Database::getInterestingPeopleByTag(qulonglong userId, const QString &tag)
150 qDebug() << __PRETTY_FUNCTION__;
154 result.append("{\"people\": {");
156 QHash<QString, QString> tags;
159 QSqlQuery tagQuery(QString("SELECT DISTINCT usertag.userid, tag.name FROM usertag, tag WHERE "
160 "usertag.tagid = tag.id AND usertag.userid != '%1' AND "
161 "tag.name LIKE '\%%2\%'").arg(userId).arg(tag));
163 while (tagQuery.next()) {
164 QString userId = tagQuery.value(0).toString();
165 QString tagName = tagQuery.value(1).toString();
167 if (tags.contains(userId)) {
168 QString value = tags.take(userId);
169 value.append(", \"" + tagName + "\"");
170 tags.insert(userId, value);
173 tags.insert(userId, QString("\"" + tagName + "\""));
178 QHashIterator<QString, QString> i(tags);
180 userIds.append(i.next().key());
183 result.append("\"friends\": [");
185 QSqlQuery friendQuery(QString("SELECT user.id, user.name, user.image_url, user.latitude, "
186 "user.longitude FROM user WHERE "
187 "user.id IN (") + userIds.join(", ") + QString(") AND "
189 "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%1' "
191 "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%1')")
194 bool friendRemoveLast = false;
196 while (friendQuery.next()) {
197 friendRemoveLast = true;
199 result.append("\"uid\": \"" + friendQuery.value(0).toString() + "\",");
200 result.append("\"name\": \"" + friendQuery.value(1).toString() + "\",");
201 result.append("\"image_url\": \"" + friendQuery.value(2).toString() + "\",");
202 result.append("\"latitude\": \"" + friendQuery.value(3).toString() + "\",");
203 result.append("\"longitude\": \"" + friendQuery.value(4).toString() + "\",");
204 result.append("\"tags\": [" + tags.value(friendQuery.value(0).toString()) + "]");
208 if (friendRemoveLast) {
209 int friendLastComma = result.lastIndexOf(",");
210 if (friendLastComma != -1)
211 result.remove(result.lastIndexOf(","), 1);
217 result.append("\"others\": [");
219 QSqlQuery otherQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
220 "user.id IN (") + userIds.join(", ") + QString(") AND "
222 "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%1' "
224 "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%1')")
227 bool otherRemoveLast = false;
229 while (otherQuery.next()) {
230 otherRemoveLast = true;
232 result.append("\"uid\": \"" + otherQuery.value(0).toString() + "\",");
233 result.append("\"name\": \"" + otherQuery.value(1).toString() + "\",");
234 result.append("\"image_url\": \"" + otherQuery.value(2).toString() + "\",");;
235 result.append("\"tags\": [" + tags.value(otherQuery.value(0).toString()) + "]");
239 if (otherRemoveLast) {
240 int otherLastComma = result.lastIndexOf(",");
241 if (otherLastComma != -1)
242 result.remove(result.lastIndexOf(","), 1);
249 return result.toUtf8();
253 QByteArray Database::getInterestingPeople(qulonglong userId,
254 const GeoCoordinate &southWestCoordinates,
255 const GeoCoordinate &northEastCoordinates)
257 qDebug() << __PRETTY_FUNCTION__;
261 result.append("{\"people\": {");
263 QHash<QString, QString> tags;
266 QSqlQuery tagQuery(QString("SELECT usertag.userid, tag.name FROM usertag, tag WHERE "
267 "usertag.tagid IN (SELECT usertag.tagid FROM usertag WHERE "
268 "usertag.userid = '%1') AND usertag.userid != '%2' "
269 "AND usertag.tagid = tag.id").arg(userId).arg(userId));
271 while (tagQuery.next()) {
272 QString userId = tagQuery.value(0).toString();
273 QString tagName = tagQuery.value(1).toString();
275 if (tags.contains(userId)) {
276 QString value = tags.take(userId);
277 value.append(", \"" + tagName + "\"");
278 tags.insert(userId, value);
281 tags.insert(userId, QString("\"" + tagName + "\""));
286 QHashIterator<QString, QString> i(tags);
288 userIds.append(i.next().key());
291 result.append("\"friends\": [");
293 QSqlQuery friendQuery(QString("SELECT user.id, user.name, user.image_url, user.latitude, "
294 "user.longitude FROM user WHERE "
295 "user.id IN (") + userIds.join(", ") + QString(") AND "
296 "user.latitude >= '%1' AND user.latitude < '%2' AND "
297 "user.longitude >= '%3' AND user.longitude < '%4' AND user.id IN "
298 "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%5' "
300 "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%5')")
301 .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
302 .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude())
305 bool friendRemoveLast = false;
307 while (friendQuery.next()) {
308 friendRemoveLast = true;
310 result.append("\"uid\": \"" + friendQuery.value(0).toString() + "\",");
311 result.append("\"name\": \"" + friendQuery.value(1).toString() + "\",");
312 result.append("\"image_url\": \"" + friendQuery.value(2).toString() + "\",");
313 result.append("\"latitude\": \"" + friendQuery.value(3).toString() + "\",");
314 result.append("\"longitude\": \"" + friendQuery.value(4).toString() + "\",");
315 result.append("\"tags\": [" + tags.value(friendQuery.value(0).toString()) + "]");
319 if (friendRemoveLast) {
320 int friendLastComma = result.lastIndexOf(",");
321 if (friendLastComma != -1)
322 result.remove(result.lastIndexOf(","), 1);
328 result.append("\"others\": [");
330 QSqlQuery otherQuery(QString("SELECT user.id, user.name, user.image_url FROM user WHERE "
331 "user.id IN (") + userIds.join(", ") + QString(") AND "
332 "user.latitude >= '%1' AND user.latitude < '%2' AND "
333 "user.longitude >= '%3' AND user.longitude < '%4' AND user.id "
335 "(SELECT friend.uid2 FROM friend WHERE friend.uid1 = '%5' "
337 "SELECT friend.uid1 FROM friend WHERE friend.uid2 = '%5')")
338 .arg(southWestCoordinates.latitude()).arg(northEastCoordinates.latitude())
339 .arg(southWestCoordinates.longitude()).arg(northEastCoordinates.longitude())
342 bool otherRemoveLast = false;
344 while (otherQuery.next()) {
345 otherRemoveLast = true;
347 result.append("\"uid\": \"" + otherQuery.value(0).toString() + "\",");
348 result.append("\"name\": \"" + otherQuery.value(1).toString() + "\",");
349 result.append("\"image_url\": \"" + otherQuery.value(2).toString() + "\",");;
350 result.append("\"tags\": [" + tags.value(otherQuery.value(0).toString()) + "]");
354 if (otherRemoveLast) {
355 int otherLastComma = result.lastIndexOf(",");
356 if (otherLastComma != -1)
357 result.remove(result.lastIndexOf(","), 1);
364 return result.toUtf8();
367 QByteArray Database::getNotifications(qulonglong userId)
369 qDebug() << __PRETTY_FUNCTION__;
372 result.append("{\"messages\": {");
375 QSqlQuery receivedQuery(QString("SELECT notification.id, notification.senderid, "
376 "notification.receiverid, user.name, user.image_url, "
377 "notification.timestamp, notification.text, "
378 "notification.latitude, notification.longitude "
379 "FROM notification, user WHERE notification.receiverid = '%1' AND "
380 "notification.senderid = user.id "
381 "ORDER BY notification.timestamp DESC")
384 result.append("\"received\": [");
386 bool receivedRemoveLast = false;
388 while (receivedQuery.next()) {
389 receivedRemoveLast = true;
391 result.append("\"id\": \"" + receivedQuery.value(0).toString() + "\",");
392 result.append("\"sender_id\": \"" + receivedQuery.value(1).toString() + "\",");
393 result.append("\"receiver_id\": \"" + receivedQuery.value(2).toString() + "\",");
394 result.append("\"sender_name\": \"" + receivedQuery.value(3).toString() + "\",");
395 result.append("\"image_url\": \"" + receivedQuery.value(4).toString() + "\",");
396 result.append("\"timestamp\": \"" + receivedQuery.value(5).toString() + "\",");
397 result.append("\"text\": \"" + receivedQuery.value(6).toString() + "\",");
398 result.append("\"address\": \"" + QString("Address 13, Oulu") + "\",");
399 result.append("\"latitude\": \"" + receivedQuery.value(7).toString() + "\",");
400 result.append("\"longitude\": \"" + receivedQuery.value(8).toString() + "\"");
404 if (receivedRemoveLast) {
405 int receivedLastComma = result.lastIndexOf(",");
406 if (receivedLastComma != -1)
407 result.remove(result.lastIndexOf(","), 1);
413 QSqlQuery sentQuery(QString("SELECT notification.id, notification.senderid, "
414 "notification.receiverid, user.name, user.image_url, "
415 "notification.timestamp, notification.text, "
416 "notification.latitude, notification.longitude "
417 "FROM notification, user WHERE notification.senderid = '%1' AND "
418 "notification.receiverid = user.id "
419 "ORDER BY notification.timestamp DESC")
422 result.append("\"sent\": [");
424 bool sentRemoveLast = false;
426 while (sentQuery.next()) {
427 sentRemoveLast = true;
429 result.append("\"id\": \"" + sentQuery.value(0).toString() + "\",");
430 result.append("\"sender_id\": \"" + sentQuery.value(1).toString() + "\",");
431 result.append("\"receiver_id\": \"" + sentQuery.value(2).toString() + "\",");
432 result.append("\"sender_name\": \"" + sentQuery.value(3).toString() + "\",");
433 result.append("\"image_url\": \"" + sentQuery.value(4).toString() + "\",");
434 result.append("\"timestamp\": \"" + sentQuery.value(5).toString() + "\",");
435 result.append("\"text\": \"" + sentQuery.value(6).toString() + "\",");
436 result.append("\"address\": \"" + QString("Address 13, Oulu") + "\",");
437 result.append("\"latitude\": \"" + sentQuery.value(7).toString() + "\",");
438 result.append("\"longitude\": \"" + sentQuery.value(8).toString() + "\"");
442 if (sentRemoveLast) {
443 int lastComma = result.lastIndexOf(",");
445 result.remove(result.lastIndexOf(","), 1);
452 return result.toUtf8();
455 QByteArray Database::getPopularTags()
457 qDebug() << __PRETTY_FUNCTION__;
459 QSqlQuery query(QString("SELECT tag.id, tag.name FROM tag ORDER BY count DESC LIMIT 10"));
462 result.append("{\"popular_tags\": [");
464 while (query.next()) {
466 result.append("\"id\": \"" + query.value(0).toString() + "\",");
467 result.append("\"name\": \"" + query.value(1).toString() + "\"");
471 int lastComma = result.lastIndexOf(",");
473 result.remove(result.lastIndexOf(","), 1);
477 return result.toUtf8();
480 QHash<QString, QString> Database::getTags(qulonglong userId)
482 qDebug() << __PRETTY_FUNCTION__;
484 QHash<QString, QString> tags;
486 QSqlQuery query(QString("SELECT tag.id, tag.name FROM usertag, tag WHERE usertag.userid = '%1' "
487 "AND usertag.tagid = tag.id").arg(userId));
490 tags.insert(query.value(0).toString(), query.value(1).toString());
495 bool Database::openDatabase()
497 qDebug() << __PRETTY_FUNCTION__;
499 m_database = QSqlDatabase::addDatabase("QSQLITE");
501 QString path(QDir::home().path());
502 path.append(QDir::separator()).append("my.db.sqlite");
503 path = QDir::toNativeSeparators(path);
504 m_database.setDatabaseName(path);
506 return m_database.open();
509 bool Database::removeMessage(qulonglong userId, const QString &id)
511 qDebug() << __PRETTY_FUNCTION__;
513 QSqlQuery removeMessageQuery;
515 return removeMessageQuery.exec(QString("DELETE FROM notification WHERE "
516 "(notification.receiverid = '%1' OR "
517 "notification.senderid = '%1') AND "
518 "notification.id = '%2'").arg(userId).arg(id));
521 bool Database::removeTags(qulonglong userId, const QStringList &tags)
523 qDebug() << __PRETTY_FUNCTION__;
525 QSqlQuery removeTagsQuery;
527 return removeTagsQuery.exec(QString("DELETE FROM usertag WHERE usertag.userid = "
528 "'%1' AND usertag.tagid IN (").arg(userId) +
529 tags.join(", ") + ")");
532 bool Database::sendMessage(qulonglong senderId, qulonglong receiverId, const QString &message,
533 const GeoCoordinate &coordinates)
535 qDebug() << __PRETTY_FUNCTION__;
537 QSqlQuery sendMessageQuery;
541 if (coordinates.isValid()) {
542 returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
543 "NULL, '%1', '%2', strftime('%s','now'), '%3', '%4', '%5')")
544 .arg(senderId).arg(receiverId).arg(message).arg(coordinates.latitude()).
545 arg(coordinates.longitude()));
547 returnValue = sendMessageQuery.exec(QString("INSERT INTO notification VALUES("
548 "NULL, '%1', '%2', strftime('%s','now'), '%3', NULL, NULL)")
549 .arg(senderId).arg(receiverId).arg(message));