: SyncableObject(parent)
{}
-BufferSyncer::BufferSyncer(QHash<BufferId, MsgId> lastSeenMsg,
+BufferSyncer::BufferSyncer(QHash<BufferId, MsgId> lastMsg,
+ QHash<BufferId, MsgId> lastSeenMsg,
QHash<BufferId, MsgId> markerLines,
QHash<BufferId, Message::Types> activities,
QHash<BufferId, int> highlightCounts,
QObject* parent)
: SyncableObject(parent)
+ , _lastMsg(std::move(lastMsg))
, _lastSeenMsg(std::move(lastSeenMsg))
, _markerLines(std::move(markerLines))
, _bufferActivities(std::move(activities))
, _highlightCounts(std::move(highlightCounts))
{}
+MsgId BufferSyncer::lastMsg(BufferId buffer) const
+{
+ return _lastMsg.value(buffer, MsgId());
+}
+
MsgId BufferSyncer::lastSeenMsg(BufferId buffer) const
{
return _lastSeenMsg.value(buffer, MsgId());
return true;
}
+QVariantList BufferSyncer::initLastMsg() const
+{
+ QVariantList list;
+ QHash<BufferId, MsgId>::const_iterator iter = _lastMsg.constBegin();
+ while (iter != _lastMsg.constEnd()) {
+ list << QVariant::fromValue<BufferId>(iter.key()) << QVariant::fromValue<MsgId>(iter.value());
+ ++iter;
+ }
+ return list;
+}
+
+void BufferSyncer::initSetLastMsg(const QVariantList& list)
+{
+ _lastMsg.clear();
+ Q_ASSERT(list.count() % 2 == 0);
+ for (int i = 0; i < list.count(); i += 2) {
+ setLastMsg(list.at(i).value<BufferId>(), list.at(i + 1).value<MsgId>());
+ }
+}
+
QVariantList BufferSyncer::initLastSeenMsg() const
{
QVariantList list;
void BufferSyncer::removeBuffer(BufferId buffer)
{
+ if (_lastMsg.contains(buffer))
+ _lastMsg.remove(buffer);
if (_lastSeenMsg.contains(buffer))
_lastSeenMsg.remove(buffer);
if (_markerLines.contains(buffer))
void BufferSyncer::mergeBuffersPermanently(BufferId buffer1, BufferId buffer2)
{
+ setLastMsg(buffer1, std::max(_lastMsg[buffer1], _lastMsg[buffer2]));
setBufferActivity(buffer1, _bufferActivities[buffer1] | _bufferActivities[buffer2]);
setHighlightCount(buffer1, _highlightCounts[buffer1] + _highlightCounts[buffer2]);
+ if (_lastMsg.contains(buffer2))
+ _lastMsg.remove(buffer2);
if (_lastSeenMsg.contains(buffer2))
_lastSeenMsg.remove(buffer2);
if (_markerLines.contains(buffer2))
public:
explicit BufferSyncer(QObject* parent);
- explicit BufferSyncer(QHash<BufferId, MsgId> lastSeenMsg,
+ explicit BufferSyncer(QHash<BufferId, MsgId> lastMsg,
+ QHash<BufferId, MsgId> lastSeenMsg,
QHash<BufferId, MsgId> markerLines,
QHash<BufferId, Message::Types> activities,
QHash<BufferId, int> highlightCounts,
QObject* parent);
MsgId lastSeenMsg(BufferId buffer) const;
+ MsgId lastMsg(BufferId buffer) const;
MsgId markerLine(BufferId buffer) const;
Message::Types activity(BufferId buffer) const;
int highlightCount(BufferId buffer) const;
}
public slots:
+ QVariantList initLastMsg() const;
+ void initSetLastMsg(const QVariantList&);
+
QVariantList initLastSeenMsg() const;
void initSetLastSeenMsg(const QVariantList&);
QVariantList initHighlightCounts() const;
void initSetHighlightCounts(const QVariantList&);
+ virtual inline void setLastMsg(BufferId buffer, const MsgId& msgId)
+ {
+ SYNC(ARG(buffer), ARG(msgId));
+ _lastMsg[buffer] = msgId;
+ emit lastMsgSet(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)
{
virtual inline void markBufferAsRead(BufferId buffer) { SYNC(ARG(buffer)) emit bufferMarkedAsRead(buffer); }
signals:
+ void lastMsgSet(BufferId buffer, const MsgId& msgId);
void lastSeenMsgSet(BufferId buffer, const MsgId& msgId);
void markerLineSet(BufferId buffer, const MsgId& msgId);
void bufferRemoved(BufferId buffer);
bool setMarkerLine(BufferId buffer, const MsgId& msgId);
protected:
+ inline QList<BufferId> lastBufferIds() const { return _lastMsg.keys(); }
inline QList<BufferId> lastSeenBufferIds() const { return _lastSeenMsg.keys(); }
inline QList<BufferId> markerLineBufferIds() const { return _markerLines.keys(); }
inline QHash<BufferId, MsgId> markerLines() const { return _markerLines; }
private:
+ QHash<BufferId, MsgId> _lastMsg;
QHash<BufferId, MsgId> _lastSeenMsg;
QHash<BufferId, MsgId> _markerLines;
QHash<BufferId, Message::Types> _bufferActivities;
--- /dev/null
+SELECT bufferid, lastmsgid
+FROM buffer
+WHERE userid = :userid
--- /dev/null
+SELECT bufferid, lastmsgid
+FROM buffer
+WHERE userid = :userid
*/
QString strictSysIdent(UserId user) const;
+ //! Get a Hash of all last message ids
+ /** This Method is called when the Quassel Core is started to restore the lastMsgIds
+ * \note This method is threadsafe.
+ *
+ * \param user The Owner of the buffers
+ */
+ static inline QHash<BufferId, MsgId> bufferLastMsgIds(UserId user) { return instance()->_storage->bufferLastMsgIds(user); }
+
//! Get a Hash of all last seen message ids
/** This Method is called when the Quassel Core is started to restore the lastSeenMsgIds
* \note This method is threadsafe.
};
CoreBufferSyncer::CoreBufferSyncer(CoreSession* parent)
- : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()),
+ : BufferSyncer(Core::bufferLastMsgIds(parent->user()),
+ Core::bufferLastSeenMsgIds(parent->user()),
Core::bufferMarkerLineMsgIds(parent->user()),
Core::bufferActivities(parent->user()),
Core::highlightCounts(parent->user()),
return true;
}
+QHash<BufferId, MsgId> PostgreSqlStorage::bufferLastMsgIds(UserId user)
+{
+ QHash<BufferId, MsgId> lastMsgHash;
+
+ QSqlDatabase db = logDb();
+ if (!beginReadOnlyTransaction(db)) {
+ qWarning() << "PostgreSqlStorage::bufferLastMsgIds(): cannot start read only transaction!";
+ qWarning() << " -" << qPrintable(db.lastError().text());
+ return lastMsgHash;
+ }
+
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_last_messages"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+ if (!watchQuery(query)) {
+ db.rollback();
+ return lastMsgHash;
+ }
+
+ while (query.next()) {
+ lastMsgHash[query.value(0).toInt()] = query.value(1).toLongLong();
+ }
+
+ db.commit();
+ return lastMsgHash;
+}
+
void PostgreSqlStorage::setBufferLastSeenMsg(UserId user, const BufferId& bufferId, const MsgId& msgId)
{
QSqlQuery query(logDb());
bool removeBuffer(const UserId& user, const BufferId& bufferId) override;
bool renameBuffer(const UserId& user, const BufferId& bufferId, const QString& newName) override;
bool mergeBuffersPermanently(const UserId& user, const BufferId& bufferId1, const BufferId& bufferId2) override;
+ QHash<BufferId, MsgId> bufferLastMsgIds(UserId user) override;
void setBufferLastSeenMsg(UserId user, const BufferId& bufferId, const MsgId& msgId) override;
QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user) override;
void setBufferMarkerLineMsg(UserId user, const BufferId& bufferId, const MsgId& msgId) override;
return !error;
}
+QHash<BufferId, MsgId> SqliteStorage::bufferLastMsgIds(UserId user)
+{
+ QHash<BufferId, MsgId> lastMsgHash;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_last_messages"));
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ error = !watchQuery(query);
+ if (!error) {
+ while (query.next()) {
+ lastMsgHash[query.value(0).toInt()] = query.value(1).toLongLong();
+ }
+ }
+ }
+
+ db.commit();
+ unlock();
+ return lastMsgHash;
+}
+
void SqliteStorage::setBufferLastSeenMsg(UserId user, const BufferId& bufferId, const MsgId& msgId)
{
QSqlDatabase db = logDb();
bool removeBuffer(const UserId& user, const BufferId& bufferId) override;
bool renameBuffer(const UserId& user, const BufferId& bufferId, const QString& newName) override;
bool mergeBuffersPermanently(const UserId& user, const BufferId& bufferId1, const BufferId& bufferId2) override;
+ QHash<BufferId, MsgId> bufferLastMsgIds(UserId user) override;
void setBufferLastSeenMsg(UserId user, const BufferId& bufferId, const MsgId& msgId) override;
QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user) override;
void setBufferMarkerLineMsg(UserId user, const BufferId& bufferId, const MsgId& msgId) override;
*/
virtual void setBufferLastSeenMsg(UserId user, const BufferId& bufferId, const MsgId& msgId) = 0;
+ //! Get a Hash of all last message ids
+ /** This Method is called when the Quassel Core is started to restore the lastMsgIds
+ * \param user The Owner of the buffers
+ */
+ virtual QHash<BufferId, MsgId> bufferLastMsgIds(UserId user) = 0;
+
//! Get a Hash of all last seen message ids
/** This Method is called when the Quassel Core is started to restore the lastSeenMsgIds
* \param user The Owner of the buffers