From: Marcus Eggenberger Date: Sun, 22 Jun 2008 18:57:21 +0000 (+0200) Subject: Fixing BR #147. Needs core update. X-Git-Tag: 0.3.0~352 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=52a7b4d0f289f075aa386445a47d876743bcb6d0;hp=43f0f050e5d91f86fc51c644f6343b45b4628a64 Fixing BR #147. Needs core update. --- diff --git a/src/client/client.cpp b/src/client/client.cpp index a6f7b4b6..ea1738b8 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -246,7 +246,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(); @@ -641,7 +642,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); diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index d09605f0..c7971791 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -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(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(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: diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 1a5e4c4b..8dceb5a4 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -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 index 00000000..204a0c2c --- /dev/null +++ b/src/core/SQL/SQLite/11/select_buffers_for_network.sql @@ -0,0 +1,4 @@ +SELECT bufferid +FROM buffer +WHERE networkid = :networkid and userid = :userid + diff --git a/src/core/core.cpp b/src/core/core.cpp index b156b2dc..c92c4f15 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -309,6 +309,11 @@ QList Core::requestBuffers(UserId user) { return instance()->storage->requestBuffers(user); } +QList 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); diff --git a/src/core/core.h b/src/core/core.h index 8047598a..1288ae01 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -234,6 +234,16 @@ class Core : public QObject { */ static QList 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 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. diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index f394b5e7..07ba5a16 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -458,8 +458,12 @@ void CoreSession::destroyNetwork(NetworkId id) { // this can happen if the network was reconnecting while being removed _connections.take(id)->deleteLater(); } + QList 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(); } diff --git a/src/core/sql.qrc b/src/core/sql.qrc index 8d38df09..da98f983 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -32,6 +32,7 @@ ./SQL/SQLite/11/select_bufferByName.sql ./SQL/SQLite/11/select_bufferExists.sql ./SQL/SQLite/11/select_buffers.sql + ./SQL/SQLite/11/select_buffers_for_network.sql ./SQL/SQLite/11/select_connected_networks.sql ./SQL/SQLite/11/select_messageRange.sql ./SQL/SQLite/11/select_messages.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 5dab67e5..ee83f87b 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -538,6 +538,21 @@ QList SqliteStorage::requestBuffers(UserId user) { return bufferlist; } +QList SqliteStorage::requestBufferIdsForNetwork(UserId user, NetworkId networkId) { + QList 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; diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index 597ca23e..ed04bf3e 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -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 requestBuffers(UserId user); + virtual QList 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); diff --git a/src/core/storage.h b/src/core/storage.h index 964548d5..2016ed39 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -236,6 +236,15 @@ class Storage : public QObject { */ virtual QList 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 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