QList<Message> HistorySqlStorage::messagesSince(const Chat &chat, const QDate &date) { kdebugf(); DatabaseMutex.lock(); QList<Message> messages; if (date.isNull()) return messages; QSqlQuery query(Database); QString queryString = "SELECT chat, sender, content, send_time, receive_time, attributes FROM kadu_messages WHERE " + chatWhere(chat) + " AND date(receive_time) >= date(:date) ORDER BY receive_time ASC, rowid ASC"; query.prepare(queryString); query.bindValue(":chat", chat.uuid().toString()); query.bindValue(":date", date.toString(Qt::ISODate)); executeQuery(query); messages = messagesFromQuery(query); DatabaseMutex.unlock(); return messages; }
QList<Message> HistorySqlStorage::messagesBackTo(const Chat &chat, const QDateTime &datetime, int limit) { DatabaseMutex.lock(); QList<Message> result; QSqlQuery query(Database); // we want last *limit* messages, so we have to invert sorting here // it is reverted back manually below QString queryString = "SELECT chat, sender, content, send_time, receive_time, attributes FROM kadu_messages WHERE " + chatWhere(chat) + " AND datetime(receive_time) >= datetime(:date) ORDER BY receive_time DESC, rowid DESC LIMIT :limit"; query.prepare(queryString); query.bindValue(":chat", chat.uuid().toString()); query.bindValue(":date", datetime.toString(Qt::ISODate)); query.bindValue(":limit", limit); executeQuery(query); result = messagesFromQuery(query); DatabaseMutex.unlock(); // se comment above QList<Message> inverted; #if (QT_VERSION >= 0x040700) inverted.reserve(result.size()); #endif for (int i = result.size() - 1; i >= 0; --i) inverted.append(result.at(i)); return inverted; }
QString HistorySqlStorage::chatWhere(const Chat &chat) { if (!chat) return QLatin1String("false"); ChatDetails *details = chat.details(); if (!details) return QLatin1String("false"); ChatDetailsAggregate *aggregate = qobject_cast<ChatDetailsAggregate *>(details); if (!aggregate) return QString("chat = '%1'").arg(chat.uuid().toString()); QStringList uuids; foreach (const Chat &aggregatedChat, aggregate->chats()) uuids.append(QString("'%1'").arg(aggregatedChat.uuid().toString())); return QString("chat IN (%1)").arg(uuids.join(QLatin1String(", "))); }