- 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());
- safeExec(serversQuery);
- if(!watchQuery(serversQuery))
- return nets;
-
- Network::ServerList servers;
- while(serversQuery.next()) {
- Network::Server server;
- server.host = serversQuery.value(0).toString();
- server.port = serversQuery.value(1).toUInt();
- server.password = serversQuery.value(2).toString();
- server.useSsl = serversQuery.value(3).toInt() == 1 ? true : false;
- server.sslVersion = serversQuery.value(4).toInt();
- server.useProxy = serversQuery.value(5).toInt() == 1 ? true : false;
- server.proxyType = serversQuery.value(6).toInt();
- server.proxyHost = serversQuery.value(7).toString();
- server.proxyPort = serversQuery.value(8).toUInt();
- server.proxyUser = serversQuery.value(9).toString();
- server.proxyPass = serversQuery.value(10).toString();
- 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());
- safeExec(query);
-
- 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());
- safeExec(query);
-
- 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);
- safeExec(query);
-
- 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());
- safeExec(query);
- 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);
- safeExec(query);
- 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());
- safeExec(query);
- 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);
- safeExec(query);
- 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);
- safeExec(query);
- watchQuery(query);
-}
-
-
-void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
- QSqlQuery query(logDb());
- query.prepare(queryString("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());
- safeExec(query);
-
- watchQuery(query);
-}
-
-BufferInfo SqliteStorage::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer, bool create) {
- QSqlQuery query(logDb());
- query.prepare(queryString("select_bufferByName"));
- query.bindValue(":networkid", networkId.toInt());
- query.bindValue(":userid", user.toInt());
- query.bindValue(":buffercname", buffer.toLower());
- safeExec(query);
-
- if(!query.first()) {
- if(!create)
- return BufferInfo();
-
- createBuffer(user, networkId, type, buffer);
- safeExec(query);
- 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()) {
- qCritical() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
- qCritical() << " Query:" << query.lastQuery();
- qCritical() << " bound Values:";
- QList<QVariant> list = query.boundValues().values();
- for (int i = 0; i < list.size(); ++i)
- qCritical() << i << ":" << list.at(i).toString().toAscii().data();
- 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());
- safeExec(query);
- 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) {
- QList<BufferInfo> bufferlist;
- QSqlQuery query(logDb());
- query.prepare(queryString("select_buffers"));
- query.bindValue(":userid", user.toInt());
-
- safeExec(query);
- 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;
-}
-
-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());
-
- safeExec(query);
- 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;
-
- QSqlQuery delBacklogQuery(logDb());
- delBacklogQuery.prepare(queryString("delete_backlog_for_buffer"));
- delBacklogQuery.bindValue(":bufferid", bufferId.toInt());
- safeExec(delBacklogQuery);
- if(!watchQuery(delBacklogQuery))
- return false;
-
- QSqlQuery delBufferQuery(logDb());
- delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
- delBufferQuery.bindValue(":bufferid", bufferId.toInt());
- safeExec(delBufferQuery);
- if(!watchQuery(delBufferQuery))
- return false;
-
- return true;
-}
-
-bool SqliteStorage::renameBuffer(const UserId &user, const BufferId &bufferId, const QString &newName) {
- if(!isValidBuffer(user, bufferId))
- return false;
-
- QSqlQuery query(logDb());
- query.prepare(queryString("update_buffer_name"));
- query.bindValue(":buffername", newName);
- query.bindValue(":buffercname", newName.toLower());
- query.bindValue(":bufferid", bufferId.toInt());
- safeExec(query);
- if(query.lastError().isValid()) {
- // unexepcted error occured (19 == constraint violation)
- if(query.lastError().number() != 19)
- watchQuery(query);
- return false;
- }
-
- return true;
-}
-
-bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &bufferId1, const BufferId &bufferId2) {
- if(!isValidBuffer(user, bufferId1) || !isValidBuffer(user, bufferId2))
- return false;
-
- QSqlQuery query(logDb());
- query.prepare(queryString("update_backlog_bufferid"));
- query.bindValue(":oldbufferid", bufferId2.toInt());
- query.bindValue(":newbufferid", bufferId1.toInt());
- safeExec(query);
- if(!watchQuery(query))
- return false;
-
- QSqlQuery delBufferQuery(logDb());
- delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
- delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
- safeExec(delBufferQuery);
- watchQuery(delBufferQuery);
-
- return true;
-}
-
-void SqliteStorage::setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId) {
- QSqlQuery query(logDb());
- query.prepare(queryString("update_buffer_lastseen"));
-
- query.bindValue(":userid", user.toInt());
- query.bindValue(":bufferid", bufferId.toInt());
- query.bindValue(":lastseenmsgid", msgId.toInt());
- safeExec(query);
- 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());
- safeExec(query);
- if(!watchQuery(query))
+void SqliteStorage::setUserModes(UserId user, NetworkId networkId, const QString &userModes)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_network_set_usermode"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ query.bindValue(":usermode", userModes);
+
+ lockForWrite();
+ safeExec(query);
+ watchQuery(query);
+ db.commit();
+ }
+ unlock();
+}
+
+
+BufferInfo SqliteStorage::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer, bool create)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ BufferInfo bufferInfo;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_bufferByName"));
+ query.bindValue(":networkid", networkId.toInt());
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":buffercname", buffer.toLower());
+
+ lockForRead();
+ safeExec(query);
+
+ if (query.first()) {
+ bufferInfo = BufferInfo(query.value(0).toInt(), networkId, (BufferInfo::Type)query.value(1).toInt(), 0, buffer);
+ if (query.next()) {
+ qCritical() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
+ qCritical() << " Query:" << query.lastQuery();
+ qCritical() << " bound Values:";
+ QList<QVariant> list = query.boundValues().values();
+ for (int i = 0; i < list.size(); ++i)
+ qCritical() << i << ":" << list.at(i).toString().toLatin1().data();
+ Q_ASSERT(false);
+ }
+ }
+ else if (create) {
+ // let's create the buffer
+ QSqlQuery createQuery(db);
+ createQuery.prepare(queryString("insert_buffer"));
+ createQuery.bindValue(":userid", user.toInt());
+ createQuery.bindValue(":networkid", networkId.toInt());
+ createQuery.bindValue(":buffertype", (int)type);
+ createQuery.bindValue(":buffername", buffer);
+ createQuery.bindValue(":buffercname", buffer.toLower());
+ createQuery.bindValue(":joined", type & BufferInfo::ChannelBuffer ? 1 : 0);
+
+ unlock();
+ lockForWrite();
+ safeExec(createQuery);
+ watchQuery(createQuery);
+ bufferInfo = BufferInfo(createQuery.lastInsertId().toInt(), networkId, type, 0, buffer);
+ }
+ }
+ db.commit();
+ unlock();
+ return bufferInfo;
+}
+
+
+BufferInfo SqliteStorage::getBufferInfo(UserId user, const BufferId &bufferId)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ BufferInfo bufferInfo;
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_by_id"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":bufferid", bufferId.toInt());
+
+ lockForRead();
+ safeExec(query);
+
+ if (watchQuery(query) && query.first()) {
+ 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());
+ }
+ db.commit();
+ }
+ unlock();
+ return bufferInfo;
+}
+
+
+QList<BufferInfo> SqliteStorage::requestBuffers(UserId user)
+{
+ QList<BufferInfo> bufferlist;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffers"));
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ 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());
+ }
+ db.commit();
+ }
+ unlock();
+
+ return bufferlist;
+}
+
+
+QList<BufferId> SqliteStorage::requestBufferIdsForNetwork(UserId user, NetworkId networkId)
+{
+ QList<BufferId> bufferList;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffers_for_network"));
+ query.bindValue(":networkid", networkId.toInt());
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ watchQuery(query);
+ while (query.next()) {
+ bufferList << BufferId(query.value(0).toInt());
+ }
+ db.commit();
+ }
+ unlock();
+
+ return bufferList;
+}
+
+
+bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId)
+{
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ bool error = false;
+ {
+ QSqlQuery delBufferQuery(db);
+ delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+ delBufferQuery.bindValue(":bufferid", bufferId.toInt());
+ delBufferQuery.bindValue(":userid", user.toInt());
+
+ lockForWrite();
+ safeExec(delBufferQuery);
+
+ error = (!watchQuery(delBufferQuery) || delBufferQuery.numRowsAffected() != 1);
+ }
+
+ if (error) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ {
+ 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();