Implement buffer activity sync
authorJanne Koschinski <janne@kuschku.de>
Sat, 26 Aug 2017 18:25:20 +0000 (20:25 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 19 Dec 2017 20:08:18 +0000 (21:08 +0100)
12 files changed:
src/common/buffersyncer.cpp
src/common/buffersyncer.h
src/core/SQL/SQLite/select_buffer_bufferactivities.sql [new file with mode: 0644]
src/core/SQL/SQLite/update_buffer_bufferactivity.sql [new file with mode: 0644]
src/core/corebuffersyncer.cpp
src/core/corebuffersyncer.h
src/core/postgresqlstorage.cpp
src/core/postgresqlstorage.h
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h

index a1b5b63..ca146b5 100644 (file)
@@ -27,10 +27,11 @@ BufferSyncer::BufferSyncer(QObject *parent)
 }
 
 
 }
 
 
-BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent)
+BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent)
     : SyncableObject(parent),
     _lastSeenMsg(lastSeenMsg),
     : 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<BufferId, Message::Types>::const_iterator iter = _bufferActivities.constBegin();
+    while (iter != _bufferActivities.constEnd()) {
+        list << QVariant::fromValue<BufferId>(iter.key())
+             << QVariant::fromValue<int>((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<BufferId>(), list.at(i+1).value<int>());
+    }
+}
+
+
+Message::Types BufferSyncer::activity(BufferId buffer) const
+{
+    return _bufferActivities.value(buffer, Message::Types());
+}
+
+
 void BufferSyncer::removeBuffer(BufferId buffer)
 {
     if (_lastSeenMsg.contains(buffer))
 void BufferSyncer::removeBuffer(BufferId buffer)
 {
     if (_lastSeenMsg.contains(buffer))
index 321b048..9faadfc 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "syncableobject.h"
 #include "types.h"
 
 #include "syncableobject.h"
 #include "types.h"
+#include "message.h"
 
 class BufferSyncer : public SyncableObject
 {
 
 class BufferSyncer : public SyncableObject
 {
@@ -31,12 +32,13 @@ class BufferSyncer : public SyncableObject
 
 public:
     explicit BufferSyncer(QObject *parent);
 
 public:
     explicit BufferSyncer(QObject *parent);
-    explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent);
+    explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent);
 
     inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; }
 
     MsgId lastSeenMsg(BufferId buffer) const;
     MsgId markerLine(BufferId buffer) const;
 
     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;
 
 public slots:
     QVariantList initLastSeenMsg() const;
@@ -45,9 +47,17 @@ public slots:
     QVariantList initMarkerLines() const;
     void initSetMarkerLines(const QVariantList &);
 
     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 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);
 
     virtual inline void requestRemoveBuffer(BufferId buffer) { REQUEST(ARG(buffer)) }
     virtual void removeBuffer(BufferId buffer);
 
@@ -82,6 +92,7 @@ protected:
 private:
     QHash<BufferId, MsgId> _lastSeenMsg;
     QHash<BufferId, MsgId> _markerLines;
 private:
     QHash<BufferId, MsgId> _lastSeenMsg;
     QHash<BufferId, MsgId> _markerLines;
+    QHash<BufferId, Message::Types> _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 (file)
index 0000000..e40467c
--- /dev/null
@@ -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 (file)
index 0000000..29400b9
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE buffer
+SET bufferactivity = :bufferactivity
+WHERE userid = :userid AND bufferid = :bufferid
\ No newline at end of file
index 9845149..caed62e 100644 (file)
@@ -34,17 +34,20 @@ public:
 
 INIT_SYNCABLE_OBJECT(CoreBufferSyncer)
 CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent)
 
 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)
 {
     _coreSession(parent),
     _purgeBuffers(false)
 {
+    connect(parent, SIGNAL(displayMsg(Message)), SLOT(addBufferActivity(Message)));
 }
 
 
 void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId)
 {
 }
 
 
 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;
         dirtyLastSeenBuffers << buffer;
+    }
 }
 
 
 }
 
 
@@ -71,8 +74,13 @@ void CoreBufferSyncer::storeDirtyIds()
             Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
     }
 
             Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
     }
 
+    foreach(BufferId bufferId, dirtyActivities) {
+        Core::setBufferActivity(userId, bufferId, activity(bufferId));
+    }
+
     dirtyLastSeenBuffers.clear();
     dirtyMarkerLineBuffers.clear();
     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;
+}
index 1615534..c490419 100644 (file)
@@ -40,6 +40,15 @@ public slots:
     virtual inline void requestRemoveBuffer(BufferId buffer) { removeBuffer(buffer); }
     virtual void removeBuffer(BufferId bufferId);
 
     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);
 
     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 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();
 
 
     void storeDirtyIds();
 
@@ -61,6 +73,7 @@ private:
 
     QSet<BufferId> dirtyLastSeenBuffers;
     QSet<BufferId> dirtyMarkerLineBuffers;
 
     QSet<BufferId> dirtyLastSeenBuffers;
     QSet<BufferId> dirtyMarkerLineBuffers;
+    QSet<BufferId> dirtyActivities;
 
     void purgeBufferIds();
 };
 
     void purgeBufferIds();
 };
index f07b108..78c3dc4 100644 (file)
@@ -1426,7 +1426,7 @@ QHash<BufferId, Message::Types> PostgreSqlStorage::bufferActivities(UserId user)
     return bufferActivityHash;
 }
 
     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"));
 {
     QSqlQuery query(logDb());
     query.prepare(queryString("select_buffer_bufferactivity"));
index 06edadb..ca6e90f 100644 (file)
@@ -98,7 +98,7 @@ public slots:
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> 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);
 
     /* Message handling */
     virtual bool logMessage(Message &msg);
index c5f1c54..b99a8e0 100644 (file)
     <file>./SQL/SQLite/select_authuser.sql</file>
     <file>./SQL/SQLite/select_bufferByName.sql</file>
     <file>./SQL/SQLite/select_bufferExists.sql</file>
     <file>./SQL/SQLite/select_authuser.sql</file>
     <file>./SQL/SQLite/select_bufferByName.sql</file>
     <file>./SQL/SQLite/select_bufferExists.sql</file>
+    <file>./SQL/SQLite/select_buffer_bufferactivities.sql</file>
     <file>./SQL/SQLite/select_buffer_bufferactivity.sql</file>
     <file>./SQL/SQLite/select_buffer_by_id.sql</file>
     <file>./SQL/SQLite/select_buffer_lastseen_messages.sql</file>
     <file>./SQL/SQLite/select_buffer_bufferactivity.sql</file>
     <file>./SQL/SQLite/select_buffer_by_id.sql</file>
     <file>./SQL/SQLite/select_buffer_lastseen_messages.sql</file>
     <file>./SQL/SQLite/setup_130_identity.sql</file>
     <file>./SQL/SQLite/setup_140_identity_nick.sql</file>
     <file>./SQL/SQLite/update_backlog_bufferid.sql</file>
     <file>./SQL/SQLite/setup_130_identity.sql</file>
     <file>./SQL/SQLite/setup_140_identity_nick.sql</file>
     <file>./SQL/SQLite/update_backlog_bufferid.sql</file>
+    <file>./SQL/SQLite/update_buffer_bufferactivity.sql</file>
     <file>./SQL/SQLite/update_buffer_lastseen.sql</file>
     <file>./SQL/SQLite/update_buffer_markerlinemsgid.sql</file>
     <file>./SQL/SQLite/update_buffer_name.sql</file>
     <file>./SQL/SQLite/update_buffer_lastseen.sql</file>
     <file>./SQL/SQLite/update_buffer_markerlinemsgid.sql</file>
     <file>./SQL/SQLite/update_buffer_name.sql</file>
index bdd3c18..78b688a 100644 (file)
@@ -1553,7 +1553,7 @@ QHash<BufferId, Message::Types> 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();
 {
     QSqlDatabase db = logDb();
     db.transaction();
index a161b4e..8b6e1bb 100644 (file)
@@ -99,7 +99,7 @@ public slots:
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
     virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
     virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
     virtual QHash<BufferId, Message::Types> 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);
 
     /* Message handling */
     virtual bool logMessage(Message &msg);
index 62af0d8..32018f4 100644 (file)
@@ -409,7 +409,7 @@ public slots:
      * \param bufferId The buffer
      * \param lastSeenMsgId     The last seen message
      */
      * \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 */
 
 
     /* Message handling */