From: Marcus Eggenberger Date: Sat, 29 Nov 2008 14:16:28 +0000 (+0100) Subject: adding new backlog requesters X-Git-Tag: 0.4.0~398 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=335e1e55ee8df69b37b1b4d839950ced9ac08cc4;hp=de1619ce11bf386490cdb38bc1be134a391eeaae adding new backlog requesters --- diff --git a/src/client/backlogrequester.cpp b/src/client/backlogrequester.cpp index 40f574be..2662dfcc 100644 --- a/src/client/backlogrequester.cpp +++ b/src/client/backlogrequester.cpp @@ -56,3 +56,45 @@ void FixedBacklogRequester::requestBacklog() { backlogManager->requestBacklog(bufferId, -1, -1, _backlogCount); } } + +// ======================================== +// GLOBAL UNREAD BACKLOG REQUESTER +// ======================================== +GlobalUnreadBacklogRequester::GlobalUnreadBacklogRequester(ClientBacklogManager *backlogManager) + : BacklogRequester(false, backlogManager) +{ + BacklogSettings backlogSettings; + _limit = backlogSettings.globalUnreadBacklogLimit(); + _additional = backlogSettings.globalUnreadBacklogAdditional(); +} + +void GlobalUnreadBacklogRequester::requestBacklog() { + MsgId oldestUnreadMessage; + foreach(BufferId bufferId, allBufferIds()) { + MsgId msgId = Client::networkModel()->lastSeenMsgId(bufferId); + if(!oldestUnreadMessage.isValid() || oldestUnreadMessage > msgId) + oldestUnreadMessage = msgId; + } + backlogManager->emitMessagesRequested(QObject::tr("Requesting up to %1 of all unread backlog messages (plus additional %2)").arg(_limit).arg(_additional)); + backlogManager->requestBacklogAll(oldestUnreadMessage, -1, _limit, _additional); +} + +// ======================================== +// PER BUFFER UNREAD BACKLOG REQUESTER +// ======================================== +PerBufferUnreadBacklogRequester::PerBufferUnreadBacklogRequester(ClientBacklogManager *backlogManager) + : BacklogRequester(true, backlogManager) +{ + BacklogSettings backlogSettings; + _limit = backlogSettings.perBufferUnreadBacklogLimit(); + _additional = backlogSettings.perBufferUnreadBacklogAdditional(); +} + +void PerBufferUnreadBacklogRequester::requestBacklog() { + QList allBuffers = allBufferIds(); + setWaitingBuffers(allBuffers); + backlogManager->emitMessagesRequested(QObject::tr("Requesting a total of up to %1 unread backlog messages for %2 buffers").arg((_limit + _additional) * allBuffers.count()).arg(allBuffers.count())); + foreach(BufferId bufferId, allBuffers) { + backlogManager->requestBacklog(bufferId, Client::networkModel()->lastSeenMsgId(bufferId), -1, _limit, _additional); + } +} diff --git a/src/client/backlogrequester.h b/src/client/backlogrequester.h index af7696af..4ddc9624 100644 --- a/src/client/backlogrequester.h +++ b/src/client/backlogrequester.h @@ -76,5 +76,30 @@ private: int _backlogCount; }; +// ======================================== +// GLOBAL UNREAD BACKLOG REQUESTER +// ======================================== +class GlobalUnreadBacklogRequester : public BacklogRequester { +public: + GlobalUnreadBacklogRequester(ClientBacklogManager *backlogManager); + virtual void requestBacklog(); + +private: + int _limit; + int _additional; +}; + +// ======================================== +// PER BUFFER UNREAD BACKLOG REQUESTER +// ======================================== +class PerBufferUnreadBacklogRequester : public BacklogRequester { +public: + PerBufferUnreadBacklogRequester(ClientBacklogManager *backlogManager); + virtual void requestBacklog(); + +private: + int _limit; + int _additional; +}; #endif //BACKLOGREQUESTER_H diff --git a/src/client/backlogsettings.h b/src/client/backlogsettings.h index 01a037e2..f5a0f51b 100644 --- a/src/client/backlogsettings.h +++ b/src/client/backlogsettings.h @@ -34,6 +34,16 @@ public: inline int fixedBacklogAmount() { return localValue("FixedBacklogAmount", 500).toInt(); } inline void setFixedBacklogAmount(int amount) { return setLocalValue("FixedBacklogAmount", amount); } + + inline int globalUnreadBacklogLimit() { return localValue("GlobalUnreadBacklogLimit", 5000).toInt(); } + inline void setGlobalUnreadBacklogLimit(int limit) { return setLocalValue("GlobalUnreadBacklogLimit", limit); } + inline int globalUnreadBacklogAdditional() { return localValue("GlobalUnreadBacklogAdditional", 100).toInt(); } + inline void setGlobalUnreadBacklogAdditional(int Additional) { return setLocalValue("GlobalUnreadBacklogAdditional", Additional); } + + inline int perBufferUnreadBacklogLimit() { return localValue("PerBufferUnreadBacklogLimit", 200).toInt(); } + inline void setPerBufferUnreadBacklogLimit(int limit) { return setLocalValue("PerBufferUnreadBacklogLimit", limit); } + inline int perBufferUnreadBacklogAdditional() { return localValue("PerBufferUnreadBacklogAdditional", 50).toInt(); } + inline void setPerBufferUnreadBacklogAdditional(int Additional) { return setLocalValue("PerBufferUnreadBacklogAdditional", Additional); } }; #endif //BACKLOGSETTINGS_H diff --git a/src/client/clientbacklogmanager.cpp b/src/client/clientbacklogmanager.cpp index 8cf2af4e..1ffc18a6 100644 --- a/src/client/clientbacklogmanager.cpp +++ b/src/client/clientbacklogmanager.cpp @@ -35,10 +35,8 @@ ClientBacklogManager::ClientBacklogManager(QObject *parent) { } -void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, QVariantList msgs) { - Q_UNUSED(first) - Q_UNUSED(last) - Q_UNUSED(limit) +void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, QVariantList msgs) { + Q_UNUSED(first) Q_UNUSED(last) Q_UNUSED(limit) Q_UNUSED(additional) if(msgs.isEmpty()) return; @@ -56,12 +54,27 @@ void ClientBacklogManager::receiveBacklog(BufferId bufferId, MsgId first, MsgId if(!_requester->buffer(bufferId, msglist)) { // this was the last part to buffer stopBuffering(); + reset(); } } else { dispatchMessages(msglist); } } +void ClientBacklogManager::receiveBacklogAll(MsgId first, MsgId last, int limit, int additional, QVariantList msgs) { + Q_UNUSED(first) Q_UNUSED(last) Q_UNUSED(limit) Q_UNUSED(additional) + + MessageList msglist; + foreach(QVariant v, msgs) { + Message msg = v.value(); + msg.setFlags(msg.flags() | Message::Backlog); + msglist << msg; + } + + dispatchMessages(msglist); + reset(); +} + void ClientBacklogManager::requestInitialBacklog() { if(_requester) { qWarning() << "ClientBacklogManager::requestInitialBacklog() called twice in the same session! (Backlog has already been requested)"; @@ -71,7 +84,9 @@ void ClientBacklogManager::requestInitialBacklog() { BacklogSettings settings; switch(settings.requesterType()) { case BacklogRequester::GlobalUnread: + _requester = new GlobalUnreadBacklogRequester(this); case BacklogRequester::PerBufferUnread: + _requester = new PerBufferUnreadBacklogRequester(this); case BacklogRequester::PerBufferFixed: default: _requester = new FixedBacklogRequester(this); @@ -84,7 +99,6 @@ void ClientBacklogManager::stopBuffering() { Q_ASSERT(_requester); dispatchMessages(_requester->bufferedMessages(), true); - reset(); } bool ClientBacklogManager::isBuffering() { diff --git a/src/client/clientbacklogmanager.h b/src/client/clientbacklogmanager.h index a3f19aef..a0420abd 100644 --- a/src/client/clientbacklogmanager.h +++ b/src/client/clientbacklogmanager.h @@ -38,7 +38,8 @@ public: void reset(); public slots: - virtual void receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, QVariantList msgs); + virtual void receiveBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional, QVariantList msgs); + virtual void receiveBacklogAll(MsgId first, MsgId last, int limit, int additional, QVariantList msgs); void requestInitialBacklog(); signals: diff --git a/src/common/backlogmanager.cpp b/src/common/backlogmanager.cpp index bf962bfc..56b7a709 100644 --- a/src/common/backlogmanager.cpp +++ b/src/common/backlogmanager.cpp @@ -20,7 +20,12 @@ #include "backlogmanager.h" -QVariantList BacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit) { - emit backlogRequested(bufferId, first, last, limit); +QVariantList BacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional) { + emit backlogRequested(bufferId, first, last, limit, additional); + return QVariantList(); +} + +QVariantList BacklogManager::requestBacklogAll(MsgId first, MsgId last, int limit, int additional) { + emit backlogAllRequested(first, last, limit, additional); return QVariantList(); } diff --git a/src/common/backlogmanager.h b/src/common/backlogmanager.h index de42741c..d406dc19 100644 --- a/src/common/backlogmanager.h +++ b/src/common/backlogmanager.h @@ -32,12 +32,15 @@ public: inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; } public slots: - virtual QVariantList requestBacklog(BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1); - inline virtual void receiveBacklog(BufferId, MsgId, MsgId, int, QVariantList) {}; + virtual QVariantList requestBacklog(BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1, int additional = 0); + inline virtual void receiveBacklog(BufferId, MsgId, MsgId, int, int, QVariantList) {}; -signals: - void backlogRequested(BufferId, MsgId, MsgId, int); + virtual QVariantList requestBacklogAll(MsgId first = -1, MsgId last = -1, int limit = -1, int additional = 0); + inline virtual void receiveBacklogAll(MsgId, MsgId, int, int, QVariantList) {}; +signals: + void backlogRequested(BufferId, MsgId, MsgId, int, int); + void backlogAllRequested(MsgId, MsgId, int, int); }; #endif // BACKLOGMANAGER_H diff --git a/src/core/SQL/SQLite/11/select_messagesAllNew.sql b/src/core/SQL/SQLite/11/select_messagesAllNew.sql index 775b4926..a29f094b 100644 --- a/src/core/SQL/SQLite/11/select_messagesAllNew.sql +++ b/src/core/SQL/SQLite/11/select_messagesAllNew.sql @@ -1,6 +1,7 @@ SELECT messageid, bufferid, time, type, flags, sender, message FROM backlog JOIN sender ON backlog.senderid = sender.senderid -WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid) AND backlog.messageid >= :firstmsg -ORDER BY messageid DESC; +WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid) + AND backlog.messageid >= :firstmsg +ORDER BY messageid DESC LIMIT :limit diff --git a/src/core/core.h b/src/core/core.h index e991da30..083bf8cf 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -232,13 +232,14 @@ class Core : public QObject { return instance()->storage->requestMsgs(user, bufferId, first, last, limit); } - //! Request all unread messages for all buffers - /** \param first Return messages with MsgId >= first + //! Request a certain number of messages across all buffers + /** \param first if != -1 return only messages with a MsgId >= first + * \param last if != -1 return only messages with a MsgId < last * \param limit Max amount of messages * \return The requested list of messages */ - static inline QList requestAllNewMsgs(UserId user, int first, int limit = -1) { - return instance()->storage->requestAllNewMsgs(user, first, limit); + static inline QList requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1) { + return instance()->storage->requestAllMsgs(user, first, last, limit); } //! Request a list of all buffers known to a user. diff --git a/src/core/corebacklogmanager.cpp b/src/core/corebacklogmanager.cpp index bd1bc4f4..5e3724f3 100644 --- a/src/core/corebacklogmanager.cpp +++ b/src/core/corebacklogmanager.cpp @@ -30,7 +30,7 @@ CoreBacklogManager::CoreBacklogManager(CoreSession *coreSession) { } -QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit) { +QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, MsgId last, int limit, int additional) { QVariantList backlog; QList msgList; msgList = Core::requestMsgs(coreSession()->user(), bufferId, first, last, limit); @@ -41,5 +41,64 @@ QVariantList CoreBacklogManager::requestBacklog(BufferId bufferId, MsgId first, backlog << qVariantFromValue(*msgIter); msgIter++; } + + if(additional) { + if(first != -1) { + last = first; + } else { + last = -1; + if(!msgList.isEmpty()) { + if(msgList.first().msgId() < msgList.last().msgId()) + last = msgList.first().msgId(); + else + last = msgList.last().msgId(); + } + } + msgList = Core::requestMsgs(coreSession()->user(), bufferId, -1, last, additional); + msgIter = msgList.constBegin(); + msgListEnd = msgList.constEnd(); + while(msgIter != msgListEnd) { + backlog << qVariantFromValue(*msgIter); + msgIter++; + } + } + + return backlog; +} + +QVariantList CoreBacklogManager::requestBacklogAll(MsgId first, MsgId last, int limit, int additional) { + qDebug() << "CoreBacklogManager::requestBacklogAll" << first << last << limit << additional; + QVariantList backlog; + QList msgList; + msgList = Core::requestAllMsgs(coreSession()->user(), first, last, limit); + + QList::const_iterator msgIter = msgList.constBegin(); + QList::const_iterator msgListEnd = msgList.constEnd(); + while(msgIter != msgListEnd) { + backlog << qVariantFromValue(*msgIter); + msgIter++; + } + + if(additional) { + if(first != -1) { + last = first; + } else { + last = -1; + if(!msgList.isEmpty()) { + if(msgList.first().msgId() < msgList.last().msgId()) + last = msgList.first().msgId(); + else + last = msgList.last().msgId(); + } + } + msgList = Core::requestAllMsgs(coreSession()->user(), -1, last, additional); + msgIter = msgList.constBegin(); + msgListEnd = msgList.constEnd(); + while(msgIter != msgListEnd) { + backlog << qVariantFromValue(*msgIter); + msgIter++; + } + } + return backlog; } diff --git a/src/core/corebacklogmanager.h b/src/core/corebacklogmanager.h index 54d9f06e..515164d4 100644 --- a/src/core/corebacklogmanager.h +++ b/src/core/corebacklogmanager.h @@ -34,7 +34,8 @@ public: CoreSession *coreSession() { return _coreSession; } public slots: - virtual QVariantList requestBacklog(BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1); + virtual QVariantList requestBacklog(BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1, int additional = 0); + virtual QVariantList requestBacklogAll(MsgId first = -1, MsgId last = -1, int limit = -1, int additional = 0); private: CoreSession *_coreSession; diff --git a/src/core/sql.qrc b/src/core/sql.qrc index e8ce75e1..83eb40d3 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -36,6 +36,7 @@ ./SQL/SQLite/11/select_connected_networks.sql ./SQL/SQLite/11/select_internaluser.sql ./SQL/SQLite/11/select_messages.sql + ./SQL/SQLite/11/select_messagesAll.sql ./SQL/SQLite/11/select_messagesAllNew.sql ./SQL/SQLite/11/select_messagesNew.sql ./SQL/SQLite/11/select_networkExists.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 0d870a6a..79ccd27f 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -728,7 +728,7 @@ QList SqliteStorage::requestMsgs(UserId user, BufferId bufferId, MsgId return messagelist; } -QList SqliteStorage::requestAllNewMsgs(UserId user, int first, int limit) { +QList SqliteStorage::requestAllMsgs(UserId user, MsgId first, MsgId last, int limit) { QList messagelist; QHash bufferInfoHash; @@ -737,17 +737,22 @@ QList SqliteStorage::requestAllNewMsgs(UserId user, int first, int limi } QSqlQuery query(logDb()); - query.prepare(queryString("select_messagesAllNew")); + if(last == -1) { + query.prepare(queryString("select_messagesAllNew")); + } else { + query.prepare(queryString("select_messagesAll")); + query.bindValue(":lastmsg", last.toInt()); + } query.bindValue(":userid", user.toInt()); - query.bindValue(":firstmsg", first); + query.bindValue(":firstmsg", first.toInt()); query.bindValue(":limit", limit); safeExec(query); watchQuery(query); while(query.next()) { - Message msg(QDateTime::fromTime_t(query.value(1).toInt()), - bufferInfoHash[query.value(2).toInt()], + Message msg(QDateTime::fromTime_t(query.value(2).toInt()), + bufferInfoHash[query.value(1).toInt()], (Message::Type)query.value(3).toUInt(), query.value(6).toString(), query.value(5).toString(), diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index f1ccf7ac..e9b2f14d 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -82,7 +82,7 @@ public slots: virtual MsgId logMessage(Message msg); virtual QList requestMsgs(UserId user, BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1); - virtual QList requestAllNewMsgs(UserId user, int first, int limit = -1); + virtual QList requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1); protected: inline virtual QString driverName() { return "QSQLITE"; } diff --git a/src/core/storage.h b/src/core/storage.h index e52a79f1..d0c6afbb 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -299,12 +299,13 @@ public slots: */ virtual QList requestMsgs(UserId user, BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1) = 0; - //! Request all unread messages for all buffers - /** \param first Return messages with MsgId >= first + //! Request a certain number of messages across all buffers + /** \param first if != -1 return only messages with a MsgId >= first + * \param last if != -1 return only messages with a MsgId < last * \param limit Max amount of messages * \return The requested list of messages */ - virtual QList requestAllNewMsgs(UserId user, int first, int limit = -1) = 0; + virtual QList requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1) = 0; signals: //! Sent when a new BufferInfo is created, or an existing one changed somehow.