+void SqliteStorage::setUserSetting(UserId userId, const QString &settingName, const QVariant &data) {
+ QByteArray rawData;
+ QDataStream out(&rawData, QIODevice::WriteOnly);
+ out.setVersion(QDataStream::Qt_4_2);
+ out << data;
+
+ QSqlQuery query(logDb());
+ query.prepare(queryString("insert_user_setting"));
+ query.bindValue(":userid", userId.toInt());
+ query.bindValue(":settingname", settingName);
+ query.bindValue(":settingvalue", rawData);
+ query.exec();
+
+ if(query.lastError().isValid()) {
+ QSqlQuery updateQuery(logDb());
+ updateQuery.prepare(queryString("update_user_setting"));
+ updateQuery.bindValue(":userid", userId.toInt());
+ updateQuery.bindValue(":settingname", settingName);
+ updateQuery.bindValue(":settingvalue", rawData);
+ updateQuery.exec();
+ }
+
+}
+
+QVariant SqliteStorage::getUserSetting(UserId userId, const QString &settingName, const QVariant &defaultData) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_user_setting"));
+ query.bindValue(":userid", userId.toInt());
+ query.bindValue(":settingname", settingName);
+ query.exec();
+
+ if(query.first()) {
+ QVariant data;
+ QByteArray rawData = query.value(0).toByteArray();
+ QDataStream in(&rawData, QIODevice::ReadOnly);
+ in.setVersion(QDataStream::Qt_4_2);
+ in >> data;
+ return data;
+ } else {
+ return defaultData;
+ }
+}
+
+NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) {
+ NetworkId networkId;
+ QSqlQuery query(logDb());
+ query.prepare(queryString("insert_network"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkname", info.networkName);
+ query.exec();
+
+ 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(":servercodec", QString(info.codecForServer));
+ 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(":unlimitedconnectretries", info.unlimitedReconnectRetries ? 1 : 0);
+ 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;