X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsqlitestorage.cpp;h=b7a07fd3919293b7893ef61d0224c72421ee05c7;hp=9455a61c2ee999a645070bc69decda8f7e14d111;hb=99055e8e4a83c234ae424cc225d3a7aa17c1544b;hpb=1a5c1814a0c52f6f35e65c7033b2f896bf1188e3 diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 9455a61c..b7a07fd3 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -773,6 +773,7 @@ void SqliteStorage::bindNetworkInfo(QSqlQuery& query, const NetworkInfo& info) query.bindValue(":messagerateburstsize", info.messageRateBurstSize); query.bindValue(":messageratedelay", info.messageRateDelay); query.bindValue(":unlimitedmessagerate", info.unlimitedMessageRate ? 1 : 0); + query.bindValue(":skipcaps", info.skipCapsToString()); if (info.networkId.isValid()) query.bindValue(":networkid", info.networkId.toInt()); } @@ -970,6 +971,7 @@ std::vector SqliteStorage::networks(UserId user) net.messageRateBurstSize = networksQuery.value(20).toUInt(); net.messageRateDelay = networksQuery.value(21).toUInt(); net.unlimitedMessageRate = networksQuery.value(22).toInt() == 1 ? true : false; + net.skipCapsFromString(networksQuery.value(23).toString()); serversQuery.bindValue(":networkid", net.networkId.toInt()); safeExec(serversQuery); @@ -1650,7 +1652,7 @@ Message::Types SqliteStorage::bufferActivity(BufferId bufferId, MsgId lastSeenMs QSqlDatabase db = logDb(); db.transaction(); - Message::Types result = Message::Types(nullptr); + Message::Types result{}; { QSqlQuery query(db); query.prepare(queryString("select_buffer_bufferactivity")); @@ -2075,6 +2077,94 @@ std::vector SqliteStorage::requestMsgsFiltered( return messagelist; } +std::vector SqliteStorage::requestMsgsForward( + UserId user, BufferId bufferId, MsgId first, MsgId last, int limit, Message::Types type, Message::Flags flags) +{ + std::vector messagelist; + + QSqlDatabase db = logDb(); + db.transaction(); + + bool error = false; + BufferInfo bufferInfo; + { + // code dupication from getBufferInfo: + // this is due to the impossibility of nesting transactions and recursive locking + QSqlQuery bufferInfoQuery(db); + bufferInfoQuery.prepare(queryString("select_buffer_by_id")); + bufferInfoQuery.bindValue(":userid", user.toInt()); + bufferInfoQuery.bindValue(":bufferid", bufferId.toInt()); + + lockForRead(); + safeExec(bufferInfoQuery); + error = !watchQuery(bufferInfoQuery) || !bufferInfoQuery.first(); + if (!error) { + bufferInfo = BufferInfo(bufferInfoQuery.value(0).toInt(), + bufferInfoQuery.value(1).toInt(), + (BufferInfo::Type)bufferInfoQuery.value(2).toInt(), + 0, + bufferInfoQuery.value(4).toString()); + error = !bufferInfo.isValid(); + } + } + if (error) { + db.rollback(); + unlock(); + return messagelist; + } + + { + QSqlQuery query(db); + query.prepare(queryString("select_messagesForward")); + + if (first == -1) { + query.bindValue(":firstmsg", std::numeric_limits::min()); + } else { + query.bindValue(":firstmsg", first.toQint64()); + } + + if (last == -1) { + query.bindValue(":lastmsg", std::numeric_limits::max()); + } else { + query.bindValue(":lastmsg", last.toQint64()); + } + + query.bindValue(":bufferid", bufferId.toInt()); + + int typeRaw = type; + int flagsRaw = flags; + query.bindValue(":type", typeRaw); + query.bindValue(":flags", flagsRaw); + + query.bindValue(":limit", limit); + + safeExec(query); + watchQuery(query); + + while (query.next()) { + Message msg( + // As of SQLite schema version 31, timestamps are stored in milliseconds + // instead of seconds. This nets us more precision as well as simplifying + // 64-bit time. + QDateTime::fromMSecsSinceEpoch(query.value(1).toLongLong()), + bufferInfo, + (Message::Type)query.value(2).toInt(), + query.value(8).toString(), + query.value(4).toString(), + query.value(5).toString(), + query.value(6).toString(), + query.value(7).toString(), + Message::Flags{query.value(3).toInt()}); + msg.setMsgId(query.value(0).toLongLong()); + messagelist.push_back(std::move(msg)); + } + } + db.commit(); + unlock(); + + return messagelist; +} + std::vector SqliteStorage::requestAllMsgs(UserId user, MsgId first, MsgId last, int limit) { std::vector messagelist; @@ -2406,6 +2496,8 @@ bool SqliteMigrationReader::readMo(NetworkMO& network) network.messagerateburstsize = value(26).toInt(); network.messageratedelay = value(27).toUInt(); network.unlimitedmessagerate = value(28).toInt() == 1 ? true : false; + // Skipped IRCv3 caps + network.skipcaps = value(29).toString(); return true; }