-INSERT INTO buffer (bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastmsgid, lastseenmsgid, markerlinemsgid, key, joined)
+INSERT INTO buffer (bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastmsgid, lastseenmsgid, markerlinemsgid, bufferactivity, key, joined)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
--- /dev/null
+SELECT bufferid, bufferactivity
+FROM buffer
+WHERE userid = :userid
\ No newline at end of file
--- /dev/null
+SELECT COALESCE(SUM(t.type),0)
+FROM
+ (SELECT DISTINCT TYPE
+ FROM backlog
+ WHERE bufferid = :bufferid
+ AND messageid > :lastseenmsgid) t;
\ No newline at end of file
lastmsgid integer NOT NULL DEFAULT 0,
lastseenmsgid integer NOT NULL DEFAULT 0,
markerlinemsgid integer NOT NULL DEFAULT 0,
+ bufferactivity integer NOT NULL DEFAULT 0,
key varchar(128),
joined boolean NOT NULL DEFAULT FALSE, -- BOOL
UNIQUE(userid, networkid, buffercname),
--- /dev/null
+UPDATE buffer
+SET bufferactivity = :bufferactivity
+WHERE userid = :userid AND bufferid = :bufferid
\ No newline at end of file
--- /dev/null
+ALTER TABLE buffer
+ADD COLUMN bufferactivity integer NOT NULL DEFAULT 0
\ No newline at end of file
-SELECT bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastmsgid, lastseenmsgid, markerlinemsgid, key, joined
+SELECT bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastmsgid, lastseenmsgid, markerlinemsgid, bufferactivity, key, joined
FROM buffer
--- /dev/null
+SELECT COALESCE(SUM(t.type),0)
+FROM
+ (SELECT DISTINCT TYPE
+ FROM backlog
+ WHERE bufferid = :bufferid
+ AND messageid > :lastseenmsgid) t;
\ No newline at end of file
lastmsgid INTEGER NOT NULL DEFAULT 0,
lastseenmsgid INTEGER NOT NULL DEFAULT 0,
markerlinemsgid INTEGER NOT NULL DEFAULT 0,
+ bufferactivity INTEGER NOT NULL DEFAULT 0,
key TEXT,
joined INTEGER NOT NULL DEFAULT 0, -- BOOL
CHECK (lastseenmsgid <= lastmsgid)
--- /dev/null
+ALTER TABLE buffer
+ADD COLUMN bufferactivity integer NOT NULL DEFAULT 0
\ No newline at end of file
int lastmsgid;
int lastseenmsgid;
int markerlinemsgid;
+ int bufferactivity;
QString key;
bool joined;
};
return markerLineHash;
}
+
+void PostgreSqlStorage::setBufferActivity(UserId user, const BufferId &bufferId, const int &bufferActivity)
+{
+ QSqlQuery query(logDb());
+ query.prepare(queryString("update_buffer_bufferactivity"));
+
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":bufferactivity", bufferActivity);
+ safeExec(query);
+ watchQuery(query);
+}
+
+QHash<BufferId, int> PostgreSqlStorage::bufferActivities(UserId user)
+{
+ QHash<BufferId, int> bufferActivityHash;
+
+ QSqlDatabase db = logDb();
+ if (!beginReadOnlyTransaction(db)) {
+ qWarning() << "PostgreSqlStorage::bufferActivities(): cannot start read only transaction!";
+ qWarning() << " -" << qPrintable(db.lastError().text());
+ return bufferActivityHash;
+ }
+
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_bufferactivity"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+ if (!watchQuery(query)) {
+ db.rollback();
+ return bufferActivityHash;
+ }
+
+ while (query.next()) {
+ bufferActivityHash[query.value(0).toInt()] = (Message::Type) query.value(1).toInt();
+ }
+
+ db.commit();
+ return bufferActivityHash;
+}
+
+int PostgreSqlStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+{
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_buffer_bufferactivity"));
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":lastseenmsgid", lastSeenMsgId.toInt());
+ safeExec(query);
+ watchQuery(query);
+ int result = 0;
+ if (query.first())
+ result = query.value(0).toInt();
+ return result;
+}
+
bool PostgreSqlStorage::logMessage(Message &msg)
{
QSqlDatabase db = logDb();
bindValue(7, buffer.lastmsgid);
bindValue(8, buffer.lastseenmsgid);
bindValue(9, buffer.markerlinemsgid);
- bindValue(10, buffer.key);
- bindValue(11, buffer.joined);
+ bindValue(10, buffer.bufferactivity);
+ bindValue(11, buffer.key);
+ bindValue(12, buffer.joined);
return exec();
}
virtual QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user);
virtual void setBufferMarkerLineMsg(UserId user, const BufferId &bufferId, const MsgId &msgId);
virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
+ virtual void setBufferActivity(UserId id, const BufferId &bufferId, const int &type);
+ virtual QHash<BufferId, int> bufferActivities(UserId id);
+ virtual int bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
/* Message handling */
virtual bool logMessage(Message &msg);
<file>./SQL/PostgreSQL/select_authuser.sql</file>
<file>./SQL/PostgreSQL/select_bufferByName.sql</file>
<file>./SQL/PostgreSQL/select_bufferExists.sql</file>
+ <file>./SQL/PostgreSQL/select_buffer_bufferactivities.sql</file>
+ <file>./SQL/PostgreSQL/select_buffer_bufferactivity.sql</file>
<file>./SQL/PostgreSQL/select_buffer_by_id.sql</file>
<file>./SQL/PostgreSQL/select_buffer_lastseen_messages.sql</file>
<file>./SQL/PostgreSQL/select_buffer_markerlinemsgids.sql</file>
<file>./SQL/PostgreSQL/setup_120_alter_messageid_seq.sql</file>
<file>./SQL/PostgreSQL/setup_130_function_lastmsgid.sql</file>
<file>./SQL/PostgreSQL/update_backlog_bufferid.sql</file>
+ <file>./SQL/PostgreSQL/update_buffer_bufferactivity.sql</file>
<file>./SQL/PostgreSQL/update_buffer_lastseen.sql</file>
<file>./SQL/PostgreSQL/update_buffer_markerlinemsgid.sql</file>
<file>./SQL/PostgreSQL/update_buffer_name.sql</file>
<file>./SQL/PostgreSQL/version/21/upgrade_000_add_function_backlog_lastmsgid_update.sql</file>
<file>./SQL/PostgreSQL/version/21/upgrade_001_add_trigger_backlog_lastmsgid_update.sql</file>
<file>./SQL/PostgreSQL/version/22/upgrade_000_alter_quasseluser_add_authenticator.sql</file>
+ <file>./SQL/PostgreSQL/version/23/upgrade_000_alter_buffer_add_bufferactivity.sql</file>
<file>./SQL/PostgreSQL/version/23/upgrade_000_create_senderprefixes.sql</file>
<file>./SQL/SQLite/delete_backlog_by_uid.sql</file>
<file>./SQL/SQLite/delete_backlog_for_buffer.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_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_markerlinemsgids.sql</file>
<file>./SQL/SQLite/version/22/upgrade_000_add_trigger_backlog_lastmsgid_update_direct_insert.sql</file>
<file>./SQL/SQLite/version/22/upgrade_001_add_trigger_backlog_lastmsgid_update_direct_update.sql</file>
<file>./SQL/SQLite/version/23/upgrade_000_alter_quasseluser_add_authenticator.sql</file>
+ <file>./SQL/SQLite/version/24/upgrade_000_alter_buffer_add_bufferactivity.sql</file>
<file>./SQL/SQLite/version/24/upgrade_000_create_senderprefixes.sql</file>
</qresource>
</RCC>
return markerLineHash;
}
+void SqliteStorage::setBufferActivity(UserId user, const BufferId &bufferId, const int &bufferActivity)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_buffer_bufferactivity"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":bufferactivity", bufferActivity);
+
+ lockForWrite();
+ safeExec(query);
+ watchQuery(query);
+ }
+ db.commit();
+ unlock();
+}
+
+
+QHash<BufferId, int> SqliteStorage::bufferActivities(UserId user)
+{
+ QHash<BufferId, int> bufferActivityHash;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_bufferactivities"));
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ error = !watchQuery(query);
+ if (!error) {
+ while (query.next()) {
+ bufferActivityHash[query.value(0).toInt()] = (Message::Type) query.value(1).toInt();
+ }
+ }
+ }
+
+ db.commit();
+ unlock();
+ return bufferActivityHash;
+}
+
+
+int SqliteStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ int result = 0;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_bufferactivity"));
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":lastseenmsgid", lastSeenMsgId.toInt());
+
+ lockForRead();
+ safeExec(query);
+ if (query.first())
+ result = query.value(0).toInt();
+ }
+
+ db.commit();
+ unlock();
+ return result;
+}
+
bool SqliteStorage::logMessage(Message &msg)
{
QSqlDatabase db = logDb();
buffer.lastmsgid = value(7).toInt();
buffer.lastseenmsgid = value(8).toInt();
buffer.markerlinemsgid = value(9).toInt();
- buffer.key = value(10).toString();
- buffer.joined = value(11).toInt() == 1 ? true : false;
+ buffer.bufferactivity = value(10).toInt();
+ buffer.key = value(11).toString();
+ buffer.joined = value(12).toInt() == 1 ? true : false;
return true;
}
virtual QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user);
virtual void setBufferMarkerLineMsg(UserId user, const BufferId &bufferId, const MsgId &msgId);
virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
+ virtual void setBufferActivity(UserId id, const BufferId &bufferId, const int &type);
+ virtual QHash<BufferId, int> bufferActivities(UserId id);
+ virtual int bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
/* Message handling */
virtual bool logMessage(Message &msg);
*/
virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user) = 0;
+ //! Update the BufferActivity for a Buffer
+ /** This Method is used to make the activity state of a Buffer persistent
+ * \note This method is threadsafe.
+ *
+ * \param user The Owner of that Buffer
+ * \param bufferId The buffer id
+ * \param MsgId The Message id where the marker line should be placed
+ */
+ virtual void setBufferActivity(UserId id, const BufferId &bufferId, const int &type) = 0;
+
+ //! Get a Hash of all buffer activity states
+ /** This Method is called when the Quassel Core is started to restore the BufferActivities
+ * \note This method is threadsafe.
+ *
+ * \param user The Owner of the buffers
+ */
+ virtual QHash<BufferId, int> bufferActivities(UserId id) = 0;
+
+ //! Get the bitset of buffer activity states for a buffer
+ /** This method is used to load the activity state of a buffer when its last seen message changes.
+ * \note This method is threadsafe.
+ *
+ * \param bufferId The buffer
+ * \param lastSeenMsgId The last seen message
+ */
+ virtual int bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) = 0;
+
/* Message handling */
//! Store a Message in the storage backend and set its unique Id.