- Fixed the inconsitency bug lately introduced. Adding networks is now
authorMarcus Eggenberger <egs@quassel-irc.org>
Sat, 2 Feb 2008 16:26:14 +0000 (16:26 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sat, 2 Feb 2008 16:26:14 +0000 (16:26 +0000)
reenabled. Renaming and Deleting is still deactivated since they
aren't handled in a pretty manner.
- This fix enabled us to totally drop network names as
identifiers. BufferInfo::bufferName() is history.
- the buffergroup table is gone. SQLite Schemaversion is now 2.
- introduced: bool SignedId::isValid(). Please use this for future
validity checks.

WARNING: DISTCLEAN IS MANDATORY!

49 files changed:
src/client/client.cpp
src/common/bufferinfo.cpp
src/common/bufferinfo.h
src/common/message.cpp
src/common/types.h
src/core/SQL/SQLite/1/insert_buffer.sql [deleted file]
src/core/SQL/SQLite/1/select_messageRange.sql [deleted file]
src/core/SQL/SQLite/2/delete_backlog_by_uid.sql [moved from src/core/SQL/SQLite/1/delete_backlog_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/2/delete_buffers_by_uid.sql [moved from src/core/SQL/SQLite/1/delete_buffers_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/2/delete_networks_by_uid.sql [moved from src/core/SQL/SQLite/1/delete_networks_by_uid.sql with 100% similarity]
src/core/SQL/SQLite/2/delete_quasseluser.sql [moved from src/core/SQL/SQLite/1/delete_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/2/insert_buffer.sql [new file with mode: 0644]
src/core/SQL/SQLite/2/insert_message.sql [moved from src/core/SQL/SQLite/1/insert_message.sql with 100% similarity]
src/core/SQL/SQLite/2/insert_network.sql [moved from src/core/SQL/SQLite/1/insert_network.sql with 100% similarity]
src/core/SQL/SQLite/2/insert_quasseluser.sql [moved from src/core/SQL/SQLite/1/insert_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/2/insert_sender.sql [moved from src/core/SQL/SQLite/1/insert_sender.sql with 100% similarity]
src/core/SQL/SQLite/2/select_authuser.sql [moved from src/core/SQL/SQLite/1/select_authuser.sql with 100% similarity]
src/core/SQL/SQLite/2/select_bufferByName.sql [moved from src/core/SQL/SQLite/1/select_bufferByName.sql with 100% similarity]
src/core/SQL/SQLite/2/select_buffers.sql [moved from src/core/SQL/SQLite/1/select_buffers.sql with 68% similarity]
src/core/SQL/SQLite/2/select_lastMessage.sql [moved from src/core/SQL/SQLite/1/select_lastMessage.sql with 100% similarity]
src/core/SQL/SQLite/2/select_messageRange.sql [new file with mode: 0644]
src/core/SQL/SQLite/2/select_messages.sql [moved from src/core/SQL/SQLite/1/select_messages.sql with 57% similarity]
src/core/SQL/SQLite/2/select_messagesOffset.sql [moved from src/core/SQL/SQLite/1/select_messagesOffset.sql with 100% similarity]
src/core/SQL/SQLite/2/select_messagesSince.sql [moved from src/core/SQL/SQLite/1/select_messagesSince.sql with 53% similarity]
src/core/SQL/SQLite/2/select_messagesSinceOffset.sql [moved from src/core/SQL/SQLite/1/select_messagesSinceOffset.sql with 100% similarity]
src/core/SQL/SQLite/2/select_userid.sql [moved from src/core/SQL/SQLite/1/select_userid.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_000_quasseluser.sql [moved from src/core/SQL/SQLite/1/setup_000_quasseluser.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_010_sender.sql [moved from src/core/SQL/SQLite/1/setup_010_sender.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_020_network.sql [moved from src/core/SQL/SQLite/1/setup_020_network.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_040_buffer.sql [moved from src/core/SQL/SQLite/1/setup_040_buffer.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_050_buffer_idx.sql [moved from src/core/SQL/SQLite/1/setup_050_buffer_idx.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_060_backlog.sql [moved from src/core/SQL/SQLite/1/setup_060_backlog.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_070_coreinfo.sql [moved from src/core/SQL/SQLite/1/setup_070_coreinfo.sql with 100% similarity]
src/core/SQL/SQLite/2/setup_080_version.sql [moved from src/core/SQL/SQLite/1/setup_080_version.sql with 100% similarity]
src/core/SQL/SQLite/2/update_username.sql [moved from src/core/SQL/SQLite/1/update_username.sql with 100% similarity]
src/core/SQL/SQLite/2/update_userpassword.sql [moved from src/core/SQL/SQLite/1/update_userpassword.sql with 100% similarity]
src/core/SQL/SQLite/2/upgrade_000_drop_buffergroup.sql [new file with mode: 0644]
src/core/SQL/SQLite/2/upgrade_010_update_schemaversion.sql [new file with mode: 0644]
src/core/abstractsqlstorage.cpp
src/core/core.cpp
src/core/core.h
src/core/coresession.cpp
src/core/coresession.h
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h
src/qtui/settingspages/networkssettingspage.cpp
version.inc

index 9e3fc9a..e79ae46 100644 (file)
@@ -369,7 +369,8 @@ void Client::recvMessage(const Message &msg) {
   networkModel()->updateBufferActivity(msg);
 
   if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) {
   networkModel()->updateBufferActivity(msg);
 
   if(msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) {
-    QString sender = msg.buffer().network() + ":" + msg.buffer().buffer() + ":" + msg.sender();
+    // FIXME: fetch networkName();
+    QString sender = ":" + msg.buffer().buffer() + ":" + msg.sender();
     Message mmsg = Message(msg.timestamp(), msg.buffer(), msg.type(), msg.text(), sender, msg.flags());
     monitorBuffer()->appendMsg(mmsg);
   }
     Message mmsg = Message(msg.timestamp(), msg.buffer(), msg.type(), msg.text(), sender, msg.flags());
     monitorBuffer()->appendMsg(mmsg);
   }
index e36defc..8d45a47 100644 (file)
@@ -31,16 +31,16 @@ BufferInfo::BufferInfo()
   : _id(0),
     _netid(0),
     _gid(0),
   : _id(0),
     _netid(0),
     _gid(0),
-    _networkName(QString()),
-    _bufferName(QString()) {
+    _bufferName(QString())
+{
 }
 
 }
 
-BufferInfo::BufferInfo(BufferId id,  NetworkId networkid, uint gid, QString net, QString buf)
+BufferInfo::BufferInfo(BufferId id,  NetworkId networkid, uint gid, QString buf)
   : _id(id),
     _netid(networkid),
     _gid(gid),
   : _id(id),
     _netid(networkid),
     _gid(gid),
-    _networkName(net),
-    _bufferName(buf) {
+    _bufferName(buf)
+{
 }
 
 QString BufferInfo::buffer() const {
 }
 
 QString BufferInfo::buffer() const {
@@ -51,22 +51,19 @@ QString BufferInfo::buffer() const {
 }
 
 QDebug operator<<(QDebug dbg, const BufferInfo &b) {
 }
 
 QDebug operator<<(QDebug dbg, const BufferInfo &b) {
-  dbg.nospace() << "(bufId: " << b.uid() << ", netId: " << b.networkId() << ", groupId: " << b.groupId()
-                << ", net: " << b.network() << ", buf: " << b.buffer() << ")";
-
+  dbg.nospace() << "(bufId: " << b.uid() << ", netId: " << b.networkId() << ", groupId: " << b.groupId() << ", buf: " << b.buffer() << ")";
   return dbg.space();
 }
 
 QDataStream &operator<<(QDataStream &out, const BufferInfo &bufferInfo) {
   return dbg.space();
 }
 
 QDataStream &operator<<(QDataStream &out, const BufferInfo &bufferInfo) {
-  out << bufferInfo._id << bufferInfo._netid << bufferInfo._gid << bufferInfo._networkName.toUtf8() << bufferInfo._bufferName.toUtf8();
+  out << bufferInfo._id << bufferInfo._netid << bufferInfo._gid << bufferInfo._bufferName.toUtf8();
   return out;
 }
 
 QDataStream &operator>>(QDataStream &in, BufferInfo &bufferInfo) {
   return out;
 }
 
 QDataStream &operator>>(QDataStream &in, BufferInfo &bufferInfo) {
-  QByteArray n, b;
-  in >> bufferInfo._id >> bufferInfo._netid >> bufferInfo._gid >> n >> b;
-  bufferInfo._networkName = QString::fromUtf8(n);
-  bufferInfo._bufferName = QString::fromUtf8(b);
+  QByteArray buffername;
+  in >> bufferInfo._id >> bufferInfo._netid >> bufferInfo._gid >> buffername;
+  bufferInfo._bufferName = QString::fromUtf8(buffername);
   return in;
 }
 
   return in;
 }
 
index 5e2b5f2..f0b9203 100644 (file)
@@ -29,12 +29,11 @@ class QDataStream;
 class BufferInfo {
 public:
   BufferInfo();
 class BufferInfo {
 public:
   BufferInfo();
-  BufferInfo(BufferId id, NetworkId networkid, uint gid = 0, QString net = QString(), QString buf = QString());
+  BufferInfo(BufferId id, NetworkId networkid, uint gid = 0, QString buf = QString());
   
   inline BufferId uid() const { return _id; }
   inline NetworkId networkId() const { return _netid; }
   inline uint groupId() const { return _gid; }
   
   inline BufferId uid() const { return _id; }
   inline NetworkId networkId() const { return _netid; }
   inline uint groupId() const { return _gid; }
-  inline QString network() const { return _networkName; }
   QString buffer() const;
   
   void setGroupId(uint gid) { _gid = gid; }
   QString buffer() const;
   
   void setGroupId(uint gid) { _gid = gid; }
@@ -45,7 +44,6 @@ private:
   BufferId _id;
   NetworkId _netid;
   uint _gid;
   BufferId _id;
   NetworkId _netid;
   uint _gid;
-  QString _networkName; // WILL BE REMOVED
   QString _bufferName;
   
   friend uint qHash(const BufferInfo &);
   QString _bufferName;
   
   friend uint qHash(const BufferInfo &);
index e51cc6b..d49e6cb 100644 (file)
@@ -115,7 +115,6 @@ void Message::format() {
   QString host = hostFromMask(sender());
   QString nick = nickFromMask(sender());
   QString txt = mircToInternal(text());
   QString host = hostFromMask(sender());
   QString nick = nickFromMask(sender());
   QString txt = mircToInternal(text());
-  QString networkName = buffer().network();
   QString bufferName = buffer().buffer();
 
   _formattedTimestamp = tr("%DT[%1]").arg(timestamp().toLocalTime().toString("hh:mm:ss"));
   QString bufferName = buffer().buffer();
 
   _formattedTimestamp = tr("%DT[%1]").arg(timestamp().toLocalTime().toString("hh:mm:ss"));
index 64bfbbc..551bd13 100644 (file)
@@ -32,6 +32,7 @@ class SignedId {
   public:
     inline SignedId(int _id = 0) { id = _id; }
     inline qint32 toInt() const { return id; }
   public:
     inline SignedId(int _id = 0) { id = _id; }
     inline qint32 toInt() const { return id; }
+    inline bool isValid() const { return id > 0; }
 
     inline bool operator==(const SignedId &other) const { return id == other.id; }
     inline bool operator!=(const SignedId &other) const { return id != other.id; }
 
     inline bool operator==(const SignedId &other) const { return id == other.id; }
     inline bool operator!=(const SignedId &other) const { return id != other.id; }
diff --git a/src/core/SQL/SQLite/1/insert_buffer.sql b/src/core/SQL/SQLite/1/insert_buffer.sql
deleted file mode 100644 (file)
index 84ac02a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-INSERT INTO buffer (userid, networkid, buffername)
-VALUES (:userid, (SELECT networkid FROM network WHERE networkname = :networkname AND userid = :userid2), :buffername)
diff --git a/src/core/SQL/SQLite/1/select_messageRange.sql b/src/core/SQL/SQLite/1/select_messageRange.sql
deleted file mode 100644 (file)
index 55dd073..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-SELECT messageid, time,  type, flags, sender, message, displayname
-FROM backlog
-JOIN buffer ON backlog.bufferid = buffer.bufferid
-JOIN sender ON backlog.senderid = sender.senderid
-LEFT JOIN buffergroup ON buffer.groupid = buffergroup.groupid
-WHERE (buffer.bufferid = :bufferid OR buffer.groupid = (SELECT groupid FROM buffer WHERE bufferid = :bufferid2)) AND backlog.messageid >= :firstmsg AND backlog.messageid <= :lastmsg
-ORDER BY messageid DESC
diff --git a/src/core/SQL/SQLite/2/insert_buffer.sql b/src/core/SQL/SQLite/2/insert_buffer.sql
new file mode 100644 (file)
index 0000000..da5aa80
--- /dev/null
@@ -0,0 +1,2 @@
+INSERT INTO buffer (userid, networkid, buffername)
+VALUES (:userid, :networkid, :buffername)
similarity index 68%
rename from src/core/SQL/SQLite/1/select_buffers.sql
rename to src/core/SQL/SQLite/2/select_buffers.sql
index 11e21c5..0e096e6 100644 (file)
@@ -1,4 +1,4 @@
-SELECT DISTINCT buffer.bufferid, buffername, network.networkid, networkname
+SELECT DISTINCT buffer.bufferid, buffername, network.networkid
 FROM buffer
 JOIN network ON buffer.networkid = network.networkid
 JOIN backlog ON buffer.bufferid = backlog.bufferid
 FROM buffer
 JOIN network ON buffer.networkid = network.networkid
 JOIN backlog ON buffer.bufferid = backlog.bufferid
diff --git a/src/core/SQL/SQLite/2/select_messageRange.sql b/src/core/SQL/SQLite/2/select_messageRange.sql
new file mode 100644 (file)
index 0000000..0b63e07
--- /dev/null
@@ -0,0 +1,6 @@
+SELECT messageid, time,  type, flags, sender, message, displayname
+FROM backlog
+JOIN buffer ON backlog.bufferid = buffer.bufferid
+JOIN sender ON backlog.senderid = sender.senderid
+WHERE buffer.bufferid = :bufferid AND backlog.messageid >= :firstmsg AND backlog.messageid <= :lastmsg
+ORDER BY messageid DESC
similarity index 57%
rename from src/core/SQL/SQLite/1/select_messages.sql
rename to src/core/SQL/SQLite/2/select_messages.sql
index b9596e7..4514d94 100644 (file)
@@ -2,7 +2,6 @@ SELECT messageid, time,  type, flags, sender, message, displayname
 FROM backlog
 JOIN buffer ON backlog.bufferid = buffer.bufferid
 JOIN sender ON backlog.senderid = sender.senderid
 FROM backlog
 JOIN buffer ON backlog.bufferid = buffer.bufferid
 JOIN sender ON backlog.senderid = sender.senderid
-LEFT JOIN buffergroup ON buffer.groupid = buffergroup.groupid
-WHERE buffer.bufferid = :bufferid OR buffer.groupid = (SELECT groupid FROM buffer WHERE bufferid = :bufferid2)
+WHERE buffer.bufferid = :bufferid
 ORDER BY messageid DESC
 LIMIT :limit OFFSET :offset
 ORDER BY messageid DESC
 LIMIT :limit OFFSET :offset
@@ -2,7 +2,6 @@ SELECT messageid, time,  type, flags, sender, message, displayname
 FROM backlog
 JOIN buffer ON backlog.bufferid = buffer.bufferid
 JOIN sender ON backlog.senderid = sender.senderid
 FROM backlog
 JOIN buffer ON backlog.bufferid = buffer.bufferid
 JOIN sender ON backlog.senderid = sender.senderid
-LEFT JOIN buffergroup ON buffer.groupid = buffergroup.groupid
-WHERE (buffer.bufferid = :bufferid OR buffer.groupid = (SELECT groupid FROM buffer WHERE bufferid = :bufferid2)) AND backlog.time >= :since
+WHERE buffer.bufferid = :bufferid AND backlog.time >= :since
 ORDER BY messageid DESC
 LIMIT -1 OFFSET :offset
 ORDER BY messageid DESC
 LIMIT -1 OFFSET :offset
diff --git a/src/core/SQL/SQLite/2/upgrade_000_drop_buffergroup.sql b/src/core/SQL/SQLite/2/upgrade_000_drop_buffergroup.sql
new file mode 100644 (file)
index 0000000..82fe07f
--- /dev/null
@@ -0,0 +1 @@
+DROP TABLE buffergroup
diff --git a/src/core/SQL/SQLite/2/upgrade_010_update_schemaversion.sql b/src/core/SQL/SQLite/2/upgrade_010_update_schemaversion.sql
new file mode 100644 (file)
index 0000000..eb15178
--- /dev/null
@@ -0,0 +1,3 @@
+UPDATE coreinfo
+SET value='2'
+WHERE key = 'schemaversion'
index 4744270..bc18caf 100644 (file)
@@ -170,7 +170,6 @@ QStringList AbstractSqlStorage::upgradeQueries(int version) {
   QStringList queries;
   QDir dir = QDir(QString(":/SQL/%1/%2/").arg(engineName()).arg(version));
   foreach(QFileInfo fileInfo, dir.entryInfoList(QStringList() << "upgrade*", QDir::NoFilter, QDir::Name)) {
   QStringList queries;
   QDir dir = QDir(QString(":/SQL/%1/%2/").arg(engineName()).arg(version));
   foreach(QFileInfo fileInfo, dir.entryInfoList(QStringList() << "upgrade*", QDir::NoFilter, QDir::Name)) {
-    qDebug() << queryString(fileInfo.baseName());
     queries << queryString(fileInfo.baseName());
   }
   return queries;
     queries << queryString(fileInfo.baseName());
   }
   return queries;
@@ -221,13 +220,13 @@ int AbstractSqlStorage::schemaVersion() {
 bool AbstractSqlStorage::watchQuery(QSqlQuery *query) {
   if(query->lastError().isValid()) {
     qWarning() << "unhandled Error in QSqlQuery!";
 bool AbstractSqlStorage::watchQuery(QSqlQuery *query) {
   if(query->lastError().isValid()) {
     qWarning() << "unhandled Error in QSqlQuery!";
-    qWarning() << "                  last Query:" << query->lastQuery();
-    qWarning() << "              executed Query:" << query->executedQuery();
-    qWarning() << "                bound Values:" << query->boundValues();
-    qWarning() << "                Error Number:" << query->lastError().number();
-    qWarning() << "               Error Message:" << query->lastError().text();
-    qWarning() << "              Driver Message:" << query->lastError().driverText();
-    qWarning() << "                  DB Message:" << query->lastError().databaseText();
+    qWarning() << "                  last Query:\n" << query->lastQuery();
+    qWarning() << "              executed Query:\n" << query->executedQuery();
+    qWarning() << "                bound Values:"   << query->boundValues();
+    qWarning() << "                Error Number:"   << query->lastError().number();
+    qWarning() << "               Error Message:"   << query->lastError().text();
+    qWarning() << "              Driver Message:"   << query->lastError().driverText();
+    qWarning() << "                  DB Message:"   << query->lastError().databaseText();
     
     return false;
   }
     
     return false;
   }
index e222a13..2024387 100644 (file)
@@ -28,6 +28,7 @@
 #include "coresettings.h"
 #include "signalproxy.h"
 #include "sqlitestorage.h"
 #include "coresettings.h"
 #include "signalproxy.h"
 #include "sqlitestorage.h"
+#include "network.h"
 
 Core *Core::instanceptr = 0;
 QMutex Core::mutex;
 
 Core *Core::instanceptr = 0;
 QMutex Core::mutex;
@@ -127,15 +128,24 @@ void Core::saveState() {
 }
 
 /*** Storage Access ***/
 }
 
 /*** Storage Access ***/
+bool Core::createNetworkId(UserId user, NetworkInfo &info) {
+  QMutexLocker locker(&mutex);
+  NetworkId networkId = instance()->storage->createNetworkId(user, info);
+  if(!networkId.isValid())
+    return false;
+  
+  info.networkId = networkId;
+  return true;
+}
 
 NetworkId Core::networkId(UserId user, const QString &network) {
   QMutexLocker locker(&mutex);
   return instance()->storage->getNetworkId(user, network);
 }
 
 
 NetworkId Core::networkId(UserId user, const QString &network) {
   QMutexLocker locker(&mutex);
   return instance()->storage->getNetworkId(user, network);
 }
 
-BufferInfo Core::bufferInfo(UserId user, const QString &network, const QString &buffer) {
+BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
   //QMutexLocker locker(&mutex);
   //QMutexLocker locker(&mutex);
-  return instance()->storage->getBufferInfo(user, network, buffer);
+  return instance()->storage->getBufferInfo(user, networkId, buffer);
 }
 
 MsgId Core::storeMessage(const Message &message) {
 }
 
 MsgId Core::storeMessage(const Message &message) {
index 67f6dec..51237ec 100644 (file)
@@ -37,6 +37,7 @@
 class CoreSession;
 class SessionThread;
 class Storage;
 class CoreSession;
 class SessionThread;
 class Storage;
+struct NetworkInfo;
 
 class Core : public QObject {
   Q_OBJECT
 
 class Core : public QObject {
   Q_OBJECT
@@ -51,6 +52,15 @@ class Core : public QObject {
     /*** Storage access ***/
     // These methods are threadsafe.
 
     /*** Storage access ***/
     // These methods are threadsafe.
 
+    //! Create a NetworkId in the Storage and store it in the given NetworkInfo
+    /** \note This method is thredsafe.
+     *
+     *  \param user        The core user
+     *  \param networkInfo a NetworkInfo definition to store the newly created ID in
+     *  \return true if successfull.
+     */
+    static bool createNetworkId(UserId user, NetworkInfo &info);
+       
     //! Get the NetworkId for a network name.
     /** \note This method is threadsafe.
      *
     //! Get the NetworkId for a network name.
     /** \note This method is threadsafe.
      *
@@ -63,12 +73,12 @@ class Core : public QObject {
     //! Get the unique BufferInfo for the given combination of network and buffername for a user.
     /** \note This method is threadsafe.
      *
     //! Get the unique BufferInfo for the given combination of network and buffername for a user.
     /** \note This method is threadsafe.
      *
-     *  \param user    The core user who owns this buffername
-     *  \param network The network name
-     *  \param buffer  The buffer name (if empty, the net's status buffer is returned)
+     *  \param user      The core user who owns this buffername
+     *  \param networkId The network id
+     *  \param buffer    The buffer name (if empty, the net's status buffer is returned)
      *  \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
      */
      *  \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
      */
-    static BufferInfo bufferInfo(UserId user, const QString &network, const QString &buffer = "");
+    static BufferInfo bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "");
 
     //! Store a Message in the backlog.
     /** \note This method is threadsafe.
 
     //! Store a Message in the backlog.
     /** \note This method is threadsafe.
index cbc6110..02cc668 100644 (file)
@@ -128,9 +128,10 @@ void CoreSession::loadSettings() {
     createIdentity(i);
   }
 
     createIdentity(i);
   }
 
+  // FIXME switch to a pure DB storage
   foreach(NetworkId id, s.networkIds()) {
     NetworkInfo info = s.networkInfo(id);
   foreach(NetworkId id, s.networkIds()) {
     NetworkInfo info = s.networkInfo(id);
-    createNetwork(info, true);
+    createNetwork(info);
   }
 
   // FIXME Migrate old settings if available...
   }
 
   // FIXME Migrate old settings if available...
@@ -155,7 +156,7 @@ void CoreSession::loadSettings() {
           slist << server;
         }
         info.serverList = slist;
           slist << server;
         }
         info.serverList = slist;
-        createNetwork(info, true);
+        createNetwork(info);
       }
     }
   }
       }
     }
   }
@@ -265,7 +266,7 @@ SignalProxy *CoreSession::signalProxy() const {
 
 // FIXME we need a sane way for creating buffers!
 void CoreSession::networkConnected(NetworkId networkid) {
 
 // FIXME we need a sane way for creating buffers!
 void CoreSession::networkConnected(NetworkId networkid) {
-  Core::bufferInfo(user(), networkConnection(networkid)->networkName()); // create status buffer
+  Core::bufferInfo(user(), networkid); // create status buffer
 }
 
 void CoreSession::networkDisconnected(NetworkId networkid) {
 }
 
 void CoreSession::networkDisconnected(NetworkId networkid) {
@@ -289,15 +290,17 @@ void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) {
 // ALL messages coming pass through these functions before going to the GUI.
 // So this is the perfect place for storing the backlog and log stuff.
 void CoreSession::recvMessageFromServer(Message::Type type, QString target, QString text, QString sender, quint8 flags) {
 // ALL messages coming pass through these functions before going to the GUI.
 // So this is the perfect place for storing the backlog and log stuff.
 void CoreSession::recvMessageFromServer(Message::Type type, QString target, QString text, QString sender, quint8 flags) {
-  NetworkConnection *s = qobject_cast<NetworkConnection*>(this->sender());
-  Q_ASSERT(s);
-  BufferInfo buf;
-  if((flags & Message::PrivMsg) && !(flags & Message::Self)) {
-    buf = Core::bufferInfo(user(), s->networkName(), nickFromMask(sender));
-  } else {
-    buf = Core::bufferInfo(user(), s->networkName(), target);
-  }
-  Message msg(buf, type, text, sender, flags);
+  NetworkConnection *netCon = qobject_cast<NetworkConnection*>(this->sender());
+  Q_ASSERT(netCon);
+
+  QString bufferName;
+  if((flags & Message::PrivMsg) && !(flags & Message::Self))
+    bufferName = nickFromMask(sender);
+  else
+    bufferName = target;
+
+  BufferInfo bufferInfo = Core::bufferInfo(user(), netCon->networkId(), bufferName);
+  Message msg(bufferInfo, type, text, sender, flags);
   msg.setMsgId(Core::storeMessage(msg));
   Q_ASSERT(msg.msgId() != 0);
   emit displayMsg(msg);
   msg.setMsgId(Core::storeMessage(msg));
   Q_ASSERT(msg.msgId() != 0);
   emit displayMsg(msg);
@@ -417,17 +420,18 @@ void CoreSession::removeIdentity(IdentityId id) {
 
 /*** Network Handling ***/
 
 
 /*** Network Handling ***/
 
-void CoreSession::createNetwork(const NetworkInfo &_info, bool useId) {
-  NetworkInfo info = _info;
+void CoreSession::createNetwork(const NetworkInfo &info_) {
+  NetworkInfo info = info_;
   int id;
   int id;
-  if(useId && info.networkId > 0) id = info.networkId.toInt();
-  else {
-    for(id = 1; id <= _networks.count(); id++) {
-      if(!_networks.keys().contains(id)) break;
-    }
-    //qDebug() << "found free id" << i;
-    info.networkId = id;
-  }
+
+  if(!info.networkId.isValid())
+    Core::createNetworkId(user(), info);
+
+  Q_ASSERT(info.networkId.isValid());
+
+  id = info.networkId.toInt();
+  Q_ASSERT(!_networks.contains(id));
+  
   Network *net = new Network(id, this);
   connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId)));
   connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId)));
   Network *net = new Network(id, this);
   connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId)));
   connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId)));
index 9726f4c..208095c 100644 (file)
@@ -88,7 +88,7 @@ public slots:
   //! Create a network and propagate the changes to the clients.
   /** \param info The network's settings.
    */
   //! Create a network and propagate the changes to the clients.
   /** \param info The network's settings.
    */
-  void createNetwork(const NetworkInfo &info, bool useId = false);
+  void createNetwork(const NetworkInfo &info);
 
   //! Update a network and propagate the changes to the clients.
   /** \param info The updated network settings.
 
   //! Update a network and propagate the changes to the clients.
   /** \param info The updated network settings.
index f4da999..6498a91 100644 (file)
@@ -1,36 +1,38 @@
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
 <!DOCTYPE RCC><RCC version="1.0">
 <qresource>
-    <file>./SQL/SQLite/1/delete_backlog_by_uid.sql</file>
-    <file>./SQL/SQLite/1/delete_buffers_by_uid.sql</file>
-    <file>./SQL/SQLite/1/delete_networks_by_uid.sql</file>
-    <file>./SQL/SQLite/1/delete_quasseluser.sql</file>
-    <file>./SQL/SQLite/1/insert_buffer.sql</file>
-    <file>./SQL/SQLite/1/insert_message.sql</file>
-    <file>./SQL/SQLite/1/insert_network.sql</file>
-    <file>./SQL/SQLite/1/insert_quasseluser.sql</file>
-    <file>./SQL/SQLite/1/insert_sender.sql</file>
-    <file>./SQL/SQLite/1/select_authuser.sql</file>
-    <file>./SQL/SQLite/1/select_bufferByName.sql</file>
-    <file>./SQL/SQLite/1/select_buffers.sql</file>
-    <file>./SQL/SQLite/1/select_lastMessage.sql</file>
-    <file>./SQL/SQLite/1/select_messageRange.sql</file>
-    <file>./SQL/SQLite/1/select_messages.sql</file>
-    <file>./SQL/SQLite/1/select_messagesOffset.sql</file>
-    <file>./SQL/SQLite/1/select_messagesSince.sql</file>
-    <file>./SQL/SQLite/1/select_messagesSinceOffset.sql</file>
-    <file>./SQL/SQLite/1/select_userid.sql</file>
-    <file>./SQL/SQLite/1/setup_000_quasseluser.sql</file>
-    <file>./SQL/SQLite/1/setup_010_sender.sql</file>
-    <file>./SQL/SQLite/1/setup_020_network.sql</file>
-    <file>./SQL/SQLite/1/setup_040_buffer.sql</file>
-    <file>./SQL/SQLite/1/setup_050_buffer_idx.sql</file>
-    <file>./SQL/SQLite/1/setup_060_backlog.sql</file>
-    <file>./SQL/SQLite/1/setup_070_coreinfo.sql</file>
-    <file>./SQL/SQLite/1/setup_080_version.sql</file>
-    <file>./SQL/SQLite/1/update_username.sql</file>
-    <file>./SQL/SQLite/1/update_userpassword.sql</file>
     <file>./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_010_create_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_020_update_schemaversion.sql</file>
     <file>./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_010_create_coreinfo.sql</file>
     <file>./SQL/SQLite/1/upgrade_020_update_schemaversion.sql</file>
+    <file>./SQL/SQLite/2/delete_backlog_by_uid.sql</file>
+    <file>./SQL/SQLite/2/delete_buffers_by_uid.sql</file>
+    <file>./SQL/SQLite/2/delete_networks_by_uid.sql</file>
+    <file>./SQL/SQLite/2/delete_quasseluser.sql</file>
+    <file>./SQL/SQLite/2/insert_buffer.sql</file>
+    <file>./SQL/SQLite/2/insert_message.sql</file>
+    <file>./SQL/SQLite/2/insert_network.sql</file>
+    <file>./SQL/SQLite/2/insert_quasseluser.sql</file>
+    <file>./SQL/SQLite/2/insert_sender.sql</file>
+    <file>./SQL/SQLite/2/select_authuser.sql</file>
+    <file>./SQL/SQLite/2/select_bufferByName.sql</file>
+    <file>./SQL/SQLite/2/select_buffers.sql</file>
+    <file>./SQL/SQLite/2/select_lastMessage.sql</file>
+    <file>./SQL/SQLite/2/select_messageRange.sql</file>
+    <file>./SQL/SQLite/2/select_messages.sql</file>
+    <file>./SQL/SQLite/2/select_messagesOffset.sql</file>
+    <file>./SQL/SQLite/2/select_messagesSince.sql</file>
+    <file>./SQL/SQLite/2/select_messagesSinceOffset.sql</file>
+    <file>./SQL/SQLite/2/select_userid.sql</file>
+    <file>./SQL/SQLite/2/setup_000_quasseluser.sql</file>
+    <file>./SQL/SQLite/2/setup_010_sender.sql</file>
+    <file>./SQL/SQLite/2/setup_020_network.sql</file>
+    <file>./SQL/SQLite/2/setup_040_buffer.sql</file>
+    <file>./SQL/SQLite/2/setup_050_buffer_idx.sql</file>
+    <file>./SQL/SQLite/2/setup_060_backlog.sql</file>
+    <file>./SQL/SQLite/2/setup_070_coreinfo.sql</file>
+    <file>./SQL/SQLite/2/setup_080_version.sql</file>
+    <file>./SQL/SQLite/2/update_username.sql</file>
+    <file>./SQL/SQLite/2/update_userpassword.sql</file>
+    <file>./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql</file>
+    <file>./SQL/SQLite/2/upgrade_010_update_schemaversion.sql</file>
 </qresource>
 </RCC>
 </qresource>
 </RCC>
index 48f2df8..29fb9eb 100644 (file)
 #include "sqlitestorage.h"
 
 #include <QCryptographicHash>
 #include "sqlitestorage.h"
 
 #include <QCryptographicHash>
-
 #include <QtSql>
 
 #include <QtSql>
 
+#include "network.h"
+
 SqliteStorage::SqliteStorage(QObject *parent)
   : AbstractSqlStorage(parent)
 {
 SqliteStorage::SqliteStorage(QObject *parent)
   : AbstractSqlStorage(parent)
 {
@@ -138,29 +139,19 @@ void SqliteStorage::delUser(UserId user) {
   emit userRemoved(user);
 }
 
   emit userRemoved(user);
 }
 
-void SqliteStorage::createBuffer(UserId user, const QString &network, const QString &buffer) {
-  QSqlQuery *createBufferQuery = cachedQuery("insert_buffer");
-  createBufferQuery->bindValue(":userid", user.toInt());
-  createBufferQuery->bindValue(":userid2", user.toInt());  // Qt can't handle same placeholder twice (maybe sqlites fault)
-  createBufferQuery->bindValue(":networkname", network);
-  createBufferQuery->bindValue(":buffername", buffer);
-  createBufferQuery->exec();
-
-  if(createBufferQuery->lastError().isValid()) {
-    if(createBufferQuery->lastError().number() == 19) { // Null Constraint violation
-      QSqlQuery *createNetworkQuery = cachedQuery("insert_network");
-      createNetworkQuery->bindValue(":userid", user.toInt());
-      createNetworkQuery->bindValue(":networkname", network);
-      createNetworkQuery->exec();
-      Q_ASSERT(watchQuery(createNetworkQuery));
-      createBufferQuery->exec();
-      Q_ASSERT(watchQuery(createBufferQuery));
-    } else {
-      // do panic!
-      qDebug() << "failed to create Buffer: ErrNo:" << createBufferQuery->lastError().number() << "ErrMsg:" << createBufferQuery->lastError().text();
-      Q_ASSERT(false);
-    }
+NetworkId SqliteStorage::createNetworkId(UserId user, const NetworkInfo &info) {
+  NetworkId networkId;
+  QSqlQuery query(logDb());
+  query.prepare(queryString("insert_network"));
+  query.bindValue(":userid", user.toInt());
+  query.bindValue(":networkname", info.networkName);
+  query.exec();
+  
+  networkId = getNetworkId(user, info.networkName);
+  if(!networkId.isValid()) {
+    watchQuery(&query);
   }
   }
+  return networkId;
 }
 
 NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
 }
 
 NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
@@ -173,43 +164,46 @@ NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) {
   
   if(query.first())
     return query.value(0).toInt();
   
   if(query.first())
     return query.value(0).toInt();
-  else {
-    createBuffer(user, network, "");
-    query.exec();
-    if(query.first())
-      return query.value(0).toInt();
-    else {
-      qWarning() << "NETWORK NOT FOUND:" << network << "for User:" << user;
-      return 0;
-    }
-  }
+  else
+    return NetworkId();
+}
+
+void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, const QString &buffer) {
+  QSqlQuery *query = cachedQuery("insert_buffer");
+  query->bindValue(":userid", user.toInt());
+  query->bindValue(":networkid", networkId.toInt());
+  query->bindValue(":buffername", buffer);
+  query->exec();
+
+  watchQuery(query);
 }
 
 }
 
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const QString &network, const QString &buffer) {
-  BufferInfo bufferid;
-  // TODO: get rid of this hackaround
-  NetworkId networkId = getNetworkId(user, network);
-
-  QSqlQuery *getBufferInfoQuery = cachedQuery("select_bufferByName");
-  getBufferInfoQuery->bindValue(":networkid", networkId.toInt());
-  getBufferInfoQuery->bindValue(":userid", user.toInt());
-  getBufferInfoQuery->bindValue(":buffername", buffer);
-  getBufferInfoQuery->exec();
-
-  if(!getBufferInfoQuery->first()) {
-    createBuffer(user, network, buffer);
-    getBufferInfoQuery->exec();
-    if(getBufferInfoQuery->first()) {
-      bufferid = BufferInfo(getBufferInfoQuery->value(0).toInt(), networkId, 0, network, buffer);
-      emit bufferInfoUpdated(user, bufferid);
+BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
+  QSqlQuery *query = cachedQuery("select_bufferByName");
+  query->bindValue(":networkid", networkId.toInt());
+  query->bindValue(":userid", user.toInt());
+  query->bindValue(":buffername", buffer);
+  query->exec();
+
+  if(!query->first()) {
+    createBuffer(user, networkId, buffer);
+    query->exec();
+    if(!query->first()) {
+      watchQuery(query);
+      qWarning() << "unable to create BufferInfo for:" << user << networkId << buffer;
+      return BufferInfo();
     }
     }
-  } else {
-    bufferid = BufferInfo(getBufferInfoQuery->value(0).toInt(), networkId, 0, network, buffer);
   }
 
   }
 
-  Q_ASSERT(!getBufferInfoQuery->next());
+  BufferInfo bufferInfo = BufferInfo(query->value(0).toInt(), networkId, 0, buffer);
+  if(query->next()) {
+    qWarning() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
+    qWarning() << "         Query:" << query->lastQuery();
+    qWarning() << "  bound Values:" << query->boundValues();
+    Q_ASSERT(false);
+  }
 
 
-  return bufferid;
+  return bufferInfo;
 }
 
 QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
 }
 
 QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
@@ -226,7 +220,7 @@ QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
   query.exec();
   watchQuery(&query);
   while(query.next()) {
   query.exec();
   watchQuery(&query);
   while(query.next()) {
-    bufferlist << BufferInfo(query.value(0).toInt(), query.value(2).toInt(), 0, query.value(3).toString(), query.value(1).toString());
+    bufferlist << BufferInfo(query.value(0).toInt(), query.value(2).toInt(), 0, query.value(1).toString());
   }
   return bufferlist;
 }
   }
   return bufferlist;
 }
index 2038b2b..adaabe7 100644 (file)
@@ -51,10 +51,10 @@ public slots:
   virtual void delUser(UserId user);
   
   /* Network handling */
   virtual void delUser(UserId user);
   
   /* Network handling */
-  virtual NetworkId getNetworkId(UserId user, const QString &network);
+  virtual NetworkId createNetworkId(UserId user, const NetworkInfo &info);
   
   /* Buffer handling */
   
   /* Buffer handling */
-  virtual BufferInfo getBufferInfo(UserId user, const QString &network, const QString &buffer = "");
+  virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "");
   virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
   
   /* Message handling */
   virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
   
   /* Message handling */
@@ -71,7 +71,8 @@ protected:
   
 private:
   static QString backlogFile();
   
 private:
   static QString backlogFile();
-  void createBuffer(UserId user, const QString &network, const QString &buffer);
+  NetworkId getNetworkId(UserId user, const QString &network);
+  void createBuffer(UserId user, const NetworkId &networkId, const QString &buffer);
 };
 
 #endif
 };
 
 #endif
index 1af8d86..30c1c0b 100644 (file)
@@ -23,7 +23,9 @@
 
 #include <QtCore>
 
 
 #include <QtCore>
 
+#include "types.h"
 #include "message.h"
 #include "message.h"
+struct NetworkInfo;
 
 class Storage : public QObject {
   Q_OBJECT
 
 class Storage : public QObject {
   Q_OBJECT
@@ -96,10 +98,17 @@ class Storage : public QObject {
 
     /* Network handling */
 
 
     /* Network handling */
 
+    //! Create a new unique Network in the storage backend
+    /** \param user        The core user who owns this network
+     *  \param networkInfo The networkInfo holding the network definition
+     *  \return the NetworkId of the newly created Network. Possibly invalid.
+     */
+    virtual NetworkId createNetworkId(UserId user, const NetworkInfo &info) = 0;
+
     //! Get the unique NetworkId of the network for a user.
     //! Get the unique NetworkId of the network for a user.
-    /** \param user    The core user who owns this buffername
+    /** \param user    The core user who owns this network
      *  \param network The network name
      *  \param network The network name
-     *  \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
+     *  \return The NetworkId corresponding to the given network, or 0 if not found
      */
     virtual NetworkId getNetworkId(UserId user, const QString &network) = 0;
 
      */
     virtual NetworkId getNetworkId(UserId user, const QString &network) = 0;
 
@@ -111,7 +120,7 @@ class Storage : public QObject {
      *  \param buffer  The buffer name (if empty, the net's status buffer is returned)
      *  \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
      */
      *  \param buffer  The buffer name (if empty, the net's status buffer is returned)
      *  \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
      */
-    virtual BufferInfo getBufferInfo(UserId user, const QString &network, const QString &buffer = "") = 0;
+    virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "") = 0;
 
     //! Request a list of all buffers known to a user since a certain point in time.
     /** This method is used to get a list of all buffers we have stored a backlog from.
 
     //! Request a list of all buffers known to a user since a certain point in time.
     /** This method is used to get a list of all buffers we have stored a backlog from.
index 30de94b..66b7649 100644 (file)
@@ -177,7 +177,6 @@ void NetworksSettingsPage::setWidgetStates() {
   }
 
   // FIXME disable network creation/deletion because of the storage issue
   }
 
   // FIXME disable network creation/deletion because of the storage issue
-  ui.addNetwork->setEnabled(false);
   ui.deleteNetwork->setEnabled(false);
   ui.renameNetwork->setEnabled(false);
 }
   ui.deleteNetwork->setEnabled(false);
   ui.renameNetwork->setEnabled(false);
 }
index 782d166..51bdc10 100644 (file)
@@ -5,14 +5,14 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-02";
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-02";
-  quasselBuild = 436;
+  quasselBuild = 437;
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 435;
   clientVersionNeeded = quasselVersion;
 
   //! Minimum core build number the client needs
 
   //! Minimum client build number the core needs
   clientBuildNeeded = 435;
   clientVersionNeeded = quasselVersion;
 
   //! Minimum core build number the client needs
-  coreBuildNeeded = 435;
+  coreBuildNeeded = 437;
   coreVersionNeeded = quasselVersion;
 
 }
   coreVersionNeeded = quasselVersion;
 
 }