Fixing BR #147. Needs core update.
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 22 Jun 2008 18:57:21 +0000 (20:57 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 22 Jun 2008 18:57:21 +0000 (20:57 +0200)
src/client/client.cpp
src/client/networkmodel.cpp
src/client/networkmodel.h
src/core/SQL/SQLite/11/select_buffers_for_network.sql [new file with mode: 0644]
src/core/core.cpp
src/core/core.h
src/core/coresession.cpp
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h

index 457b5c0..e438b9c 100644 (file)
@@ -240,7 +240,8 @@ void Client::coreNetworkCreated(NetworkId id) {
 }
 
 void Client::coreNetworkRemoved(NetworkId id) {
-  if(!_networks.contains(id)) return;
+  if(!_networks.contains(id))
+    return;
   Network *net = _networks.take(id);
   emit networkRemoved(net->networkId());
   net->deleteLater();
@@ -615,7 +616,7 @@ void Client::removeBuffer(BufferId id) {
 }
 
 void Client::bufferRemoved(BufferId bufferId) {
-  // first remove the buffer from has. this prohibits further lastSeenUpdates
+  // first remove the buffer from hash. this prohibits further lastSeenUpdates
   Buffer *buff = 0;
   if(_buffers.contains(bufferId)) {
     buff = _buffers.take(bufferId);
index d09605f..c797179 100644 (file)
@@ -27,7 +27,6 @@
 #include "signalproxy.h"
 #include "network.h"
 #include "ircchannel.h"
-#include "ircuser.h"
 
 #include "buffersettings.h"
 
@@ -262,16 +261,16 @@ void BufferItem::removeUserFromCategory(IrcUser *ircUser) {
     }
   }
 
-  if(!success) {
-    qDebug() << "didn't find User:" << ircUser << qHash(ircUser);
-    qDebug() << "==== Childlist for Item:" << this << id() << bufferName() << "====";
-    for(int i = 0; i < childCount(); i++) {
-      categoryItem = qobject_cast<UserCategoryItem *>(child(i));
-      categoryItem->dumpChildList();
-    }
-    qDebug() << "==== End Of Childlist for Item:" << this << id() << bufferName() << "====";
-  }
-  Q_ASSERT(success);
+//   if(!success) {
+//     qDebug() << "didn't find User:" << ircUser << qHash(ircUser);
+//     qDebug() << "==== Childlist for Item:" << this << id() << bufferName() << "====";
+//     for(int i = 0; i < childCount(); i++) {
+//       categoryItem = qobject_cast<UserCategoryItem *>(child(i));
+//       categoryItem->dumpChildList();
+//     }
+//     qDebug() << "==== End Of Childlist for Item:" << this << id() << bufferName() << "====";
+//   }
+//   Q_ASSERT(success);
 }
 
 void BufferItem::userModeChanged(IrcUser *ircUser) {
@@ -570,14 +569,6 @@ bool IrcUserItem::isActive() const {
     return false;
 }
 
-IrcUser *IrcUserItem::ircUser() {
-  return _ircUser;
-}
-
-quint64 IrcUserItem::id() const {
-  return _id;
-}
-
 QVariant IrcUserItem::data(int column, int role) const {
   switch(role) {
   case NetworkModel::ItemActiveRole:
index 1a5e4c4..8dceb5a 100644 (file)
@@ -33,12 +33,12 @@ class BufferInfo;
 #include "selectionmodelsynchronizer.h"
 #include "modelpropertymapper.h"
 #include "clientsettings.h"
+#include "ircuser.h"
 
 class MappedSelectionModel;
 class QAbstractItemView;
 class Network;
 class IrcChannel;
-class IrcUser;
 
 /*****************************************
  *  Fancy Buffer Items
@@ -179,8 +179,8 @@ public:
   QString nickName() const;
   bool isActive() const;
 
-  IrcUser *ircUser();
-  virtual quint64 id() const;
+  inline IrcUser *ircUser() { return _ircUser; }
+  inline virtual quint64 id() const { return _id; }
   virtual QVariant data(int column, int role) const;
   virtual QString toolTip(int column) const;
 
@@ -233,6 +233,7 @@ public:
 
   bool isBufferIndex(const QModelIndex &) const;
   //Buffer *getBufferByIndex(const QModelIndex &) const;
+  QModelIndex networkIndex(NetworkId networkId);
   QModelIndex bufferIndex(BufferId bufferId);
 
   const Network *networkByIndex(const QModelIndex &index) const;
@@ -246,7 +247,6 @@ public slots:
   void networkRemoved(const NetworkId &networkId);
   
 private:
-  QModelIndex networkIndex(NetworkId networkId);
   NetworkItem *networkItem(NetworkId networkId);
   NetworkItem *existsNetworkItem(NetworkId networkId);
   BufferItem *bufferItem(const BufferInfo &bufferInfo);
diff --git a/src/core/SQL/SQLite/11/select_buffers_for_network.sql b/src/core/SQL/SQLite/11/select_buffers_for_network.sql
new file mode 100644 (file)
index 0000000..204a0c2
--- /dev/null
@@ -0,0 +1,4 @@
+SELECT bufferid
+FROM buffer
+WHERE networkid = :networkid and userid = :userid
+
index 776a8b4..d252b9d 100644 (file)
@@ -309,6 +309,11 @@ QList<BufferInfo> Core::requestBuffers(UserId user) {
   return instance()->storage->requestBuffers(user);
 }
 
+QList<BufferId> Core::requestBufferIdsForNetwork(UserId user, NetworkId networkId) {
+  QMutexLocker locker(&mutex);
+  return instance()->storage->requestBufferIdsForNetwork(user, networkId);
+}
+
 bool Core::removeBuffer(const UserId &user, const BufferId &bufferId) {
   QMutexLocker locker(&mutex);
   return instance()->storage->removeBuffer(user, bufferId);
index 8047598..1288ae0 100644 (file)
@@ -234,6 +234,16 @@ class Core : public QObject {
      */
     static QList<BufferInfo> requestBuffers(UserId user);
 
+
+    //! Request a list of BufferIds for a given NetworkId
+    /** \note This method is threadsafe.
+    *
+    *  \param user  The user whose buffers we request
+    *  \param networkId  The NetworkId of the network in question
+    *  \return List of BufferIds belonging to the Network
+    */
+    static QList<BufferId> requestBufferIdsForNetwork(UserId user, NetworkId networkId);
+
     //! Remove permanently a buffer and it's content from the storage backend
     /** This call cannot be reverted!
      *  \note This method is threadsafe.
index e96dfd4..fbdcfa6 100644 (file)
@@ -457,8 +457,12 @@ void CoreSession::destroyNetwork(NetworkId id) {
     // this can happen if the network was reconnecting while being removed
     _connections.take(id)->deleteLater();
   }
+  QList<BufferId> removedBuffers = Core::requestBufferIdsForNetwork(user(), id);
   Network *net = _networks.take(id);
   if(net && Core::removeNetwork(user(), id)) {
+    foreach(BufferId bufferId, removedBuffers) {
+      _bufferSyncer->removeBuffer(bufferId);
+    }
     emit networkRemoved(id);
     net->deleteLater();
   }
index 8d38df0..da98f98 100644 (file)
@@ -32,6 +32,7 @@
     <file>./SQL/SQLite/11/select_bufferByName.sql</file>
     <file>./SQL/SQLite/11/select_bufferExists.sql</file>
     <file>./SQL/SQLite/11/select_buffers.sql</file>
+    <file>./SQL/SQLite/11/select_buffers_for_network.sql</file>
     <file>./SQL/SQLite/11/select_connected_networks.sql</file>
     <file>./SQL/SQLite/11/select_messageRange.sql</file>
     <file>./SQL/SQLite/11/select_messages.sql</file>
index 8cd4d5b..2a84b48 100644 (file)
@@ -538,6 +538,21 @@ QList<BufferInfo> SqliteStorage::requestBuffers(UserId user) {
   return bufferlist;
 }
 
+QList<BufferId> SqliteStorage::requestBufferIdsForNetwork(UserId user, NetworkId networkId) {
+  QList<BufferId> bufferList;
+  QSqlQuery query(logDb());
+  query.prepare(queryString("select_buffers_for_network"));
+  query.bindValue(":networkid", networkId.toInt());
+  query.bindValue(":userid", user.toInt());
+
+  query.exec();
+  watchQuery(&query);
+  while(query.next()) {
+    bufferList << BufferId(query.value(0).toInt());
+  }
+  return bufferList;
+}
+
 bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) {
   if(!isValidBuffer(user, bufferId))
     return false;
index 597ca23..ed04bf3 100644 (file)
@@ -71,6 +71,7 @@ public slots:
   virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "");
   virtual BufferInfo getBufferInfo(UserId user, const BufferId &bufferId);
   virtual QList<BufferInfo> requestBuffers(UserId user);
+  virtual QList<BufferId> requestBufferIdsForNetwork(UserId user, NetworkId networkId);
   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 setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId);
index 964548d..2016ed3 100644 (file)
@@ -236,6 +236,15 @@ class Storage : public QObject {
      */
     virtual QList<BufferInfo> requestBuffers(UserId user) = 0;
 
+    //! Request a list of BufferIds for a given NetworkId
+    /** \note This method is threadsafe.
+     *
+     *  \param user  The user whose buffers we request
+     *  \param networkId  The NetworkId of the network in question
+     *  \return List of BufferIds belonging to the Network
+     */
+    virtual QList<BufferId> requestBufferIdsForNetwork(UserId user, NetworkId networkId) = 0;
+
     //! Remove permanently a buffer and it's content from the storage backend
     /** This call cannot be reverted!
      *  \param user      The user who is the owner of the buffer