QPair<int, HistoryKeeper::ChatType> HistoryKeeper::getChatID(const QString &id_str, ChatType ct) { auto it = chats.find(id_str); if (it != chats.end()) return it.value(); db->exec(QString("INSERT INTO chats (name, ctype) VALUES ('%1', '%2');").arg(id_str).arg(ct)); updateChatsID(); return getChatID(id_str, ct); }
QList<QString> HistoryKeeper::generateAddChatEntryCmd(const QString& chat, const QString& message, const QString& sender, const QDateTime &dt, bool isSent, QString dispName) { QList<QString> cmds; int chat_id = getChatID(chat, ctSingle).first; int sender_id = getAliasID(sender); cmds.push_back(QString("INSERT INTO history (timestamp, chat_id, sender, message, alias) VALUES (%1, %2, %3, '%4', '%5');") .arg(dt.toMSecsSinceEpoch()).arg(chat_id).arg(sender_id).arg(wrapMessage(message)).arg(dispName)); cmds.push_back(QString("INSERT INTO sent_status (status) VALUES (%1);").arg(isSent)); return cmds; }
int HistoryKeeper::addChatEntry(const QString& chat, const QString& message, const QString& sender, const QDateTime &dt, bool isSent) { int chat_id = getChatID(chat, ctSingle).first; int sender_id = getAliasID(sender); db->exec("BEGIN TRANSACTION;"); db->exec(QString("INSERT INTO history (timestamp, chat_id, sender, message) ") + QString("VALUES (%1, %2, %3, '%4');") .arg(dt.toMSecsSinceEpoch()).arg(chat_id).arg(sender_id).arg(wrapMessage(message))); db->exec(QString("INSERT INTO sent_status (status) VALUES (%1);").arg(isSent)); db->exec("COMMIT TRANSACTION;"); messageID++; return messageID; }
void HistoryKeeper::removeFriendHistory(const QString& chat) { int chat_id = getChatID(chat, ctSingle).first; db->exec("BEGIN TRANSACTION;"); QString cmd = QString("DELETE FROM chats WHERE name = '%1';").arg(chat); db->exec(cmd); cmd = QString("DELETE FROM aliases WHERE user_id = '%1';").arg(chat); db->exec(cmd); cmd = QString("DELETE FROM sent_status WHERE id IN (SELECT id FROM history WHERE chat_id = '%1');").arg(chat_id); db->exec(cmd); cmd = QString("DELETE FROM history WHERE chat_id = '%1';").arg(chat_id); db->exec(cmd); db->exec("COMMIT TRANSACTION;"); }
QList<HistoryKeeper::HistMessage> HistoryKeeper::getChatHistory(HistoryKeeper::ChatType ct, const QString &chat, const QDateTime &time_from, const QDateTime &time_to) { QList<HistMessage> res; qint64 time64_from = time_from.toMSecsSinceEpoch(); qint64 time64_to = time_to.toMSecsSinceEpoch(); int chat_id = getChatID(chat, ct).first; QSqlQuery dbAnswer; if (ct == ctSingle) { dbAnswer = db->exec(QString("SELECT history.id, timestamp, user_id, message, status, alias FROM history LEFT JOIN sent_status ON history.id = sent_status.id ") + QString("INNER JOIN aliases ON history.sender = aliases.id AND timestamp BETWEEN %1 AND %2 AND chat_id = %3;") .arg(time64_from).arg(time64_to).arg(chat_id)); } else { // no groupchats yet } while (dbAnswer.next()) { qint64 id = dbAnswer.value(0).toLongLong(); qint64 timeInt = dbAnswer.value(1).toLongLong(); QString sender = dbAnswer.value(2).toString(); QString senderName = dbAnswer.value(5).toString(); QString message = unWrapMessage(dbAnswer.value(3).toString()); bool isSent = true; if (!dbAnswer.value(4).isNull()) isSent = dbAnswer.value(4).toBool(); QDateTime time = QDateTime::fromMSecsSinceEpoch(timeInt); res.push_back(HistMessage(id, "", sender, message, time, isSent, senderName)); } return res; }