Lots of new internal stuff (breaking protocol):
[quassel.git] / src / core / sqlitestorage.cpp
index 81f2fa9..3176ec4 100644 (file)
@@ -355,6 +355,70 @@ NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
     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());
@@ -494,26 +558,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;
 }
@@ -548,11 +612,16 @@ 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;
+
+  BufferInfo bufferInfo = getBufferInfo(user, bufferId);
+  if(!bufferInfo.isValid())
+    return messagelist;
+
   // we have to determine the real offset first
   QSqlQuery *offsetQuery = cachedQuery("select_messagesOffset");
-  offsetQuery->bindValue(":bufferid", buffer.bufferId().toInt());
+  offsetQuery->bindValue(":bufferid", bufferId.toInt());
   offsetQuery->bindValue(":messageid", offset);
   offsetQuery->exec();
   offsetQuery->first();
@@ -560,7 +629,7 @@ QList<Message> SqliteStorage::requestMsgs(BufferInfo buffer, int lastmsgs, int o
 
   // 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();
@@ -569,7 +638,7 @@ 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(),
@@ -581,11 +650,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();
@@ -593,7 +667,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();
@@ -602,7 +676,7 @@ 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(),
@@ -615,10 +689,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();
@@ -627,7 +706,7 @@ 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(),
@@ -667,7 +746,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")