fixing a big oopsie that would cause the creation of a new empty buffer on any observ...
[quassel.git] / src / core / sqlitestorage.cpp
index 054b389..cbcacf7 100644 (file)
@@ -214,12 +214,17 @@ IdentityId SqliteStorage::createIdentity(UserId user, CoreIdentity &identity) {
   query.bindValue(":kickreason", identity.kickReason());
   query.bindValue(":partreason", identity.partReason());
   query.bindValue(":quitreason", identity.quitReason());
+#ifdef HAVE_SSL
   query.bindValue(":sslcert", identity.sslCert().toPem());
   query.bindValue(":sslkey", identity.sslKey().toPem());
+#else
+  query.bindValue(":sslcert", QByteArray());
+  query.bindValue(":sslkey", QByteArray());
+#endif
+
   safeExec(query);
 
   identityId = query.lastInsertId().toInt();
-  qDebug() << identityId << identity.nicks();
   if(!identityId.isValid()) {
     watchQuery(query);
   } else {
@@ -269,15 +274,22 @@ bool SqliteStorage::updateIdentity(UserId user, const CoreIdentity &identity) {
   query.bindValue(":kickreason", identity.kickReason());
   query.bindValue(":partreason", identity.partReason());
   query.bindValue(":quitreason", identity.quitReason());
+#ifdef HAVE_SSL
   query.bindValue(":sslcert", identity.sslCert().toPem());
   query.bindValue(":sslkey", identity.sslKey().toPem());
+#else
+  query.bindValue(":sslcert", QByteArray());
+  query.bindValue(":sslkey", QByteArray());
+#endif
   query.bindValue(":identityid", identity.id().toInt());
   safeExec(query);
+  watchQuery(query);
 
   QSqlQuery deleteNickQuery(logDb());
   deleteNickQuery.prepare(queryString("delete_nicks"));
   deleteNickQuery.bindValue(":identityid", identity.id().toInt());
   safeExec(deleteNickQuery);
+  watchQuery(deleteNickQuery);
 
   QSqlQuery insertNickQuery(logDb());
   insertNickQuery.prepare(queryString("insert_nick"));
@@ -285,6 +297,7 @@ bool SqliteStorage::updateIdentity(UserId user, const CoreIdentity &identity) {
     insertNickQuery.bindValue(":identityid", identity.id().toInt());
     insertNickQuery.bindValue(":nick", nick);
     safeExec(insertNickQuery);
+    watchQuery(insertNickQuery);
   }
 
   return true;
@@ -344,8 +357,10 @@ QList<CoreIdentity> SqliteStorage::identities(UserId user) {
     identity.setKickReason(query.value(15).toString());
     identity.setPartReason(query.value(16).toString());
     identity.setQuitReason(query.value(17).toString());
+#ifdef HAVE_SSL
     identity.setSslCert(query.value(18).toByteArray());
     identity.setSslKey(query.value(19).toByteArray());
+#endif
 
     nickQuery.bindValue(":identityid", identity.id().toInt());
     QList<QString> nicks;
@@ -416,12 +431,19 @@ bool SqliteStorage::updateNetwork(UserId user, const NetworkInfo &info) {
   QSqlQuery insertServersQuery(logDb());
   insertServersQuery.prepare(queryString("insert_server"));
   foreach(Network::Server server, info.serverList) {
+    insertServersQuery.bindValue(":userid", user.toInt());
+    insertServersQuery.bindValue(":networkid", info.networkId.toInt());
     insertServersQuery.bindValue(":hostname", server.host);
     insertServersQuery.bindValue(":port", server.port);
     insertServersQuery.bindValue(":password", server.password);
     insertServersQuery.bindValue(":ssl", server.useSsl ? 1 : 0);
-    insertServersQuery.bindValue(":userid", user.toInt());
-    insertServersQuery.bindValue(":networkid", info.networkId.toInt());
+    insertServersQuery.bindValue(":sslversion", server.sslVersion);
+    insertServersQuery.bindValue(":useproxy", server.useProxy ? 1 : 0);
+    insertServersQuery.bindValue(":proxytype", server.proxyType);
+    insertServersQuery.bindValue(":proxyhost", server.proxyHost);
+    insertServersQuery.bindValue(":proxyport", server.proxyPort);
+    insertServersQuery.bindValue(":proxyuser", server.proxyUser);
+    insertServersQuery.bindValue(":proxypass", server.proxyPass);
 
     safeExec(insertServersQuery);
     if(!watchQuery(insertServersQuery))
@@ -533,6 +555,13 @@ QList<NetworkInfo> SqliteStorage::networks(UserId user) {
       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;
@@ -662,7 +691,7 @@ void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, Buffer
   watchQuery(query);
 }
 
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
+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());
@@ -671,6 +700,9 @@ BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId,
   safeExec(query);
 
   if(!query.first()) {
+    if(!create)
+      return BufferInfo();
+
     createBuffer(user, networkId, type, buffer);
     safeExec(query);
     if(!query.first()) {
@@ -762,45 +794,45 @@ bool SqliteStorage::removeBuffer(const UserId &user, const BufferId &bufferId) {
   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());
-  safeExec(existsQuery);
-  if(!watchQuery(existsQuery))
+bool SqliteStorage::renameBuffer(const UserId &user, const BufferId &bufferId, const QString &newName) {
+  if(!isValidBuffer(user, bufferId))
     return false;
 
-  if(!existsQuery.first())
+  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;
+  }
 
-  const int bufferid = existsQuery.value(0).toInt();
-
-  Q_ASSERT(!existsQuery.next());
+  return true;
+}
 
-  // ... and if the new name is still free.
-  existsQuery.bindValue(":networkid", networkId.toInt());
-  existsQuery.bindValue(":userid", user.toInt());
-  existsQuery.bindValue(":buffercname", newName.toLower());
-  safeExec(existsQuery);
-  if(!watchQuery(existsQuery))
+bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &bufferId1, const BufferId &bufferId2) {
+  if(!isValidBuffer(user, bufferId1) || !isValidBuffer(user, bufferId2))
     return false;
 
-  if(existsQuery.first())
+  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 renameBufferQuery(logDb());
-  renameBufferQuery.prepare(queryString("update_buffer_name"));
-  renameBufferQuery.bindValue(":buffername", newName);
-  renameBufferQuery.bindValue(":buffercname", newName.toLower());
-  renameBufferQuery.bindValue(":bufferid", bufferid);
-  safeExec(renameBufferQuery);
-  if(watchQuery(existsQuery))
-    return BufferId(bufferid);
-  else
-    return BufferId();
+  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) {