Removed some whitespaces..
[quassel.git] / src / core / sqlitestorage.cpp
index 1548085..7f4dd78 100644 (file)
@@ -24,6 +24,9 @@
 
 #include "network.h"
 
+#include "util.h"
+#include "logger.h"
+
 SqliteStorage::SqliteStorage(QObject *parent)
   : AbstractSqlStorage(parent)
 {
@@ -131,6 +134,49 @@ void SqliteStorage::delUser(UserId user) {
   emit userRemoved(user);
 }
 
+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());
@@ -143,7 +189,9 @@ NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) {
   if(!networkId.isValid()) {
     watchQuery(&query);
   } else {
-    updateNetwork(user, info);
+    NetworkInfo newNetworkInfo = info;
+    newNetworkInfo.networkId = networkId;
+    updateNetwork(user, newNetworkInfo);
   }
   return networkId;
 }
@@ -209,7 +257,7 @@ bool SqliteStorage::removeNetwork(UserId user, const NetworkId &networkId) {
   if(withTransaction) {
     sync();
     if(!logDb().transaction()) {
-      qWarning() << "SqliteStorage::removeNetwork(): cannot start transaction. continuing with out rollback support!";
+      quWarning() << "SqliteStorage::removeNetwork(): cannot start transaction. continuing with out rollback support!";
       withTransaction = false;
     }
   }
@@ -443,16 +491,19 @@ BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId,
     query->exec();
     if(!query->first()) {
       watchQuery(query);
-      qWarning() << "unable to create BufferInfo for:" << user << networkId << buffer;
+      quWarning() << "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();
+    quError() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
+    quError() << "         Query:" << query->lastQuery();
+    quError() << "  bound Values:";
+    QList<QVariant> list = query->boundValues().values();
+    for (int i = 0; i < list.size(); ++i)
+      quError() << i << ":" << list.at(i).toString().toAscii().data();
     Q_ASSERT(false);
   }
 
@@ -477,16 +528,11 @@ BufferInfo SqliteStorage::getBufferInfo(UserId user, const BufferId &bufferId) {
   return bufferInfo;
 }
 
-QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
-  uint time = 0;
-  if(since.isValid())
-    time = since.toTime_t();
-  
+QList<BufferInfo> SqliteStorage::requestBuffers(UserId user) {
   QList<BufferInfo> bufferlist;
   QSqlQuery query(logDb());
   query.prepare(queryString("select_buffers"));
   query.bindValue(":userid", user.toInt());
-  query.bindValue(":time", time);
   
   query.exec();
   watchQuery(&query);
@@ -496,6 +542,21 @@ QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
   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());
+
+  query.exec();
+  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;
@@ -558,26 +619,26 @@ BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networ
     return BufferId();
 }
 
-void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
+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(":lastseen", seenDate.toTime_t());
+  query->bindValue(":lastseenmsgid", msgId.toInt());
   query->exec();
   watchQuery(query);
 }
 
-QHash<BufferId, QDateTime> SqliteStorage::bufferLastSeenDates(UserId user) {
-  QHash<BufferId, QDateTime> lastSeenHash;
+QHash<BufferId, MsgId> SqliteStorage::bufferLastSeenMsgIds(UserId user) {
+  QHash<BufferId, MsgId> lastSeenHash;
   QSqlQuery query(logDb());
-  query.prepare(queryString("select_buffer_lastseen_dates"));
+  query.prepare(queryString("select_buffer_lastseen_messages"));
   query.bindValue(":userid", user.toInt());
   query.exec();
   if(!watchQuery(&query))
     return lastSeenHash;
 
   while(query.next()) {
-    lastSeenHash[query.value(0).toInt()] = QDateTime::fromTime_t(query.value(1).toUInt());
+    lastSeenHash[query.value(0).toInt()] = query.value(1).toInt();
   }
   return lastSeenHash;
 }
@@ -587,9 +648,9 @@ MsgId SqliteStorage::logMessage(Message msg) {
   logMessageQuery->bindValue(":time", msg.timestamp().toTime_t());
   logMessageQuery->bindValue(":bufferid", msg.bufferInfo().bufferId().toInt());
   logMessageQuery->bindValue(":type", msg.type());
-  logMessageQuery->bindValue(":flags", msg.flags());
+  logMessageQuery->bindValue(":flags", (int)msg.flags());
   logMessageQuery->bindValue(":sender", msg.sender());
-  logMessageQuery->bindValue(":message", msg.text());
+  logMessageQuery->bindValue(":message", msg.contents());
   logMessageQuery->exec();
   
   if(logMessageQuery->lastError().isValid()) {
@@ -612,19 +673,28 @@ MsgId SqliteStorage::logMessage(Message msg) {
   return msgId;
 }
 
-QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int offset) {
+QList<Message> SqliteStorage::requestMsgs(UserId user, BufferId bufferId, int lastmsgs, int offset) {
   QList<Message> messagelist;
-  // we have to determine the real offset first
-  QSqlQuery *offsetQuery = cachedQuery("select_messagesOffset");
-  offsetQuery->bindValue(":bufferid", buffer.bufferId().toInt());
-  offsetQuery->bindValue(":messageid", offset);
-  offsetQuery->exec();
-  offsetQuery->first();
-  offset = offsetQuery->value(0).toInt();
+
+  BufferInfo bufferInfo = getBufferInfo(user, bufferId);
+  if(!bufferInfo.isValid())
+    return messagelist;
+
+  if(offset == -1) {
+    offset = 0;
+  } else {
+    // we have to determine the real offset first
+    QSqlQuery *offsetQuery = cachedQuery("select_messagesOffset");
+    offsetQuery->bindValue(":bufferid", bufferId.toInt());
+    offsetQuery->bindValue(":messageid", offset);
+    offsetQuery->exec();
+    offsetQuery->first();
+    offset = offsetQuery->value(0).toInt();
+  }
 
   // now let's select the messages
   QSqlQuery *msgQuery = cachedQuery("select_messages");
-  msgQuery->bindValue(":bufferid", buffer.bufferId().toInt());
+  msgQuery->bindValue(":bufferid", bufferId.toInt());
   msgQuery->bindValue(":limit", lastmsgs);
   msgQuery->bindValue(":offset", offset);
   msgQuery->exec();
@@ -633,11 +703,11 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int o
   
   while(msgQuery->next()) {
     Message msg(QDateTime::fromTime_t(msgQuery->value(1).toInt()),
-                buffer,
+                bufferInfo,
                 (Message::Type)msgQuery->value(2).toUInt(),
                 msgQuery->value(5).toString(),
                 msgQuery->value(4).toString(),
-                msgQuery->value(3).toUInt());
+                (Message::Flags)msgQuery->value(3).toUInt());
     msg.setMsgId(msgQuery->value(0).toInt());
     messagelist << msg;
   }
@@ -645,11 +715,16 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int o
 }
 
 
-QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, QDateTime since, int offset) {
+QList<Message> SqliteStorage::requestMsgs(UserId user, BufferId bufferId, QDateTime since, int offset) {
   QList<Message> messagelist;
+
+  BufferInfo bufferInfo = getBufferInfo(user, bufferId);
+  if(!bufferInfo.isValid())
+    return messagelist;
+
   // we have to determine the real offset first
   QSqlQuery *offsetQuery = cachedQuery("select_messagesSinceOffset");
-  offsetQuery->bindValue(":bufferid", buffer.bufferId().toInt());
+  offsetQuery->bindValue(":bufferid", bufferId.toInt());
   offsetQuery->bindValue(":since", since.toTime_t());
   offsetQuery->exec();
   offsetQuery->first();
@@ -657,7 +732,7 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, QDateTime since, in
 
   // now let's select the messages
   QSqlQuery *msgQuery = cachedQuery("select_messagesSince");
-  msgQuery->bindValue(":bufferid", buffer.bufferId().toInt());
+  msgQuery->bindValue(":bufferid", bufferId.toInt());
   msgQuery->bindValue(":since", since.toTime_t());
   msgQuery->bindValue(":offset", offset);
   msgQuery->exec();
@@ -666,11 +741,11 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, QDateTime since, in
   
   while(msgQuery->next()) {
     Message msg(QDateTime::fromTime_t(msgQuery->value(1).toInt()),
-                buffer,
+                bufferInfo,
                 (Message::Type)msgQuery->value(2).toUInt(),
                 msgQuery->value(5).toString(),
                 msgQuery->value(4).toString(),
-                msgQuery->value(3).toUInt());
+                (Message::Flags)msgQuery->value(3).toUInt());
     msg.setMsgId(msgQuery->value(0).toInt());
     messagelist << msg;
   }
@@ -679,10 +754,15 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, QDateTime since, in
 }
 
 
-QList<Message> SqliteStorage::requestMsgRange(BufferInfo buffer, int first, int last) {
+QList<Message> SqliteStorage::requestMsgRange(UserId user, BufferId bufferId, int first, int last) {
   QList<Message> messagelist;
+
+  BufferInfo bufferInfo = getBufferInfo(user, bufferId);
+  if(!bufferInfo.isValid())
+    return messagelist;
+
   QSqlQuery *rangeQuery = cachedQuery("select_messageRange");
-  rangeQuery->bindValue(":bufferid", buffer.bufferId().toInt());
+  rangeQuery->bindValue(":bufferid", bufferId.toInt());
   rangeQuery->bindValue(":firstmsg", first);
   rangeQuery->bindValue(":lastmsg", last);
   rangeQuery->exec();
@@ -691,11 +771,11 @@ QList<Message> SqliteStorage::requestMsgRange(BufferInfo buffer, int first, int
   
   while(rangeQuery->next()) {
     Message msg(QDateTime::fromTime_t(rangeQuery->value(1).toInt()),
-                buffer,
+                bufferInfo,
                 (Message::Type)rangeQuery->value(2).toUInt(),
                 rangeQuery->value(5).toString(),
                 rangeQuery->value(4).toString(),
-                rangeQuery->value(3).toUInt());
+                (Message::Flags)rangeQuery->value(3).toUInt());
     msg.setMsgId(rangeQuery->value(0).toInt());
     messagelist << msg;
   }
@@ -704,18 +784,7 @@ QList<Message> SqliteStorage::requestMsgRange(BufferInfo buffer, int first, int
 }
 
 QString SqliteStorage::backlogFile() {
-  // kinda ugly, but I currently see no other way to do that
-#ifdef Q_OS_WIN32
-  QString quasselDir = QDir::homePath() + qgetenv("APPDATA") + "\\quassel\\";
-#else
-  QString quasselDir = QDir::homePath() + "/.quassel/";
-#endif
-
-  QDir qDir(quasselDir);
-  if(!qDir.exists(quasselDir))
-    qDir.mkpath(quasselDir);
-  
-  return quasselDir + "quassel-storage.sqlite";  
+  return quasselDir().absolutePath() + "/quassel-storage.sqlite";  
 }
 
 
@@ -731,7 +800,7 @@ bool SqliteStorage::init(const QVariantMap &settings) {
     return false;
 
   if(!checkMigratedQuery.first())
-    return false;
+    return true;               // table is empty -> no work to be done
 
   QString passType = checkMigratedQuery.value(0).toString().toLower();
   if(passType == "text")
@@ -744,7 +813,7 @@ bool SqliteStorage::init(const QVariantMap &settings) {
   getPasswordsQuery.exec();
 
   if(!watchQuery(&getPasswordsQuery)) {
-    qWarning() << "unable to migrate to new password format!";
+    quError() << "unable to migrate to new password format!";
     return false;
   }
 
@@ -762,6 +831,6 @@ bool SqliteStorage::init(const QVariantMap &settings) {
     watchQuery(&setPasswordsQuery);
   }
 
-  qDebug() << "successfully migrated passwords!";
+  quDebug() << "successfully migrated passwords!";
   return true;
 }