- while(networksQuery.next()) {
- NetworkInfo net;
- net.networkId = networksQuery.value(0).toInt();
- net.networkName = networksQuery.value(1).toString();
- net.identity = networksQuery.value(2).toInt();
- net.codecForServer = networksQuery.value(3).toString().toAscii();
- 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.unlimitedReconnectRetries = networksQuery.value(14).toInt() == 1 ? true : false;
- net.rejoinChannels = networksQuery.value(15).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;
-}
-
-bool SqliteStorage::isValidBuffer(const UserId &user, const BufferId &bufferId) {
- QSqlQuery query(logDb());
- query.prepare(queryString("select_bufferExists"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":bufferid", bufferId.toInt());
- query.exec();
-
- watchQuery(&query);
- 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 "
- "WHERE userid = :userid AND networkname = :networkname");
- query.bindValue(":userid", user.toInt());
- query.bindValue(":networkname", network);
- query.exec();
-
- if(query.first())
- return query.value(0).toInt();
- else
- return NetworkId();
-}
-
-QList<NetworkId> SqliteStorage::connectedNetworks(UserId user) {
- QList<NetworkId> connectedNets;
- QSqlQuery query(logDb());
- query.prepare(queryString("select_connected_networks"));
- query.bindValue(":userid", user.toInt());
- query.exec();
- watchQuery(&query);
-
- while(query.next()) {
- connectedNets << query.value(0).toInt();
- }
-
- return connectedNets;
-}
-
-void SqliteStorage::setNetworkConnected(UserId user, const NetworkId &networkId, bool isConnected) {
- QSqlQuery query(logDb());
- query.prepare(queryString("update_network_connected"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":networkid", networkId.toInt());
- query.bindValue(":connected", isConnected ? 1 : 0);
- query.exec();
- watchQuery(&query);
-}
-
-QHash<QString, QString> SqliteStorage::persistentChannels(UserId user, const NetworkId &networkId) {
- QHash<QString, QString> persistentChans;
- QSqlQuery query(logDb());
- query.prepare(queryString("select_persistent_channels"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":networkid", networkId.toInt());
- query.exec();
- watchQuery(&query);
-
- while(query.next()) {
- persistentChans[query.value(0).toString()] = query.value(1).toString();
- }
-
- return persistentChans;
-}
-
-void SqliteStorage::setChannelPersistent(UserId user, const NetworkId &networkId, const QString &channel, bool isJoined) {
- QSqlQuery query(logDb());
- query.prepare(queryString("update_buffer_persistent_channel"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":networkId", networkId.toInt());
- query.bindValue(":buffercname", channel.toLower());
- query.bindValue(":joined", isJoined ? 1 : 0);
- query.exec();
- watchQuery(&query);
-}
-
-void SqliteStorage::setPersistentChannelKey(UserId user, const NetworkId &networkId, const QString &channel, const QString &key) {
- QSqlQuery query(logDb());
- query.prepare(queryString("update_buffer_set_channel_key"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":networkId", networkId.toInt());
- query.bindValue(":buffercname", channel.toLower());
- query.bindValue(":key", key);
- query.exec();
- watchQuery(&query);
-}
-
-
-void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
- QSqlQuery *query = cachedQuery("insert_buffer");
- query->bindValue(":userid", user.toInt());
- query->bindValue(":networkid", networkId.toInt());
- query->bindValue(":buffertype", (int)type);
- query->bindValue(":buffername", buffer);
- query->bindValue(":buffercname", buffer.toLower());
- query->exec();
-
- watchQuery(query);
-}
-
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
- QSqlQuery *query = cachedQuery("select_bufferByName");
- query->bindValue(":networkid", networkId.toInt());
- query->bindValue(":userid", user.toInt());
- query->bindValue(":buffercname", buffer.toLower());
- query->exec();
-
- if(!query->first()) {
- createBuffer(user, networkId, type, buffer);
- query->exec();
- if(!query->first()) {
- watchQuery(query);
- qWarning() << "unable to create BufferInfo for:" << user << networkId << buffer;
- return BufferInfo();
- }
- }
-
- BufferInfo bufferInfo = BufferInfo(query->value(0).toInt(), networkId, (BufferInfo::Type)query->value(1).toInt(), 0, buffer);
- if(query->next()) {
- qWarning() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
- qWarning() << " Query:" << query->lastQuery();
- qWarning() << " bound Values:" << query->boundValues();
- Q_ASSERT(false);
- }
-
- return bufferInfo;
-}
-
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const BufferId &bufferId) {
- QSqlQuery query(logDb());
- query.prepare(queryString("select_buffer_by_id"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":bufferid", bufferId.toInt());
- query.exec();
- if(!watchQuery(&query))
- return BufferInfo();
-
- if(!query.first())
- return BufferInfo();
-
- BufferInfo bufferInfo(query.value(0).toInt(), query.value(1).toInt(), (BufferInfo::Type)query.value(2).toInt(), 0, query.value(4).toString());
- Q_ASSERT(!query.next());
-
- return bufferInfo;
-}
-
-QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
- uint time = 0;
- if(since.isValid())
- time = since.toTime_t();
-
- QList<BufferInfo> bufferlist;
- QSqlQuery query(logDb());
- query.prepare(queryString("select_buffers"));
- query.bindValue(":userid", user.toInt());
- query.bindValue(":time", time);
-
- query.exec();
- watchQuery(&query);
- while(query.next()) {
- bufferlist << BufferInfo(query.value(0).toInt(), query.value(1).toInt(), (BufferInfo::Type)query.value(2).toInt(), query.value(3).toInt(), query.value(4).toString());
- }
- return bufferlist;
-}
-
-bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) {
- if(!isValidBuffer(user, bufferId))
- return false;
-
- QSqlQuery delBacklogQuery(logDb());
- delBacklogQuery.prepare(queryString("delete_backlog_for_buffer"));
- delBacklogQuery.bindValue(":bufferid", bufferId.toInt());
- delBacklogQuery.exec();
- if(!watchQuery(&delBacklogQuery))
- return false;
-
- QSqlQuery delBufferQuery(logDb());
- delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
- delBufferQuery.bindValue(":bufferid", bufferId.toInt());
- delBufferQuery.exec();
- if(!watchQuery(&delBufferQuery))
- return false;
-
- return true;
-}
-
-BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) {
- // check if such a buffer exists...
- QSqlQuery existsQuery(logDb());
- existsQuery.prepare(queryString("select_bufferByName"));
- existsQuery.bindValue(":networkid", networkId.toInt());
- existsQuery.bindValue(":userid", user.toInt());
- existsQuery.bindValue(":buffercname", oldName.toLower());
- existsQuery.exec();
- if(!watchQuery(&existsQuery))
- return false;
-
- if(!existsQuery.first())
- return false;
-
- const int bufferid = existsQuery.value(0).toInt();
-
- Q_ASSERT(!existsQuery.next());
-
- // ... and if the new name is still free.
- existsQuery.bindValue(":networkid", networkId.toInt());
- existsQuery.bindValue(":userid", user.toInt());
- existsQuery.bindValue(":buffercname", newName.toLower());
- existsQuery.exec();
- if(!watchQuery(&existsQuery))
- return false;
-
- if(existsQuery.first())
- return false;
-
- QSqlQuery renameBufferQuery(logDb());
- renameBufferQuery.prepare(queryString("update_buffer_name"));
- renameBufferQuery.bindValue(":buffername", newName);
- renameBufferQuery.bindValue(":buffercname", newName.toLower());
- renameBufferQuery.bindValue(":bufferid", bufferid);
- renameBufferQuery.exec();
- if(watchQuery(&existsQuery))
- return BufferId(bufferid);
- else
- return BufferId();
-}
-
-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(":lastseenmsgid", msgId.toInt());
- query->exec();
- watchQuery(query);
-}
-
-QHash<BufferId, MsgId> SqliteStorage::bufferLastSeenMsgIds(UserId user) {
- QHash<BufferId, MsgId> lastSeenHash;
- QSqlQuery query(logDb());
- query.prepare(queryString("select_buffer_lastseen_messages"));
- query.bindValue(":userid", user.toInt());
- query.exec();
- if(!watchQuery(&query))
+ {
+ QSqlQuery delBacklogQuery(db);
+ delBacklogQuery.prepare(queryString("delete_backlog_for_buffer"));
+ delBacklogQuery.bindValue(":bufferid", bufferId.toInt());
+
+ safeExec(delBacklogQuery);
+ error = !watchQuery(delBacklogQuery);
+ }
+
+ if (error) {
+ db.rollback();
+ }
+ else {
+ db.commit();
+ }
+ unlock();
+ return !error;
+}
+
+
+bool SqliteStorage::renameBuffer(const UserId &user, const BufferId &bufferId, const QString &newName)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_buffer_name"));
+ query.bindValue(":buffername", newName);
+ query.bindValue(":buffercname", newName.toLower());
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":userid", user.toInt());
+
+ lockForWrite();
+ safeExec(query);
+
+ error = query.lastError().isValid();
+ // unexepcted error occured (19 == constraint violation)
+ if (error && query.lastError().number() != 19) {
+ watchQuery(query);
+ }
+ else {
+ error |= (query.numRowsAffected() != 1);
+ }
+ }
+ if (error) {
+ db.rollback();
+ }
+ else {
+ db.commit();
+ }
+ unlock();
+ return !error;
+}
+
+
+bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &bufferId1, const BufferId &bufferId2)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery checkQuery(db);
+ checkQuery.prepare(queryString("select_buffers_for_merge"));
+ checkQuery.bindValue(":oldbufferid", bufferId2.toInt());
+ checkQuery.bindValue(":newbufferid", bufferId1.toInt());
+ checkQuery.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(checkQuery);
+ error = (!checkQuery.first() || checkQuery.value(0).toInt() != 2);
+ }
+ if (error) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_backlog_bufferid"));
+ query.bindValue(":oldbufferid", bufferId2.toInt());
+ query.bindValue(":newbufferid", bufferId1.toInt());
+ safeExec(query);
+ error = !watchQuery(query);
+ }
+ if (error) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ {
+ QSqlQuery delBufferQuery(db);
+ delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+ delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
+ delBufferQuery.bindValue(":userid", user.toInt());
+ safeExec(delBufferQuery);
+ error = !watchQuery(delBufferQuery);
+ }
+
+ if (error) {
+ db.rollback();
+ }
+ else {
+ db.commit();
+ }
+ unlock();
+ return !error;
+}
+
+
+void SqliteStorage::setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_buffer_lastseen"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":bufferid", bufferId.toInt());
+ query.bindValue(":lastseenmsgid", msgId.toInt());
+
+ lockForWrite();
+ safeExec(query);
+ watchQuery(query);
+ }
+ db.commit();
+ unlock();
+}
+
+
+QHash<BufferId, MsgId> SqliteStorage::bufferLastSeenMsgIds(UserId user)
+{
+ QHash<BufferId, MsgId> lastSeenHash;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_lastseen_messages"));
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ error = !watchQuery(query);
+ if (!error) {
+ while (query.next()) {
+ lastSeenHash[query.value(0).toInt()] = query.value(1).toInt();
+ }
+ }
+ }
+
+ db.commit();
+ unlock();