+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();
+
+ QSqlQuery delBufferQuery(db);
+ delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+ delBufferQuery.bindValue(":bufferid", bufferId.toInt());
+ delBufferQuery.bindValue(":userid", user.toInt());
+
+ lockForWrite();
+ safeExec(delBufferQuery);
+ if(!watchQuery(delBufferQuery) || delBufferQuery.numRowsAffected() != 1) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ QSqlQuery delBacklogQuery(db);
+ delBacklogQuery.prepare(queryString("delete_backlog_for_buffer"));
+ delBacklogQuery.bindValue(":bufferid", bufferId.toInt());
+ safeExec(delBacklogQuery);
+ if(!watchQuery(delBacklogQuery)) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ db.commit();
+ unlock();
+ return true;
+}
+
+bool SqliteStorage::renameBuffer(const UserId &user, const BufferId &bufferId, const QString &newName) {
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ 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);
+ if(query.lastError().isValid()) {
+ // unexepcted error occured (19 == constraint violation)
+ if(query.lastError().number() != 19)
+ watchQuery(query);
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ if(query.numRowsAffected() != 1) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ db.commit();
+ unlock();
+ return true;
+}
+
+bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &bufferId1, const BufferId &bufferId2) {
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ 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);
+ if(!checkQuery.first() || checkQuery.value(0).toInt() != 2) {
+ 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);
+ if(!watchQuery(query)) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ QSqlQuery delBufferQuery(db);
+ delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+ delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
+ safeExec(delBufferQuery);
+ if(!watchQuery(delBufferQuery)) {
+ db.rollback();
+ unlock();
+ return false;
+ }
+
+ db.commit();
+ unlock();
+ return true;
+}
+
+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();
+
+ QSqlQuery query(db);
+ query.prepare(queryString("select_buffer_lastseen_messages"));
+ query.bindValue(":userid", user.toInt());
+
+ lockForRead();
+ safeExec(query);
+ if(!watchQuery(query)) {
+ db.commit();
+ unlock();
+ return lastSeenHash;
+ }
+
+ while(query.next()) {
+ lastSeenHash[query.value(0).toInt()] = query.value(1).toInt();
+ }
+ db.commit();
+ unlock();
+
+ return lastSeenHash;
+}
+
+bool SqliteStorage::logMessage(Message &msg) {
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ QSqlQuery logMessageQuery(db);
+ logMessageQuery.prepare(queryString("insert_message"));
+
+ logMessageQuery.bindValue(":time", msg.timestamp().toTime_t());
+ logMessageQuery.bindValue(":bufferid", msg.bufferInfo().bufferId().toInt());
+ logMessageQuery.bindValue(":type", msg.type());
+ logMessageQuery.bindValue(":flags", (int)msg.flags());
+ logMessageQuery.bindValue(":sender", msg.sender());
+ logMessageQuery.bindValue(":message", msg.contents());
+
+ lockForWrite();
+ safeExec(logMessageQuery);
+
+ if(logMessageQuery.lastError().isValid()) {