From: Janne Koschinski Date: Sat, 26 Aug 2017 18:25:20 +0000 (+0200) Subject: Implement buffer activity sync X-Git-Tag: travis-deploy-test~248 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=fd16e241d2fd1f33f4625b3255956f025a67273b Implement buffer activity sync --- diff --git a/src/common/buffersyncer.cpp b/src/common/buffersyncer.cpp index a1b5b63b..ca146b55 100644 --- a/src/common/buffersyncer.cpp +++ b/src/common/buffersyncer.cpp @@ -27,10 +27,11 @@ BufferSyncer::BufferSyncer(QObject *parent) } -BufferSyncer::BufferSyncer(const QHash &lastSeenMsg, const QHash &markerLines, QObject *parent) +BufferSyncer::BufferSyncer(const QHash &lastSeenMsg, const QHash &markerLines, const QHash &activities, QObject *parent) : SyncableObject(parent), _lastSeenMsg(lastSeenMsg), - _markerLines(markerLines) + _markerLines(markerLines), + _bufferActivities(activities) { } @@ -124,6 +125,35 @@ void BufferSyncer::initSetMarkerLines(const QVariantList &list) } +QVariantList BufferSyncer::initActivities() const +{ + QVariantList list; + QHash::const_iterator iter = _bufferActivities.constBegin(); + while (iter != _bufferActivities.constEnd()) { + list << QVariant::fromValue(iter.key()) + << QVariant::fromValue((int) iter.value()); + ++iter; + } + return list; +} + + +void BufferSyncer::initSetActivities(const QVariantList &list) +{ + _bufferActivities.clear(); + Q_ASSERT(list.count() % 2 == 0); + for (int i = 0; i < list.count(); i += 2) { + setBufferActivity(list.at(i).value(), list.at(i+1).value()); + } +} + + +Message::Types BufferSyncer::activity(BufferId buffer) const +{ + return _bufferActivities.value(buffer, Message::Types()); +} + + void BufferSyncer::removeBuffer(BufferId buffer) { if (_lastSeenMsg.contains(buffer)) diff --git a/src/common/buffersyncer.h b/src/common/buffersyncer.h index 321b0486..9faadfc6 100644 --- a/src/common/buffersyncer.h +++ b/src/common/buffersyncer.h @@ -23,6 +23,7 @@ #include "syncableobject.h" #include "types.h" +#include "message.h" class BufferSyncer : public SyncableObject { @@ -31,12 +32,13 @@ class BufferSyncer : public SyncableObject public: explicit BufferSyncer(QObject *parent); - explicit BufferSyncer(const QHash &lastSeenMsg, const QHash &markerLines, QObject *parent); + explicit BufferSyncer(const QHash &lastSeenMsg, const QHash &markerLines, const QHash &activities, QObject *parent); inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; } MsgId lastSeenMsg(BufferId buffer) const; MsgId markerLine(BufferId buffer) const; + Message::Types activity(BufferId buffer) const; public slots: QVariantList initLastSeenMsg() const; @@ -45,9 +47,17 @@ public slots: QVariantList initMarkerLines() const; void initSetMarkerLines(const QVariantList &); + QVariantList initActivities() const; + void initSetActivities(const QVariantList &); + virtual inline void requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) } virtual inline void requestSetMarkerLine(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) setMarkerLine(buffer, msgId); } + virtual inline void setBufferActivity(BufferId buffer, const int &activity) { + SYNC(ARG(buffer), ARG(activity)); + _bufferActivities[buffer] = Message::Types(activity); + } + virtual inline void requestRemoveBuffer(BufferId buffer) { REQUEST(ARG(buffer)) } virtual void removeBuffer(BufferId buffer); @@ -82,6 +92,7 @@ protected: private: QHash _lastSeenMsg; QHash _markerLines; + QHash _bufferActivities; }; diff --git a/src/core/SQL/SQLite/select_buffer_bufferactivities.sql b/src/core/SQL/SQLite/select_buffer_bufferactivities.sql new file mode 100644 index 00000000..e40467cd --- /dev/null +++ b/src/core/SQL/SQLite/select_buffer_bufferactivities.sql @@ -0,0 +1,3 @@ +SELECT bufferid, bufferactivity +FROM buffer +WHERE userid = :userid \ No newline at end of file diff --git a/src/core/SQL/SQLite/update_buffer_bufferactivity.sql b/src/core/SQL/SQLite/update_buffer_bufferactivity.sql new file mode 100644 index 00000000..29400b99 --- /dev/null +++ b/src/core/SQL/SQLite/update_buffer_bufferactivity.sql @@ -0,0 +1,3 @@ +UPDATE buffer +SET bufferactivity = :bufferactivity +WHERE userid = :userid AND bufferid = :bufferid \ No newline at end of file diff --git a/src/core/corebuffersyncer.cpp b/src/core/corebuffersyncer.cpp index 98451491..caed62e2 100644 --- a/src/core/corebuffersyncer.cpp +++ b/src/core/corebuffersyncer.cpp @@ -34,17 +34,20 @@ public: INIT_SYNCABLE_OBJECT(CoreBufferSyncer) CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent) - : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), parent), + : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), Core::bufferActivities(parent->user()), parent), _coreSession(parent), _purgeBuffers(false) { + connect(parent, SIGNAL(displayMsg(Message)), SLOT(addBufferActivity(Message))); } void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) { - if (setLastSeenMsg(buffer, msgId)) + if (setLastSeenMsg(buffer, msgId)) { + setBufferActivity(buffer, (int) Core::bufferActivity(buffer, msgId)); dirtyLastSeenBuffers << buffer; + } } @@ -71,8 +74,13 @@ void CoreBufferSyncer::storeDirtyIds() Core::setBufferMarkerLineMsg(userId, bufferId, msgId); } + foreach(BufferId bufferId, dirtyActivities) { + Core::setBufferActivity(userId, bufferId, activity(bufferId)); + } + dirtyLastSeenBuffers.clear(); dirtyMarkerLineBuffers.clear(); + dirtyActivities.clear(); } @@ -181,3 +189,8 @@ void CoreBufferSyncer::purgeBufferIds() } } } + +void CoreBufferSyncer::setBufferActivity(BufferId buffer, const int &activity) { + BufferSyncer::setBufferActivity(buffer, activity); + dirtyActivities << buffer; +} diff --git a/src/core/corebuffersyncer.h b/src/core/corebuffersyncer.h index 16155344..c490419a 100644 --- a/src/core/corebuffersyncer.h +++ b/src/core/corebuffersyncer.h @@ -40,6 +40,15 @@ public slots: virtual inline void requestRemoveBuffer(BufferId buffer) { removeBuffer(buffer); } virtual void removeBuffer(BufferId bufferId); + void addBufferActivity(Message message) { + auto oldActivity = activity(message.bufferId()); + if (!oldActivity.testFlag(message.type())) { + setBufferActivity(message.bufferId(), (int) (oldActivity | message.type())); + } + } + + void setBufferActivity(BufferId buffer, const int &activity) override; + virtual inline void requestRenameBuffer(BufferId buffer, QString newName) { renameBuffer(buffer, newName); } virtual void renameBuffer(BufferId buffer, QString newName); @@ -48,7 +57,10 @@ public slots: virtual void requestPurgeBufferIds(); - virtual inline void requestMarkBufferAsRead(BufferId buffer) { markBufferAsRead(buffer); } + virtual inline void requestMarkBufferAsRead(BufferId buffer) { + setLastSeenMsg(buffer, (int) Message::Types()); + markBufferAsRead(buffer); + } void storeDirtyIds(); @@ -61,6 +73,7 @@ private: QSet dirtyLastSeenBuffers; QSet dirtyMarkerLineBuffers; + QSet dirtyActivities; void purgeBufferIds(); }; diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index f07b1082..78c3dc42 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -1426,7 +1426,7 @@ QHash PostgreSqlStorage::bufferActivities(UserId user) return bufferActivityHash; } -Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) +Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId) { QSqlQuery query(logDb()); query.prepare(queryString("select_buffer_bufferactivity")); diff --git a/src/core/postgresqlstorage.h b/src/core/postgresqlstorage.h index 06edadbb..ca6e90fc 100644 --- a/src/core/postgresqlstorage.h +++ b/src/core/postgresqlstorage.h @@ -98,7 +98,7 @@ public slots: virtual QHash bufferMarkerLineMsgIds(UserId user); virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type); virtual QHash bufferActivities(UserId id); - virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId); + virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId); /* Message handling */ virtual bool logMessage(Message &msg); diff --git a/src/core/sql.qrc b/src/core/sql.qrc index c5f1c549..b99a8e0f 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -143,6 +143,7 @@ ./SQL/SQLite/select_authuser.sql ./SQL/SQLite/select_bufferByName.sql ./SQL/SQLite/select_bufferExists.sql + ./SQL/SQLite/select_buffer_bufferactivities.sql ./SQL/SQLite/select_buffer_bufferactivity.sql ./SQL/SQLite/select_buffer_by_id.sql ./SQL/SQLite/select_buffer_lastseen_messages.sql @@ -186,6 +187,7 @@ ./SQL/SQLite/setup_130_identity.sql ./SQL/SQLite/setup_140_identity_nick.sql ./SQL/SQLite/update_backlog_bufferid.sql + ./SQL/SQLite/update_buffer_bufferactivity.sql ./SQL/SQLite/update_buffer_lastseen.sql ./SQL/SQLite/update_buffer_markerlinemsgid.sql ./SQL/SQLite/update_buffer_name.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index bdd3c18d..78b688a2 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -1553,7 +1553,7 @@ QHash SqliteStorage::bufferActivities(UserId user) } -Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) +Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId) { QSqlDatabase db = logDb(); db.transaction(); diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index a161b4e9..8b6e1bb1 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -99,7 +99,7 @@ public slots: virtual QHash bufferMarkerLineMsgIds(UserId user); virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type); virtual QHash bufferActivities(UserId id); - virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId); + virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId); /* Message handling */ virtual bool logMessage(Message &msg); diff --git a/src/core/storage.h b/src/core/storage.h index 62af0d80..32018f43 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -409,7 +409,7 @@ public slots: * \param bufferId The buffer * \param lastSeenMsgId The last seen message */ - virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) = 0; + virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId) = 0; /* Message handling */