You can now rename networks and delete them.
Be warned: the latter one deletes everything associated with the
network including backlog.
_networkModel = new NetworkModel(this);
connect(this, SIGNAL(bufferUpdated(BufferInfo)),
_networkModel, SLOT(bufferUpdated(BufferInfo)));
+ connect(this, SIGNAL(networkRemoved(NetworkId)),
+ _networkModel, SLOT(networkRemoved(NetworkId)));
_bufferModel = new BufferModel(_networkModel);
// experimental stuff :)
QModelIndex NetworkModel::networkIndex(NetworkId networkId) {
- return indexById(networkId.toInt());
+ return indexById(qHash(networkId));
}
NetworkItem *NetworkModel::existsNetworkItem(NetworkId networkId) {
return netItem;
}
+void NetworkModel::networkRemoved(const NetworkId &networkId) {
+ rootItem->removeChildById(qHash(networkId));
+}
+
QModelIndex NetworkModel::bufferIndex(BufferId bufferId) {
AbstractTreeItem *netItem, *bufferItem;
for(int i = 0; i < rootItem->childCount(); i++) {
netItem = rootItem->child(i);
- if((bufferItem = netItem->childById(bufferId.toInt()))) {
- return indexById(bufferItem->id(), networkIndex(netItem->id()));
+ if((bufferItem = netItem->childById(qHash(bufferId)))) {
+ return indexByItem(bufferItem);
}
}
return QModelIndex();
if(bufferId == parent.data(BufferIdRole).value<BufferId>())
return false;
- Q_ASSERT(rootItem->childById(netId.toInt()));
- Q_ASSERT(rootItem->childById(netId.toInt())->childById(bufferId.toInt()));
+ Q_ASSERT(rootItem->childById(qHash(netId)));
+ Q_ASSERT(rootItem->childById(qHash(netId))->childById(qHash(bufferId)));
// source must be a query too
- BufferItem::Type sourceType = (BufferItem::Type)rootItem->childById(netId.toInt())->childById(bufferId.toInt())->data(0, BufferTypeRole).toInt();
+ BufferItem::Type sourceType = (BufferItem::Type)rootItem->childById(qHash(netId))->childById(qHash(bufferId))->data(0, BufferTypeRole).toInt();
if(sourceType != BufferItem::QueryType)
return false;
NetworkId networkId = netVariant.value<NetworkId>();
return Client::network(networkId);
}
+
public slots:
void bufferUpdated(BufferInfo bufferInfo);
void updateBufferActivity(const Message &msg);
-
+ void networkRemoved(const NetworkId &networkId);
+
private:
QModelIndex networkIndex(NetworkId networkId);
NetworkItem *networkItem(NetworkId networkId);
+++ /dev/null
-CREATE TABLE sender (
- senderid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
- sender TEXT UNIQUE NOT NULL)
-
-
+++ /dev/null
-CREATE TABLE network (
- networkid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
- userid INTEGER NOT NULL,
- networkname TEXT NOT NULL,
- UNIQUE (userid, networkname))
+++ /dev/null
-INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '4')
groupid INTEGER,
networkid INTEGER NOT NULL,
buffername TEXT NOT NULL,
- buffercname TEXT NOT NULL
+ buffercname TEXT NOT NULL -- CANONICAL BUFFER NAME (lowercase version)
)
\ No newline at end of file
--- /dev/null
+DELETE FROM backlog
+WHERE bufferid IN (SELECT bufferid FROM buffer WHERE networkid = :networkid)
--- /dev/null
+DELETE FROM buffer
+WHERE networkid = :networkid
--- /dev/null
+DELETE FROM ircserver
+WHERE networkid = :networkid
--- /dev/null
+DELETE FROM network
+WHERE networkid = :networkid
--- /dev/null
+INSERT INTO ircserver (userid, networkid, hostname, port, password, ssl)
+VALUES (:userid, :networkid, :hostname, :port, :password, :ssl)
--- /dev/null
+SELECT networkname
+FROM network
+WHERE userid = :userid AND networkid = :networkid
--- /dev/null
+SELECT networkid, networkname, identityid, usecustomencoding, encodingcodec, decodingcodec,
+ userandomserver, perform, useautoidentify, autoidentifyservice, autoidentifypassword,
+ useautoreconnect, autoreconnectinterval, autoreconnectretries, rejoinchannels
+FROM network
+WHERE userid = :userid
\ No newline at end of file
--- /dev/null
+SELECT hostname, port, password, ssl
+FROM ircserver
+WHERE networkid = :networkid
CREATE TABLE quasseluser (
userid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
- password BLOB NOT NULL)
+ password BLOB NOT NULL
+)
--- /dev/null
+CREATE TABLE sender ( -- THE SENDER OF IRC MESSAGES
+ senderid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ sender TEXT UNIQUE NOT NULL
+)
+
+
--- /dev/null
+CREATE TABLE network (
+ networkid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ userid INTEGER NOT NULL,
+ networkname TEXT NOT NULL,
+ identityid INTEGER NOT NULL DEFAULT 1,
+ usecustomencoding INTEGER NOT NULL DEFAULT 0, -- BOOL
+ encodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
+ decodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
+ userandomserver INTEGER NOT NULL DEFAULT 0, -- BOOL
+ perform TEXT,
+ useautoidentify INTEGER NOT NULL DEFAULT 0, -- BOOL
+ autoidentifyservice TEXT,
+ autoidentifypassword TEXT,
+ useautoreconnect INTEGER NOT NULL DEFAULT 0, -- BOOL
+ autoreconnectinterval INTEGER NOT NULL DEFAULT 0,
+ autoreconnectretries INTEGER NOT NULL DEFAULT 0,
+ rejoinchannels INTEGER NOT NULL DEFAULT 0, -- BOOL
+ UNIQUE (userid, networkname)
+)
groupid INTEGER,
networkid INTEGER NOT NULL,
buffername TEXT NOT NULL,
- buffercname TEXT NOT NULL
+ buffercname TEXT NOT NULL -- CANONICAL BUFFER NAME (lowercase version)
)
--- /dev/null
+CREATE TABLE ircserver (
+ serverid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ userid INTEGER NOT NULL,
+ networkid INTEGER NOT NULL,
+ hostname TEXT NOT NULL,
+ port INTEGER NOT NULL DEFAULT 6667,
+ password TEXT,
+ ssl INTEGER NOT NULL DEFAULT 0
+)
--- /dev/null
+INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '5')
--- /dev/null
+UPDATE network SET
+networkname = :networkname,
+identityid = :identityid,
+usecustomencoding = :usecustomencoding,
+encodingcodec = :encodingcodec,
+decodingcodec = :decodingcodec,
+userandomserver = :userandomserver,
+perform = :perform,
+useautoidentify = :useautoidentify,
+autoidentifyservice = :autoidentifyservice,
+autoidentifypassword = :autoidentifypassword,
+useautoreconnect = :useautoreconnect,
+autoreconnectinterval = :autoreconnectinterval,
+autoreconnectretries = :autoreconnectretries,
+rejoinchannels = :rejoinchannels
+WHERE networkid = :networkid
--- /dev/null
+ALTER TABLE network RENAME TO networkold
--- /dev/null
+CREATE TABLE network (
+ networkid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ userid INTEGER NOT NULL,
+ networkname TEXT NOT NULL,
+ identityid INTEGER NOT NULL DEFAULT 1,
+ usecustomencoding INTEGER NOT NULL DEFAULT 0, -- BOOL
+ encodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
+ decodingcodec TEXT NOT NULL DEFAULT "ISO-8859-15",
+ userandomserver INTEGER NOT NULL DEFAULT 0, -- BOOL
+ perform TEXT,
+ useautoidentify INTEGER NOT NULL DEFAULT 0, -- BOOL
+ autoidentifyservice TEXT,
+ autoidentifypassword TEXT,
+ useautoreconnect INTEGER NOT NULL DEFAULT 0, -- BOOL
+ autoreconnectinterval INTEGER NOT NULL DEFAULT 0,
+ autoreconnectretries INTEGER NOT NULL DEFAULT 0,
+ rejoinchannels INTEGER NOT NULL DEFAULT 0, -- BOOL
+ UNIQUE (userid, networkname)
+)
--- /dev/null
+INSERT INTO network (networkid, userid, networkname)
+SELECT networkid, userid, networkname FROM networkold;
--- /dev/null
+DROP TABLE networkold
--- /dev/null
+CREATE TABLE ircserver (
+ serverid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ userid INTEGER NOT NULL,
+ networkid INTEGER NOT NULL,
+ hostname TEXT NOT NULL,
+ port INTEGER NOT NULL DEFAULT 6667,
+ password TEXT,
+ ssl INTEGER NOT NULL DEFAULT 0 -- BOOL
+)
--- /dev/null
+UPDATE coreinfo
+SET value='5'
+WHERE key = 'schemaversion'
}
/*** Storage Access ***/
-bool Core::createNetworkId(UserId user, NetworkInfo &info) {
+bool Core::createNetwork(UserId user, NetworkInfo &info) {
QMutexLocker locker(&mutex);
- NetworkId networkId = instance()->storage->createNetworkId(user, info);
+ NetworkId networkId = instance()->storage->createNetwork(user, info);
if(!networkId.isValid())
return false;
return true;
}
+bool Core::updateNetwork(UserId user, const NetworkInfo &info) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->updateNetwork(user, info);
+}
+
+bool Core::removeNetwork(UserId user, const NetworkId &networkId) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->removeNetwork(user, networkId);
+}
+
+QList<NetworkInfo> Core::networks(UserId user) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->networks(user);
+}
+
NetworkId Core::networkId(UserId user, const QString &network) {
QMutexLocker locker(&mutex);
return instance()->storage->getNetworkId(user, network);
/*** Storage access ***/
// These methods are threadsafe.
- //! Create a NetworkId in the Storage and store it in the given NetworkInfo
+ //! Create a Network in the Storage and store it's Id in the given NetworkInfo
/** \note This method is thredsafe.
*
* \param user The core user
* \param networkInfo a NetworkInfo definition to store the newly created ID in
* \return true if successfull.
*/
- static bool createNetworkId(UserId user, NetworkInfo &info);
+ static bool createNetwork(UserId user, NetworkInfo &info);
+ //! Apply the changes to NetworkInfo info to the storage engine
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \param networkInfo The Updated NetworkInfo
+ * \return true if successfull.
+ */
+ static bool updateNetwork(UserId user, const NetworkInfo &info);
+
+ //! Permanently remove a Network and all the data associated with it.
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \param networkId The network to delete
+ * \return true if successfull.
+ */
+ static bool removeNetwork(UserId user, const NetworkId &networkId);
+
+ //! Returns a list of all NetworkInfos for the given UserId user
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \return QList<NetworkInfo>.
+ */
+ static QList<NetworkInfo> networks(UserId user);
+
//! Get the NetworkId for a network name.
/** \note This method is threadsafe.
*
createIdentity(i);
}
- // FIXME switch to a pure DB storage
- foreach(NetworkId id, s.networkIds()) {
- NetworkInfo info = s.networkInfo(id);
- createNetwork(info);
- }
- // FIXME Migrate old settings if available...
- if(!_networks.count()) {
- QVariantMap networks = s.sessionValue("Networks").toMap();
- if(networks.keys().count()) {
- qWarning() << "Migrating your old network settings to the new format!";
- foreach(QString netname, networks.keys()) {
- QVariantMap network = networks[netname].toMap();
- NetworkId netid = Core::networkId(user(), netname);
- NetworkInfo info;
- info.networkId = netid;
- info.networkName = netname;
- info.identity = 1;
- info.codecForEncoding = "ISO-8859-15";
- info.codecForDecoding = "ISO-8859-15";
- QVariantList slist;
- foreach(QVariant v, network["Servers"].toList()) {
- QVariantMap server;
- server["Host"] = v.toMap()["Address"];
- server["Port"] = v.toMap()["Port"];
- slist << server;
- }
- info.serverList = slist;
- createNetwork(info);
- }
+ // migration to pure DB storage
+ QList<NetworkId> netIds = s.networkIds();
+ if(!netIds.isEmpty()) {
+ qDebug() << "Migrating Networksettings to DB Storage for User:" << user();
+ foreach(NetworkId id, netIds) {
+ NetworkInfo info = s.networkInfo(id);
+ Core::updateNetwork(user(), info);
+ s.removeNetworkInfo(id);
}
}
+
+ foreach(NetworkInfo info, Core::networks(user())) {
+ createNetwork(info);
+ }
}
void CoreSession::saveSessionState() const {
int id;
if(!info.networkId.isValid())
- Core::createNetworkId(user(), info);
+ Core::createNetwork(user(), info);
Q_ASSERT(info.networkId.isValid());
net->setProxy(signalProxy());
_networks[id] = net;
signalProxy()->synchronize(net);
- CoreUserSettings s(user());
- s.storeNetworkInfo(info);
emit networkCreated(id);
}
return;
}
_networks[info.networkId]->setNetworkInfo(info);
- CoreUserSettings s(user());
- s.storeNetworkInfo(info);
+ Core::updateNetwork(user(), info);
}
void CoreSession::removeNetwork(NetworkId id) {
Network *net = _networks.take(id);
- if(net) {
+ if(net && Core::removeNetwork(user(), id)) {
emit networkRemoved(id);
- CoreUserSettings s(user());
- s.removeNetworkInfo(id);
net->deleteLater();
}
}
<file>./SQL/SQLite/2/upgrade_010_update_schemaversion.sql</file>
<file>./SQL/SQLite/3/upgrade_000_update_backlog_flags.sql</file>
<file>./SQL/SQLite/3/upgrade_010_update_schemaversion.sql</file>
- <file>./SQL/SQLite/4/delete_backlog_by_uid.sql</file>
- <file>./SQL/SQLite/4/delete_buffers_by_uid.sql</file>
- <file>./SQL/SQLite/4/delete_networks_by_uid.sql</file>
- <file>./SQL/SQLite/4/delete_quasseluser.sql</file>
- <file>./SQL/SQLite/4/insert_buffer.sql</file>
- <file>./SQL/SQLite/4/insert_message.sql</file>
- <file>./SQL/SQLite/4/insert_network.sql</file>
- <file>./SQL/SQLite/4/insert_quasseluser.sql</file>
- <file>./SQL/SQLite/4/insert_sender.sql</file>
- <file>./SQL/SQLite/4/select_authuser.sql</file>
- <file>./SQL/SQLite/4/select_bufferByName.sql</file>
- <file>./SQL/SQLite/4/select_buffers.sql</file>
- <file>./SQL/SQLite/4/select_lastMessage.sql</file>
- <file>./SQL/SQLite/4/select_messageRange.sql</file>
- <file>./SQL/SQLite/4/select_messages.sql</file>
- <file>./SQL/SQLite/4/select_messagesOffset.sql</file>
- <file>./SQL/SQLite/4/select_messagesSince.sql</file>
- <file>./SQL/SQLite/4/select_messagesSinceOffset.sql</file>
- <file>./SQL/SQLite/4/select_userid.sql</file>
- <file>./SQL/SQLite/4/setup_000_quasseluser.sql</file>
- <file>./SQL/SQLite/4/setup_010_sender.sql</file>
- <file>./SQL/SQLite/4/setup_020_network.sql</file>
- <file>./SQL/SQLite/4/setup_030_buffer.sql</file>
- <file>./SQL/SQLite/4/setup_040_buffer_idx.sql</file>
- <file>./SQL/SQLite/4/setup_050_buffer_cname_idx.sql</file>
- <file>./SQL/SQLite/4/setup_060_backlog.sql</file>
- <file>./SQL/SQLite/4/setup_070_coreinfo.sql</file>
- <file>./SQL/SQLite/4/setup_080_version.sql</file>
- <file>./SQL/SQLite/4/update_username.sql</file>
- <file>./SQL/SQLite/4/update_userpassword.sql</file>
<file>./SQL/SQLite/4/upgrade_000_rename_buffertable.sql</file>
<file>./SQL/SQLite/4/upgrade_010_create_buffertable.sql</file>
<file>./SQL/SQLite/4/upgrade_020_copy_buffertable.sql</file>
<file>./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql</file>
<file>./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql</file>
<file>./SQL/SQLite/4/upgrade_999_update_schemaversion.sql</file>
+ <file>./SQL/SQLite/5/delete_backlog_by_uid.sql</file>
+ <file>./SQL/SQLite/5/delete_backlog_for_network.sql</file>
+ <file>./SQL/SQLite/5/delete_buffers_by_uid.sql</file>
+ <file>./SQL/SQLite/5/delete_buffers_for_network.sql</file>
+ <file>./SQL/SQLite/5/delete_ircservers_for_network.sql</file>
+ <file>./SQL/SQLite/5/delete_network.sql</file>
+ <file>./SQL/SQLite/5/delete_networks_by_uid.sql</file>
+ <file>./SQL/SQLite/5/delete_quasseluser.sql</file>
+ <file>./SQL/SQLite/5/insert_buffer.sql</file>
+ <file>./SQL/SQLite/5/insert_message.sql</file>
+ <file>./SQL/SQLite/5/insert_network.sql</file>
+ <file>./SQL/SQLite/5/insert_quasseluser.sql</file>
+ <file>./SQL/SQLite/5/insert_sender.sql</file>
+ <file>./SQL/SQLite/5/insert_server.sql</file>
+ <file>./SQL/SQLite/5/select_authuser.sql</file>
+ <file>./SQL/SQLite/5/select_bufferByName.sql</file>
+ <file>./SQL/SQLite/5/select_buffers.sql</file>
+ <file>./SQL/SQLite/5/select_lastMessage.sql</file>
+ <file>./SQL/SQLite/5/select_messageRange.sql</file>
+ <file>./SQL/SQLite/5/select_messages.sql</file>
+ <file>./SQL/SQLite/5/select_messagesOffset.sql</file>
+ <file>./SQL/SQLite/5/select_messagesSince.sql</file>
+ <file>./SQL/SQLite/5/select_messagesSinceOffset.sql</file>
+ <file>./SQL/SQLite/5/select_networkExists.sql</file>
+ <file>./SQL/SQLite/5/select_networks_for_user.sql</file>
+ <file>./SQL/SQLite/5/select_servers_for_network.sql</file>
+ <file>./SQL/SQLite/5/select_userid.sql</file>
+ <file>./SQL/SQLite/5/setup_000_quasseluser.sql</file>
+ <file>./SQL/SQLite/5/setup_010_sender.sql</file>
+ <file>./SQL/SQLite/5/setup_020_network.sql</file>
+ <file>./SQL/SQLite/5/setup_030_buffer.sql</file>
+ <file>./SQL/SQLite/5/setup_040_buffer_idx.sql</file>
+ <file>./SQL/SQLite/5/setup_050_buffer_cname_idx.sql</file>
+ <file>./SQL/SQLite/5/setup_060_backlog.sql</file>
+ <file>./SQL/SQLite/5/setup_070_coreinfo.sql</file>
+ <file>./SQL/SQLite/5/setup_080_ircservers.sql</file>
+ <file>./SQL/SQLite/5/setup_999_version.sql</file>
+ <file>./SQL/SQLite/5/update_network.sql</file>
+ <file>./SQL/SQLite/5/update_username.sql</file>
+ <file>./SQL/SQLite/5/update_userpassword.sql</file>
+ <file>./SQL/SQLite/5/upgrade_000_rename_networktable.sql</file>
+ <file>./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql</file>
+ <file>./SQL/SQLite/5/upgrade_020_copy_networktable.sql</file>
+ <file>./SQL/SQLite/5/upgrade_030_drop_oldnetworktable.sql</file>
+ <file>./SQL/SQLite/5/upgrade_180_create_ircservers.sql</file>
+ <file>./SQL/SQLite/5/upgrade_999_update_schemaversion.sql</file>
</qresource>
</RCC>
emit userRemoved(user);
}
-NetworkId SqliteStorage::createNetworkId(UserId user, const NetworkInfo &info) {
+NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) {
NetworkId networkId;
QSqlQuery query(logDb());
query.prepare(queryString("insert_network"));
networkId = getNetworkId(user, info.networkName);
if(!networkId.isValid()) {
watchQuery(&query);
+ } else {
+ updateNetwork(user, info);
}
return networkId;
}
+bool SqliteStorage::updateNetwork(UserId user, const NetworkInfo &info) {
+ if(!isValidNetwork(user, info.networkId))
+ return false;
+
+ QSqlQuery updateQuery(logDb());
+ updateQuery.prepare(queryString("update_network"));
+ updateQuery.bindValue(":networkname", info.networkName);
+ updateQuery.bindValue(":identityid", info.identity.toInt());
+ updateQuery.bindValue(":usecustomencoding", info.useCustomEncodings ? 1 : 0);
+ updateQuery.bindValue(":encodingcodec", QString(info.codecForEncoding));
+ updateQuery.bindValue(":decodingcodec", QString(info.codecForDecoding));
+ updateQuery.bindValue(":userandomserver", info.useRandomServer ? 1 : 0);
+ updateQuery.bindValue(":perform", info.perform.join("\n"));
+ updateQuery.bindValue(":useautoidentify", info.useAutoIdentify ? 1 : 0);
+ updateQuery.bindValue(":autoidentifyservice", info.autoIdentifyService);
+ updateQuery.bindValue(":autoidentifypassword", info.autoIdentifyPassword);
+ updateQuery.bindValue(":useautoreconnect", info.useAutoReconnect ? 1 : 0);
+ updateQuery.bindValue(":autoreconnectinterval", info.autoReconnectInterval);
+ updateQuery.bindValue(":autoreconnectretries", info.autoReconnectRetries);
+ updateQuery.bindValue(":rejoinchannels", info.rejoinChannels ? 1 : 0);
+ updateQuery.bindValue(":networkid", info.networkId.toInt());
+ updateQuery.exec();
+ if(!watchQuery(&updateQuery))
+ return false;
+
+ QSqlQuery dropServersQuery(logDb());
+ dropServersQuery.prepare("DELETE FROM ircserver WHERE networkid = :networkid");
+ dropServersQuery.bindValue(":networkid", info.networkId.toInt());
+ dropServersQuery.exec();
+ if(!watchQuery(&dropServersQuery))
+ return false;
+
+ QSqlQuery insertServersQuery(logDb());
+ insertServersQuery.prepare(queryString("insert_server"));
+ foreach(QVariant server_, info.serverList) {
+ QVariantMap server = server_.toMap();
+ insertServersQuery.bindValue(":hostname", server["Host"]);
+ insertServersQuery.bindValue(":port", server["Port"].toInt());
+ insertServersQuery.bindValue(":password", server["Password"]);
+ insertServersQuery.bindValue(":ssl", server["UseSSL"].toBool() ? 1 : 0);
+ insertServersQuery.bindValue(":userid", user.toInt());
+ insertServersQuery.bindValue(":networkid", info.networkId.toInt());
+
+ insertServersQuery.exec();
+ if(!watchQuery(&insertServersQuery))
+ return false;
+ }
+
+ return true;
+}
+
+bool SqliteStorage::removeNetwork(UserId user, const NetworkId &networkId) {
+ if(!isValidNetwork(user, networkId))
+ return false;
+
+ bool withTransaction = logDb().driver()->hasFeature(QSqlDriver::Transactions);
+ if(withTransaction) {
+ sync();
+ if(!logDb().transaction()) {
+ qWarning() << "SqliteStorage::removeNetwork(): cannot start transaction. continuing with out rollback support!";
+ withTransaction = false;
+ }
+ }
+
+ QSqlQuery deleteBacklogQuery(logDb());
+ deleteBacklogQuery.prepare(queryString("delete_backlog_for_network"));
+ deleteBacklogQuery.bindValue(":networkid", networkId.toInt());
+ deleteBacklogQuery.exec();
+ if(!watchQuery(&deleteBacklogQuery)) {
+ if(withTransaction)
+ logDb().rollback();
+ return false;
+ }
+
+ QSqlQuery deleteBuffersQuery(logDb());
+ deleteBuffersQuery.prepare(queryString("delete_buffers_for_network"));
+ deleteBuffersQuery.bindValue(":networkid", networkId.toInt());
+ deleteBuffersQuery.exec();
+ if(!watchQuery(&deleteBuffersQuery)) {
+ if(withTransaction)
+ logDb().rollback();
+ return false;
+ }
+
+ QSqlQuery deleteServersQuery(logDb());
+ deleteServersQuery.prepare(queryString("delete_ircservers_for_network"));
+ deleteServersQuery.bindValue(":networkid", networkId.toInt());
+ deleteServersQuery.exec();
+ if(!watchQuery(&deleteServersQuery)) {
+ if(withTransaction)
+ logDb().rollback();
+ return false;
+ }
+
+ QSqlQuery deleteNetworkQuery(logDb());
+ deleteNetworkQuery.prepare(queryString("delete_network"));
+ deleteNetworkQuery.bindValue(":networkid", networkId.toInt());
+ deleteNetworkQuery.exec();
+ if(!watchQuery(&deleteNetworkQuery)) {
+ if(withTransaction)
+ logDb().rollback();
+ return false;
+ }
+
+ logDb().commit();
+ return true;
+}
+
+QList<NetworkInfo> SqliteStorage::networks(UserId user) {
+ QList<NetworkInfo> nets;
+
+ QSqlQuery networksQuery(logDb());
+ networksQuery.prepare(queryString("select_networks_for_user"));
+ networksQuery.bindValue(":userid", user.toInt());
+
+ QSqlQuery serversQuery(logDb());
+ serversQuery.prepare(queryString("select_servers_for_network"));
+
+ networksQuery.exec();
+ if(!watchQuery(&networksQuery))
+ return nets;
+
+ while(networksQuery.next()) {
+ NetworkInfo net;
+ net.networkId = networksQuery.value(0).toInt();
+ net.networkName = networksQuery.value(1).toString();
+ net.identity = networksQuery.value(2).toInt();
+ net.useCustomEncodings = networksQuery.value(3).toInt() == 1 ? true : false;
+ net.codecForEncoding = networksQuery.value(4).toString().toAscii();
+ net.codecForDecoding = networksQuery.value(5).toString().toAscii();
+ net.useRandomServer = networksQuery.value(6).toInt() == 1 ? true : false;
+ net.perform = networksQuery.value(7).toString().split("\n");
+ net.useAutoIdentify = networksQuery.value(8).toInt() == 1 ? true : false;
+ net.autoIdentifyService = networksQuery.value(9).toString();
+ net.autoIdentifyPassword = networksQuery.value(10).toString();
+ net.useAutoReconnect = networksQuery.value(11).toInt() == 1 ? true : false;
+ net.autoReconnectInterval = networksQuery.value(12).toUInt();
+ net.autoReconnectRetries = networksQuery.value(13).toInt();
+ net.rejoinChannels = networksQuery.value(14).toInt() == 1 ? true : false;
+
+ serversQuery.bindValue(":networkid", net.networkId.toInt());
+ serversQuery.exec();
+ if(!watchQuery(&serversQuery))
+ return nets;
+
+ QVariantList servers;
+ while(serversQuery.next()) {
+ QVariantMap server;
+ server["Host"] = serversQuery.value(0).toString();
+ server["Port"] = serversQuery.value(1).toInt();
+ server["Password"] = serversQuery.value(2).toString();
+ server["UseSSL"] = serversQuery.value(3).toInt() == 1 ? true : false;
+ servers << server;
+ }
+ net.serverList = servers;
+ nets << net;
+ }
+ return nets;
+}
+
+bool SqliteStorage::isValidNetwork(UserId user, const NetworkId &networkId) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_networkExists"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ query.exec();
+
+ watchQuery(&query); // there should not occur any errors
+ if(!query.first())
+ return false;
+
+ Q_ASSERT(!query.next());
+ return true;
+}
+
NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
QSqlQuery query(logDb());
query.prepare("SELECT networkid FROM network "
virtual void delUser(UserId user);
/* Network handling */
- virtual NetworkId createNetworkId(UserId user, const NetworkInfo &info);
+ virtual NetworkId createNetwork(UserId user, const NetworkInfo &info);
+ virtual bool updateNetwork(UserId user, const NetworkInfo &info);
+ virtual bool removeNetwork(UserId user, const NetworkId &networkId);
+ virtual QList<NetworkInfo> networks(UserId user);
/* Buffer handling */
virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "");
private:
static QString backlogFile();
+ bool isValidNetwork(UserId user, const NetworkId &networkId);
NetworkId getNetworkId(UserId user, const QString &network);
void createBuffer(UserId user, const NetworkId &networkId, const QString &buffer);
};
#include "types.h"
#include "message.h"
-struct NetworkInfo;
+#include "network.h"
class Storage : public QObject {
Q_OBJECT
/* Network handling */
- //! Create a new unique Network in the storage backend
+ //! Create a new Network in the storage backend and return it unique Id
/** \param user The core user who owns this network
* \param networkInfo The networkInfo holding the network definition
* \return the NetworkId of the newly created Network. Possibly invalid.
*/
- virtual NetworkId createNetworkId(UserId user, const NetworkInfo &info) = 0;
+ virtual NetworkId createNetwork(UserId user, const NetworkInfo &info) = 0;
+ //! Apply the changes to NetworkInfo info to the storage engine
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \param networkInfo The Updated NetworkInfo
+ * \return true if successfull.
+ */
+ virtual bool updateNetwork(UserId user, const NetworkInfo &info) = 0;
+
+ //! Permanently remove a Network and all the data associated with it.
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \param networkId The network to delete
+ * \return true if successfull.
+ */
+ virtual bool removeNetwork(UserId user, const NetworkId &networkId) = 0;
+
+ //! Returns a list of all NetworkInfos for the given UserId user
+ /** \note This method is thredsafe.
+ *
+ * \param user The core user
+ * \return QList<NetworkInfo>.
+ */
+ virtual QList<NetworkInfo> networks(UserId user) = 0;
+
//! Get the unique NetworkId of the network for a user.
/** \param user The core user who owns this network
* \param network The network name
ui.upServer->setEnabled(false);
ui.downServer->setEnabled(false);
}
-
- // FIXME disable network creation/deletion because of the storage issue
- ui.deleteNetwork->setEnabled(false);
- ui.renameNetwork->setEnabled(false);
}
void NetworksSettingsPage::setItemState(NetworkId id, QListWidgetItem *item) {
if(ui.networkList->selectedItems().count()) {
NetworkId netid = ui.networkList->selectedItems()[0]->data(Qt::UserRole).value<NetworkId>();
int ret = QMessageBox::question(this, tr("Delete Network?"),
- tr("Do you really want to delete the network \"%1\" and all related settings, including the backlog?"
- "<br><br><em>NOTE: Backlog deletion hasn't actually been implemented yet.</em>").arg(networkInfos[netid].networkName),
+ tr("Do you really want to delete the network \"%1\" and all related settings, including the backlog?").arg(networkInfos[netid].networkName),
QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
if(ret == QMessageBox::Yes) {
currentId = 0;
quasselVersion = "0.2.0-pre";
quasselDate = "2008-02-11";
- quasselBuild = 505;
+ quasselBuild = 506;
//! Minimum client build number the core needs
clientBuildNeeded = 480;
clientVersionNeeded = quasselVersion;
//! Minimum core build number the client needs
- coreBuildNeeded = 480;
+ coreBuildNeeded = 506;
coreVersionNeeded = quasselVersion;
}