switching from timestamps to msgid regarding lastseen states
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 9 Mar 2008 15:01:59 +0000 (15:01 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 9 Mar 2008 15:01:59 +0000 (15:01 +0000)
76 files changed:
src/client/buffer.cpp
src/client/buffer.h
src/client/client.cpp
src/client/client.h
src/common/buffersyncer.cpp
src/common/buffersyncer.h
src/core/SQL/SQLite/10/delete_backlog_by_uid.sql [moved from src/core/SQL/SQLite/9/delete_backlog_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_backlog_for_buffer.sql [moved from src/core/SQL/SQLite/9/delete_backlog_for_buffer.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_backlog_for_network.sql [moved from src/core/SQL/SQLite/9/delete_backlog_for_network.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_buffer_for_bufferid.sql [moved from src/core/SQL/SQLite/9/delete_buffer_for_bufferid.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_buffers_by_uid.sql [moved from src/core/SQL/SQLite/9/delete_buffers_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_buffers_for_network.sql [moved from src/core/SQL/SQLite/9/delete_buffers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_ircservers_for_network.sql [moved from src/core/SQL/SQLite/9/delete_ircservers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_network.sql [moved from src/core/SQL/SQLite/9/delete_network.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_networks_by_uid.sql [moved from src/core/SQL/SQLite/9/delete_networks_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/10/delete_quasseluser.sql [moved from src/core/SQL/SQLite/9/delete_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_buffer.sql [moved from src/core/SQL/SQLite/9/insert_buffer.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_message.sql [moved from src/core/SQL/SQLite/9/insert_message.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_network.sql [moved from src/core/SQL/SQLite/9/insert_network.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_quasseluser.sql [moved from src/core/SQL/SQLite/9/insert_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_sender.sql [moved from src/core/SQL/SQLite/9/insert_sender.sql with 100% similarity]
src/core/SQL/SQLite/10/insert_server.sql [moved from src/core/SQL/SQLite/9/insert_server.sql with 100% similarity]
src/core/SQL/SQLite/10/select_authuser.sql [moved from src/core/SQL/SQLite/9/select_authuser.sql with 100% similarity]
src/core/SQL/SQLite/10/select_bufferByName.sql [moved from src/core/SQL/SQLite/9/select_bufferByName.sql with 100% similarity]
src/core/SQL/SQLite/10/select_bufferExists.sql [moved from src/core/SQL/SQLite/9/select_bufferExists.sql with 100% similarity]
src/core/SQL/SQLite/10/select_buffer_by_id.sql [moved from src/core/SQL/SQLite/9/select_buffer_by_id.sql with 100% similarity]
src/core/SQL/SQLite/10/select_buffer_lastseen_messages.sql [moved from src/core/SQL/SQLite/9/select_buffer_lastseen_dates.sql with 53% similarity]
src/core/SQL/SQLite/10/select_buffers.sql [moved from src/core/SQL/SQLite/9/select_buffers.sql with 100% similarity]
src/core/SQL/SQLite/10/select_connected_networks.sql [moved from src/core/SQL/SQLite/9/select_connected_networks.sql with 100% similarity]
src/core/SQL/SQLite/10/select_messageRange.sql [moved from src/core/SQL/SQLite/9/select_messageRange.sql with 100% similarity]
src/core/SQL/SQLite/10/select_messages.sql [moved from src/core/SQL/SQLite/9/select_messages.sql with 100% similarity]
src/core/SQL/SQLite/10/select_messagesOffset.sql [moved from src/core/SQL/SQLite/9/select_messagesOffset.sql with 100% similarity]
src/core/SQL/SQLite/10/select_messagesSince.sql [moved from src/core/SQL/SQLite/9/select_messagesSince.sql with 100% similarity]
src/core/SQL/SQLite/10/select_messagesSinceOffset.sql [moved from src/core/SQL/SQLite/9/select_messagesSinceOffset.sql with 100% similarity]
src/core/SQL/SQLite/10/select_networkExists.sql [moved from src/core/SQL/SQLite/9/select_networkExists.sql with 100% similarity]
src/core/SQL/SQLite/10/select_networks_for_user.sql [moved from src/core/SQL/SQLite/9/select_networks_for_user.sql with 100% similarity]
src/core/SQL/SQLite/10/select_persistent_channels.sql [moved from src/core/SQL/SQLite/9/select_persistent_channels.sql with 100% similarity]
src/core/SQL/SQLite/10/select_servers_for_network.sql [moved from src/core/SQL/SQLite/9/select_servers_for_network.sql with 100% similarity]
src/core/SQL/SQLite/10/select_userid.sql [moved from src/core/SQL/SQLite/9/select_userid.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_000_quasseluser.sql [moved from src/core/SQL/SQLite/9/setup_000_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_010_sender.sql [moved from src/core/SQL/SQLite/9/setup_010_sender.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_020_network.sql [moved from src/core/SQL/SQLite/9/setup_020_network.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_030_buffer.sql [moved from src/core/SQL/SQLite/9/setup_030_buffer.sql with 88% similarity]
src/core/SQL/SQLite/10/setup_040_buffer_idx.sql [moved from src/core/SQL/SQLite/9/setup_040_buffer_idx.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_050_buffer_cname_idx.sql [moved from src/core/SQL/SQLite/9/setup_050_buffer_cname_idx.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_060_backlog.sql [moved from src/core/SQL/SQLite/9/setup_060_backlog.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_070_coreinfo.sql [moved from src/core/SQL/SQLite/9/setup_070_coreinfo.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_080_ircservers.sql [moved from src/core/SQL/SQLite/9/setup_080_ircservers.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_090_create_backlog_idx.sql [moved from src/core/SQL/SQLite/9/setup_090_create_backlog_idx.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_100_create_backlog_idx2.sql [moved from src/core/SQL/SQLite/9/setup_100_create_backlog_idx2.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_110_create_buffer_idx.sql [moved from src/core/SQL/SQLite/9/setup_110_create_buffer_idx.sql with 100% similarity]
src/core/SQL/SQLite/10/setup_999_version.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/update_buffer_lastseen.sql [moved from src/core/SQL/SQLite/9/update_buffer_lastseen.sql with 63% similarity]
src/core/SQL/SQLite/10/update_buffer_name.sql [moved from src/core/SQL/SQLite/9/update_buffer_name.sql with 100% similarity]
src/core/SQL/SQLite/10/update_buffer_persistent_channel.sql [moved from src/core/SQL/SQLite/9/update_buffer_persistent_channel.sql with 100% similarity]
src/core/SQL/SQLite/10/update_buffer_set_channel_key.sql [moved from src/core/SQL/SQLite/9/update_buffer_set_channel_key.sql with 100% similarity]
src/core/SQL/SQLite/10/update_network.sql [moved from src/core/SQL/SQLite/9/update_network.sql with 100% similarity]
src/core/SQL/SQLite/10/update_network_connected.sql [moved from src/core/SQL/SQLite/9/update_network_connected.sql with 100% similarity]
src/core/SQL/SQLite/10/update_username.sql [moved from src/core/SQL/SQLite/9/update_username.sql with 100% similarity]
src/core/SQL/SQLite/10/update_userpassword.sql [moved from src/core/SQL/SQLite/9/update_userpassword.sql with 100% similarity]
src/core/SQL/SQLite/10/upgrade_000_switch_to_msgid.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/upgrade_010_rename_buffer_table.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/upgrade_020_create_buffer_table.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/upgrade_030_copy_buffer_table.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql [new file with mode: 0644]
src/core/SQL/SQLite/10/upgrade_999_version.sql [new file with mode: 0644]
src/core/SQL/SQLite/9/setup_999_version.sql [deleted file]
src/core/core.cpp
src/core/core.h
src/core/coresession.cpp
src/core/coresession.h
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h
version.inc

index 14de0d4..1fc9846 100644 (file)
@@ -75,13 +75,16 @@ void Buffer::setVisible(bool visible) {
   _isVisible = visible;
   setActivityLevel(NoActivity);
   if(!layoutedMsgs.count()) return;
-  setLastSeen(layoutedMsgs.last()->timestamp());
+  setLastSeenMsg(layoutedMsgs.last()->msgId());
 }
 
-void Buffer::setLastSeen(const QDateTime &seen) { // qDebug() << "want to set lastSeen:" << bufferInfo() << seen << lastSeen();
-  if(!lastSeen().isValid() || seen.isValid() && seen > lastSeen()) { //qDebug() << "setting:" << bufferInfo().bufferName() << seen;
-    _lastSeen = seen;
-    Client::setBufferLastSeen(bufferInfo().bufferId(), seen);
+void Buffer::setLastSeenMsg(const MsgId &msgId) {
+  // qDebug() << "want to set lastSeen:" << bufferInfo() << seen << lastSeen();
+  const MsgId oldLastSeen = lastSeenMsg();
+  if(!oldLastSeen.isValid() || msgId.isValid() && msgId > oldLastSeen) {
+    //qDebug() << "setting:" << bufferInfo().bufferName() << seen;
+    _lastSeenMsg = msgId;
+    Client::setBufferLastSeenMsg(bufferInfo().bufferId(), msgId);
     //qDebug() << "setting lastSeen:" << bufferInfo() << lastSeen();
     setActivityLevel(NoActivity);
   }
@@ -102,7 +105,7 @@ void Buffer::updateActivityLevel(const Message &msg) {
   if(msg.flags() & Message::Self)      // don't update activity for our own messages
     return;
 
-  if(lastSeen().isValid() && lastSeen() >= msg.timestamp())
+  if(lastSeenMsg().isValid() && lastSeenMsg() >= msg.msgId())
     return;
 
   ActivityLevel level = activityLevel() | OtherActivity;
index def01bd..afaa07f 100644 (file)
@@ -52,7 +52,7 @@ public:
   BufferInfo bufferInfo() const;
   QList<AbstractUiMsg *> contents() const;
   inline bool isVisible() const { return _isVisible; }
-  inline QDateTime lastSeen() const { return _lastSeen; }
+  inline MsgId lastSeenMsg() const { return _lastSeenMsg; }
   inline ActivityLevel activityLevel() const { return _activityLevel; }
 
 signals:
@@ -65,13 +65,13 @@ public slots:
   void prependMsg(const Message &);
   bool layoutMsg();
   void setVisible(bool visible);
-  void setLastSeen(const QDateTime &);
+  void setLastSeenMsg(const MsgId &msgId);
   void setActivityLevel(ActivityLevel level);
 
 private:
   BufferInfo _bufferInfo;
   bool _isVisible;
-  QDateTime _lastSeen;
+  MsgId _lastSeenMsg;
   ActivityLevel _activityLevel;
 
   QList<Message> layoutQueue;
index 4579731..c90bcf6 100644 (file)
@@ -297,7 +297,7 @@ void Client::setSyncedToCore() {
   // create buffersyncer
   Q_ASSERT(!_bufferSyncer);
   _bufferSyncer = new BufferSyncer(this);
-  connect(bufferSyncer(), SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(updateLastSeen(BufferId, const QDateTime &)));
+  connect(bufferSyncer(), SIGNAL(lastSeenMsgSet(BufferId, MsgId)), this, SLOT(updateLastSeenMsg(BufferId, MsgId)));
   connect(bufferSyncer(), SIGNAL(bufferRemoved(BufferId)), this, SLOT(bufferRemoved(BufferId)));
   connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString)));
   signalProxy()->synchronize(bufferSyncer());
@@ -516,18 +516,19 @@ void Client::checkForHighlight(Message &msg) {
   }
 }
 
-void Client::updateLastSeen(BufferId id, const QDateTime &lastSeen) {
+void Client::updateLastSeenMsg(BufferId id, const MsgId &msgId) {
   Buffer *b = buffer(id);
   if(!b) {
     qWarning() << "Client::updateLastSeen(): Unknown buffer" << id;
     return;
   }
-  b->setLastSeen(lastSeen);
+  b->setLastSeenMsg(msgId);
 }
 
-void Client::setBufferLastSeen(BufferId id, const QDateTime &lastSeen) {
-  if(!bufferSyncer()) return;
-  bufferSyncer()->requestSetLastSeen(id, lastSeen);
+void Client::setBufferLastSeenMsg(BufferId id, const MsgId &msgId) {
+  if(!bufferSyncer())
+    return;
+  bufferSyncer()->requestSetLastSeenMsg(id, msgId);
 }
 
 void Client::removeBuffer(BufferId id) {
index 4d1bad6..b51cc50 100644 (file)
@@ -106,7 +106,7 @@ public:
   enum ClientMode { LocalCore, RemoteCore };
 
   static void checkForHighlight(Message &msg);
-  static void setBufferLastSeen(BufferId id, const QDateTime &seen); // this is synced to core and other clients
+  static void setBufferLastSeenMsg(BufferId id, const MsgId &msgId); // this is synced to core and other clients
   static void removeBuffer(BufferId id);
 
 signals:
@@ -170,7 +170,7 @@ private slots:
   void recvStatusMsg(QString network, QString message);
   void recvBacklogData(BufferInfo, QVariantList, bool);
   void updateBufferInfo(BufferInfo);
-  void updateLastSeen(BufferId id, const QDateTime &lastSeen);
+  void updateLastSeenMsg(BufferId id, const MsgId &msgId);
 
   void layoutMsg();
 
index d4c6918..fe69db7 100644 (file)
 
 #include "buffersyncer.h"
 
-BufferSyncer::BufferSyncer(QObject *parent) : SyncableObject(parent) {
-
-
+BufferSyncer::BufferSyncer(QObject *parent)
+  : SyncableObject(parent)
+{
 }
 
 
-QDateTime BufferSyncer::lastSeen(BufferId buffer) const {
-  if(_lastSeen.contains(buffer)) return _lastSeen[buffer];
-  return QDateTime();
+MsgId BufferSyncer::lastSeenMsg(BufferId buffer) const {
+  if(_lastSeenMsg.contains(buffer))
+    return _lastSeenMsg[buffer];
+  return MsgId();
 }
 
-bool BufferSyncer::setLastSeen(BufferId buffer, const QDateTime &time) {
-  if(!time.isValid()) return false;
-  if(!lastSeen(buffer).isValid() || lastSeen(buffer) < time) {
-    _lastSeen[buffer] = time;
-    emit lastSeenSet(buffer, time);
+bool BufferSyncer::setLastSeenMsg(BufferId buffer, const MsgId &msgId) {
+  if(!msgId.isValid())
+    return false;
+
+  const MsgId oldLastSeenMsg = lastSeenMsg(buffer);
+  if(!oldLastSeenMsg.isValid() || oldLastSeenMsg < msgId) {
+    _lastSeenMsg[buffer] = msgId;
+    emit lastSeenMsgSet(buffer, msgId);
     return true;
   }
   return false;
 }
 
-QVariantList BufferSyncer::initLastSeen() const {
+QVariantList BufferSyncer::initLastSeenMsg() const {
   QVariantList list;
-  foreach(BufferId id, _lastSeen.keys()) {
-    list << QVariant::fromValue<BufferId>(id) << _lastSeen[id];
+  QHash<BufferId, MsgId>::const_iterator iter = _lastSeenMsg.constBegin();
+  while(iter != _lastSeenMsg.constEnd()) {
+    list << QVariant::fromValue<BufferId>(iter.key())
+        << QVariant::fromValue<MsgId>(iter.value());
+    iter++;
   }
   return list;
 }
 
-void BufferSyncer::initSetLastSeen(const QVariantList &list) {
-  _lastSeen.clear();
+void BufferSyncer::initSetLastSeenMsg(const QVariantList &list) {
+  _lastSeenMsg.clear();
   Q_ASSERT(list.count() % 2 == 0);
   for(int i = 0; i < list.count(); i += 2) {
-    setLastSeen(list[i].value<BufferId>(), list[i+1].toDateTime());
+    setLastSeenMsg(list[i].value<BufferId>(), list[i+1].value<MsgId>());
   }
 }
 
-void BufferSyncer::requestSetLastSeen(BufferId buffer, const QDateTime &time) {
-  if(setLastSeen(buffer, time)) emit setLastSeenRequested(buffer, time);
+void BufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) {
+  if(setLastSeenMsg(buffer, msgId))
+    emit setLastSeenMsgRequested(buffer, msgId);
 }
 
 
@@ -67,8 +75,8 @@ void BufferSyncer::requestRemoveBuffer(BufferId buffer) {
 }
 
 void BufferSyncer::removeBuffer(BufferId buffer) {
-  if(_lastSeen.contains(buffer))
-    _lastSeen.remove(buffer);
+  if(_lastSeenMsg.contains(buffer))
+    _lastSeenMsg.remove(buffer);
   emit bufferRemoved(buffer);
 }
 
index aa64118..0ad8eaa 100644 (file)
 #ifndef BUFFERSYNCER_H_
 #define BUFFERSYNCER_H_
 
-#include <QDateTime>
-
 #include "syncableobject.h"
 #include "types.h"
 
 class BufferSyncer : public SyncableObject {
   Q_OBJECT
 
-  public:
-    explicit BufferSyncer(QObject *parent);
+public:
+  explicit BufferSyncer(QObject *parent);
+
+  MsgId lastSeenMsg(BufferId buffer) const;
 
-    QDateTime lastSeen(BufferId buffer) const;
+public slots:
+  QVariantList initLastSeenMsg() const;
+  void initSetLastSeenMsg(const QVariantList &);
 
-  public slots:
-    QVariantList initLastSeen() const;
-    void initSetLastSeen(const QVariantList &);
+  void requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId);
+  void requestRemoveBuffer(BufferId buffer);
+  void removeBuffer(BufferId buffer);
+  void renameBuffer(BufferId buffer, QString newName);
 
-    void requestSetLastSeen(BufferId buffer, const QDateTime &time);
-    void requestRemoveBuffer(BufferId buffer);
-    void removeBuffer(BufferId buffer);
-    void renameBuffer(BufferId buffer, QString newName);
+signals:
+  void lastSeenMsgSet(BufferId buffer, const MsgId &msgId);
+  void setLastSeenMsgRequested(BufferId buffer, const MsgId &msgId);
+  void removeBufferRequested(BufferId buffer);
+  void bufferRemoved(BufferId buffer);
+  void bufferRenamed(BufferId buffer, QString newName);
 
-  signals:
-    void lastSeenSet(BufferId buffer, const QDateTime &time);
-    void setLastSeenRequested(BufferId buffer, const QDateTime &time);
-    void removeBufferRequested(BufferId buffer);
-    void bufferRemoved(BufferId buffer);
-    void bufferRenamed(BufferId buffer, QString newName);
+private slots:
+  bool setLastSeenMsg(BufferId buffer, const MsgId &msgId);
 
-  private slots:
-    bool setLastSeen(BufferId buffer, const QDateTime &time);
+private:
+  QHash<BufferId, MsgId> _lastSeenMsg;
 
-  private:
-    QMap<BufferId, QDateTime> _lastSeen;
 };
 
 #endif
similarity index 88%
rename from src/core/SQL/SQLite/9/setup_030_buffer.sql
rename to src/core/SQL/SQLite/10/setup_030_buffer.sql
index c1d8b15..fccc382 100644 (file)
@@ -6,7 +6,7 @@ CREATE TABLE buffer (
        buffername TEXT NOT NULL,
        buffercname TEXT NOT NULL, -- CANONICAL BUFFER NAME (lowercase version)
        buffertype INTEGER NOT NULL DEFAULT 0,
-       lastseen INTEGER NOT NULL DEFAULT 0,
+       lastseenmsgid INTEGER NOT NULL DEFAULT 0,
        key TEXT,
        joined INTEGER NOT NULL DEFAULT 0 -- BOOL
 )
diff --git a/src/core/SQL/SQLite/10/setup_999_version.sql b/src/core/SQL/SQLite/10/setup_999_version.sql
new file mode 100644 (file)
index 0000000..205c878
--- /dev/null
@@ -0,0 +1 @@
+INSERT INTO coreinfo (key, value) VALUES ('schemaversion', 10)
@@ -1,3 +1,3 @@
 UPDATE buffer
-SET lastseen = :lastseen
+SET lastseenmsgid = :lastseenmsgid
 WHERE userid = :userid AND bufferid = :bufferid
diff --git a/src/core/SQL/SQLite/10/upgrade_000_switch_to_msgid.sql b/src/core/SQL/SQLite/10/upgrade_000_switch_to_msgid.sql
new file mode 100644 (file)
index 0000000..fa40d08
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE buffer
+SET lastseen = (SELECT messageid FROM backlog WHERE backlog.bufferid = bufferid AND backlog.time = lastseen LIMIT 1)
+WHERE lastseen != 0
diff --git a/src/core/SQL/SQLite/10/upgrade_010_rename_buffer_table.sql b/src/core/SQL/SQLite/10/upgrade_010_rename_buffer_table.sql
new file mode 100644 (file)
index 0000000..74537bc
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE buffer RENAME TO buffer_old
diff --git a/src/core/SQL/SQLite/10/upgrade_020_create_buffer_table.sql b/src/core/SQL/SQLite/10/upgrade_020_create_buffer_table.sql
new file mode 100644 (file)
index 0000000..fccc382
--- /dev/null
@@ -0,0 +1,12 @@
+CREATE TABLE buffer (
+       bufferid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+       userid INTEGER NOT NULL,
+       groupid INTEGER,
+       networkid INTEGER NOT NULL,
+       buffername TEXT NOT NULL,
+       buffercname TEXT NOT NULL, -- CANONICAL BUFFER NAME (lowercase version)
+       buffertype INTEGER NOT NULL DEFAULT 0,
+       lastseenmsgid INTEGER NOT NULL DEFAULT 0,
+       key TEXT,
+       joined INTEGER NOT NULL DEFAULT 0 -- BOOL
+)
diff --git a/src/core/SQL/SQLite/10/upgrade_030_copy_buffer_table.sql b/src/core/SQL/SQLite/10/upgrade_030_copy_buffer_table.sql
new file mode 100644 (file)
index 0000000..cb6b6b5
--- /dev/null
@@ -0,0 +1,2 @@
+INSERT INTO buffer (bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastseenmsgid, key, joined)
+SELECT bufferid, userid, groupid, networkid, buffername, buffercname, buffertype, lastseen, key, joined FROM buffer_old
diff --git a/src/core/SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql b/src/core/SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql
new file mode 100644 (file)
index 0000000..62aa8bd
--- /dev/null
@@ -0,0 +1 @@
+DROP TABLE buffer_old
diff --git a/src/core/SQL/SQLite/10/upgrade_999_version.sql b/src/core/SQL/SQLite/10/upgrade_999_version.sql
new file mode 100644 (file)
index 0000000..0b13283
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE coreinfo
+SET value = 10
+WHERE key = 'schemaversion'
diff --git a/src/core/SQL/SQLite/9/setup_999_version.sql b/src/core/SQL/SQLite/9/setup_999_version.sql
deleted file mode 100644 (file)
index ab6551e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '9')
index fee7594..b7714e3 100644 (file)
@@ -305,14 +305,14 @@ BufferId Core::renameBuffer(const UserId &user, const NetworkId &networkId, cons
   return instance()->storage->renameBuffer(user, networkId, newName, oldName);
 }
 
-void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+void Core::setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId) {
   QMutexLocker locker(&mutex);
-  return instance()->storage->setBufferLastSeen(user, bufferId, seenDate);
+  return instance()->storage->setBufferLastSeenMsg(user, bufferId, msgId);
 }
 
-QHash<BufferId, QDateTime> Core::bufferLastSeenDates(UserId user) {
+QHash<BufferId, MsgId> Core::bufferLastSeenMsgIds(UserId user) {
   QMutexLocker locker(&mutex);
-  return instance()->storage->bufferLastSeenDates(user);
+  return instance()->storage->bufferLastSeenMsgIds(user);
 }
 
 /*** Network Management ***/
index 2255f56..31d01be 100644 (file)
@@ -239,17 +239,17 @@ class Core : public QObject {
      *
      * \param user      The Owner of that Buffer
      * \param bufferId  The buffer id
-     * \param seenDate  Time the Buffer has been visited the last time
+     * \param MsgId     The Message id of the message that has been just seen
      */
-    static void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
+    static void setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId);
 
-    //! Get a Hash of all last seen dates. 
-    /** This Method is called when the Quassel Core is started to restore the lastSeenDates
+    //! 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.
      *
      * \param user      The Owner of the buffers
      */
-    static QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
+    static QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user);
 
   public slots:
     //! Make storage data persistent
index 40443db..bc4289b 100644 (file)
@@ -69,9 +69,11 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje
   initScriptEngine();
 
   // init BufferSyncer
-  QHash<BufferId, QDateTime> lastSeenHash = Core::bufferLastSeenDates(user());
-  foreach(BufferId id, lastSeenHash.keys()) _bufferSyncer->requestSetLastSeen(id, lastSeenHash[id]);
-  connect(_bufferSyncer, SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(storeBufferLastSeen(BufferId, const QDateTime &)));
+  QHash<BufferId, MsgId> lastSeenHash = Core::bufferLastSeenMsgIds(user());
+  foreach(BufferId id, lastSeenHash.keys())
+    _bufferSyncer->requestSetLastSeenMsg(id, lastSeenHash[id]);
+  
+  connect(_bufferSyncer, SIGNAL(lastSeenMsgSet(BufferId, MsgId)), this, SLOT(storeBufferLastSeenMsg(BufferId, MsgId)));
   connect(_bufferSyncer, SIGNAL(removeBufferRequested(BufferId)), this, SLOT(removeBufferRequested(BufferId)));
   connect(this, SIGNAL(bufferRemoved(BufferId)), _bufferSyncer, SLOT(removeBuffer(BufferId)));
   connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString)));
@@ -306,8 +308,8 @@ QVariant CoreSession::sessionState() {
   return v;
 }
 
-void CoreSession::storeBufferLastSeen(BufferId buffer, const QDateTime &lastSeen) {
-  Core::setBufferLastSeen(user(), buffer, lastSeen);
+void CoreSession::storeBufferLastSeenMsg(BufferId buffer, const MsgId &msgId) {
+  Core::setBufferLastSeenMsg(user(), buffer, msgId);
 }
 
 void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) {
index 7dd0a53..6d01d17 100644 (file)
@@ -165,7 +165,7 @@ private slots:
    */
   void updateBufferInfo(UserId user, const BufferInfo &bufferInfo);
 
-  void storeBufferLastSeen(BufferId buffer, const QDateTime &lastSeen);
+  void storeBufferLastSeenMsg(BufferId buffer, const MsgId &msgId);
 
   void scriptRequest(QString script);
 
index 4c38e7d..2c806d4 100644 (file)
@@ -3,6 +3,66 @@
     <file>./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_010_create_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_020_update_schemaversion.sql</file>
+    <file>./SQL/SQLite/10/delete_backlog_by_uid.sql</file>
+    <file>./SQL/SQLite/10/delete_backlog_for_buffer.sql</file>
+    <file>./SQL/SQLite/10/delete_backlog_for_network.sql</file>
+    <file>./SQL/SQLite/10/delete_buffer_for_bufferid.sql</file>
+    <file>./SQL/SQLite/10/delete_buffers_by_uid.sql</file>
+    <file>./SQL/SQLite/10/delete_buffers_for_network.sql</file>
+    <file>./SQL/SQLite/10/delete_ircservers_for_network.sql</file>
+    <file>./SQL/SQLite/10/delete_network.sql</file>
+    <file>./SQL/SQLite/10/delete_networks_by_uid.sql</file>
+    <file>./SQL/SQLite/10/delete_quasseluser.sql</file>
+    <file>./SQL/SQLite/10/insert_buffer.sql</file>
+    <file>./SQL/SQLite/10/insert_message.sql</file>
+    <file>./SQL/SQLite/10/insert_network.sql</file>
+    <file>./SQL/SQLite/10/insert_quasseluser.sql</file>
+    <file>./SQL/SQLite/10/insert_sender.sql</file>
+    <file>./SQL/SQLite/10/insert_server.sql</file>
+    <file>./SQL/SQLite/10/select_authuser.sql</file>
+    <file>./SQL/SQLite/10/select_buffer_by_id.sql</file>
+    <file>./SQL/SQLite/10/select_buffer_lastseen_messages.sql</file>
+    <file>./SQL/SQLite/10/select_bufferByName.sql</file>
+    <file>./SQL/SQLite/10/select_bufferExists.sql</file>
+    <file>./SQL/SQLite/10/select_buffers.sql</file>
+    <file>./SQL/SQLite/10/select_connected_networks.sql</file>
+    <file>./SQL/SQLite/10/select_messageRange.sql</file>
+    <file>./SQL/SQLite/10/select_messages.sql</file>
+    <file>./SQL/SQLite/10/select_messagesOffset.sql</file>
+    <file>./SQL/SQLite/10/select_messagesSince.sql</file>
+    <file>./SQL/SQLite/10/select_messagesSinceOffset.sql</file>
+    <file>./SQL/SQLite/10/select_networkExists.sql</file>
+    <file>./SQL/SQLite/10/select_networks_for_user.sql</file>
+    <file>./SQL/SQLite/10/select_persistent_channels.sql</file>
+    <file>./SQL/SQLite/10/select_servers_for_network.sql</file>
+    <file>./SQL/SQLite/10/select_userid.sql</file>
+    <file>./SQL/SQLite/10/setup_000_quasseluser.sql</file>
+    <file>./SQL/SQLite/10/setup_010_sender.sql</file>
+    <file>./SQL/SQLite/10/setup_020_network.sql</file>
+    <file>./SQL/SQLite/10/setup_030_buffer.sql</file>
+    <file>./SQL/SQLite/10/setup_040_buffer_idx.sql</file>
+    <file>./SQL/SQLite/10/setup_050_buffer_cname_idx.sql</file>
+    <file>./SQL/SQLite/10/setup_060_backlog.sql</file>
+    <file>./SQL/SQLite/10/setup_070_coreinfo.sql</file>
+    <file>./SQL/SQLite/10/setup_080_ircservers.sql</file>
+    <file>./SQL/SQLite/10/setup_090_create_backlog_idx.sql</file>
+    <file>./SQL/SQLite/10/setup_100_create_backlog_idx2.sql</file>
+    <file>./SQL/SQLite/10/setup_110_create_buffer_idx.sql</file>
+    <file>./SQL/SQLite/10/setup_999_version.sql</file>
+    <file>./SQL/SQLite/10/update_buffer_lastseen.sql</file>
+    <file>./SQL/SQLite/10/update_buffer_name.sql</file>
+    <file>./SQL/SQLite/10/update_buffer_persistent_channel.sql</file>
+    <file>./SQL/SQLite/10/update_buffer_set_channel_key.sql</file>
+    <file>./SQL/SQLite/10/update_network.sql</file>
+    <file>./SQL/SQLite/10/update_network_connected.sql</file>
+    <file>./SQL/SQLite/10/update_username.sql</file>
+    <file>./SQL/SQLite/10/update_userpassword.sql</file>
+    <file>./SQL/SQLite/10/upgrade_000_switch_to_msgid.sql</file>
+    <file>./SQL/SQLite/10/upgrade_010_rename_buffer_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_020_create_buffer_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_030_copy_buffer_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_040_drop_buffer_old_table.sql</file>
+    <file>./SQL/SQLite/10/upgrade_999_version.sql</file>
     <file>./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql</file>
     <file>./SQL/SQLite/2/upgrade_010_update_schemaversion.sql</file>
     <file>./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql</file>
     <file>./SQL/SQLite/8/upgrade_020_alter_buffer_add_joined.sql</file>
     <file>./SQL/SQLite/8/upgrade_030_update_buffer_set_joined_for_channels.sql</file>
     <file>./SQL/SQLite/8/upgrade_999_version.sql</file>
-    <file>./SQL/SQLite/9/delete_backlog_by_uid.sql</file>
-    <file>./SQL/SQLite/9/delete_backlog_for_buffer.sql</file>
-    <file>./SQL/SQLite/9/delete_backlog_for_network.sql</file>
-    <file>./SQL/SQLite/9/delete_buffer_for_bufferid.sql</file>
-    <file>./SQL/SQLite/9/delete_buffers_by_uid.sql</file>
-    <file>./SQL/SQLite/9/delete_buffers_for_network.sql</file>
-    <file>./SQL/SQLite/9/delete_ircservers_for_network.sql</file>
-    <file>./SQL/SQLite/9/delete_network.sql</file>
-    <file>./SQL/SQLite/9/delete_networks_by_uid.sql</file>
-    <file>./SQL/SQLite/9/delete_quasseluser.sql</file>
-    <file>./SQL/SQLite/9/insert_buffer.sql</file>
-    <file>./SQL/SQLite/9/insert_message.sql</file>
-    <file>./SQL/SQLite/9/insert_network.sql</file>
-    <file>./SQL/SQLite/9/insert_quasseluser.sql</file>
-    <file>./SQL/SQLite/9/insert_sender.sql</file>
-    <file>./SQL/SQLite/9/insert_server.sql</file>
-    <file>./SQL/SQLite/9/select_authuser.sql</file>
-    <file>./SQL/SQLite/9/select_buffer_by_id.sql</file>
-    <file>./SQL/SQLite/9/select_buffer_lastseen_dates.sql</file>
-    <file>./SQL/SQLite/9/select_bufferByName.sql</file>
-    <file>./SQL/SQLite/9/select_bufferExists.sql</file>
-    <file>./SQL/SQLite/9/select_buffers.sql</file>
-    <file>./SQL/SQLite/9/select_connected_networks.sql</file>
-    <file>./SQL/SQLite/9/select_messageRange.sql</file>
-    <file>./SQL/SQLite/9/select_messages.sql</file>
-    <file>./SQL/SQLite/9/select_messagesOffset.sql</file>
-    <file>./SQL/SQLite/9/select_messagesSince.sql</file>
-    <file>./SQL/SQLite/9/select_messagesSinceOffset.sql</file>
-    <file>./SQL/SQLite/9/select_networkExists.sql</file>
-    <file>./SQL/SQLite/9/select_networks_for_user.sql</file>
-    <file>./SQL/SQLite/9/select_persistent_channels.sql</file>
-    <file>./SQL/SQLite/9/select_servers_for_network.sql</file>
-    <file>./SQL/SQLite/9/select_userid.sql</file>
-    <file>./SQL/SQLite/9/setup_000_quasseluser.sql</file>
-    <file>./SQL/SQLite/9/setup_010_sender.sql</file>
-    <file>./SQL/SQLite/9/setup_020_network.sql</file>
-    <file>./SQL/SQLite/9/setup_030_buffer.sql</file>
-    <file>./SQL/SQLite/9/setup_040_buffer_idx.sql</file>
-    <file>./SQL/SQLite/9/setup_050_buffer_cname_idx.sql</file>
-    <file>./SQL/SQLite/9/setup_060_backlog.sql</file>
-    <file>./SQL/SQLite/9/setup_070_coreinfo.sql</file>
-    <file>./SQL/SQLite/9/setup_080_ircservers.sql</file>
-    <file>./SQL/SQLite/9/setup_090_create_backlog_idx.sql</file>
-    <file>./SQL/SQLite/9/setup_100_create_backlog_idx2.sql</file>
-    <file>./SQL/SQLite/9/setup_110_create_buffer_idx.sql</file>
-    <file>./SQL/SQLite/9/setup_999_version.sql</file>
-    <file>./SQL/SQLite/9/update_buffer_lastseen.sql</file>
-    <file>./SQL/SQLite/9/update_buffer_name.sql</file>
-    <file>./SQL/SQLite/9/update_buffer_persistent_channel.sql</file>
-    <file>./SQL/SQLite/9/update_buffer_set_channel_key.sql</file>
-    <file>./SQL/SQLite/9/update_network.sql</file>
-    <file>./SQL/SQLite/9/update_network_connected.sql</file>
-    <file>./SQL/SQLite/9/update_username.sql</file>
-    <file>./SQL/SQLite/9/update_userpassword.sql</file>
     <file>./SQL/SQLite/9/upgrade_000_create_backlog_idx.sql</file>
     <file>./SQL/SQLite/9/upgrade_010_create_backlog_idx2.sql</file>
     <file>./SQL/SQLite/9/upgrade_020_create_buffer_idx.sql</file>
index 3c61f98..d4b7d0c 100644 (file)
@@ -558,26 +558,26 @@ BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networ
     return BufferId();
 }
 
-void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+void SqliteStorage::setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId) {
   QSqlQuery *query = cachedQuery("update_buffer_lastseen");
   query->bindValue(":userid", user.toInt());
   query->bindValue(":bufferid", bufferId.toInt());
-  query->bindValue(":lastseen", seenDate.toTime_t());
+  query->bindValue(":lastseenmsgid", msgId.toInt());
   query->exec();
   watchQuery(query);
 }
 
-QHash<BufferId, QDateTime> SqliteStorage::bufferLastSeenDates(UserId user) {
-  QHash<BufferId, QDateTime> lastSeenHash;
+QHash<BufferId, MsgId> SqliteStorage::bufferLastSeenMsgIds(UserId user) {
+  QHash<BufferId, MsgId> lastSeenHash;
   QSqlQuery query(logDb());
-  query.prepare(queryString("select_buffer_lastseen_dates"));
+  query.prepare(queryString("select_buffer_lastseen_messages"));
   query.bindValue(":userid", user.toInt());
   query.exec();
   if(!watchQuery(&query))
     return lastSeenHash;
 
   while(query.next()) {
-    lastSeenHash[query.value(0).toInt()] = QDateTime::fromTime_t(query.value(1).toUInt());
+    lastSeenHash[query.value(0).toInt()] = query.value(1).toInt();
   }
   return lastSeenHash;
 }
index a710b63..9968ec7 100644 (file)
@@ -70,8 +70,8 @@ public slots:
   virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
   virtual bool removeBuffer(const UserId &user, const BufferId &bufferId);
   virtual BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName);
-  virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
-  virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
+  virtual void setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId);
+  virtual QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user);
   
   /* Message handling */
   
index ee4cbfe..d4c4b8b 100644 (file)
@@ -243,15 +243,15 @@ class Storage : public QObject {
     /** This Method is used to make the LastSeenDate of a Buffer persistent
      * \param user      The Owner of that Buffer
      * \param bufferId  The buffer id
-     * \param seenDate  Time the Buffer has been visited the last time
+     * \param MsgId     The Message id of the message that has been just seen
      */
-    virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) = 0;
+    virtual void setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId) = 0;
 
-    //! Get a Hash of all last seen dates. 
-    /** This Method is called when the Quassel Core is started to restore the lastSeenDates
+    //! 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
      */
-    virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user) = 0;
+    virtual QHash<BufferId, MsgId> bufferLastSeenMsgIds(UserId user) = 0;
 
   
     /* Message handling */
index 6dcc0af..a3e6cee 100644 (file)
@@ -4,15 +4,15 @@
 { using namespace Global;
 
   quasselVersion = "0.2.0-alpha3-pre";
-  quasselDate = "2008-03-06";
-  quasselBuild = 617;
+  quasselDate = "2008-03-09";
+  quasselBuild = 620;
 
   //! Minimum client build number the core needs
-  clientBuildNeeded = 613;
+  clientBuildNeeded = 620;
   clientVersionNeeded = quasselVersion;
 
   //! Minimum core build number the client needs
-  coreBuildNeeded = 613;
+  coreBuildNeeded = 620;
   coreVersionNeeded = quasselVersion;
 
 }