From 23ebdc0a422294764ff3be3f8d7e56cc2b323185 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sat, 2 Feb 2008 16:26:14 +0000 Subject: [PATCH] - Fixed the inconsitency bug lately introduced. Adding networks is now 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! --- src/client/client.cpp | 3 +- src/common/bufferinfo.cpp | 23 ++-- src/common/bufferinfo.h | 4 +- src/common/message.cpp | 1 - src/common/types.h | 1 + src/core/SQL/SQLite/1/insert_buffer.sql | 2 - src/core/SQL/SQLite/1/select_messageRange.sql | 7 -- .../SQLite/{1 => 2}/delete_backlog_by_uid.sql | 0 .../SQLite/{1 => 2}/delete_buffers_by_uid.sql | 0 .../{1 => 2}/delete_networks_by_uid.sql | 0 .../SQLite/{1 => 2}/delete_quasseluser.sql | 0 src/core/SQL/SQLite/2/insert_buffer.sql | 2 + .../SQL/SQLite/{1 => 2}/insert_message.sql | 0 .../SQL/SQLite/{1 => 2}/insert_network.sql | 0 .../SQLite/{1 => 2}/insert_quasseluser.sql | 0 .../SQL/SQLite/{1 => 2}/insert_sender.sql | 0 .../SQL/SQLite/{1 => 2}/select_authuser.sql | 0 .../SQLite/{1 => 2}/select_bufferByName.sql | 0 .../SQL/SQLite/{1 => 2}/select_buffers.sql | 2 +- .../SQLite/{1 => 2}/select_lastMessage.sql | 0 src/core/SQL/SQLite/2/select_messageRange.sql | 6 + .../SQL/SQLite/{1 => 2}/select_messages.sql | 3 +- .../SQLite/{1 => 2}/select_messagesOffset.sql | 0 .../SQLite/{1 => 2}/select_messagesSince.sql | 3 +- .../{1 => 2}/select_messagesSinceOffset.sql | 0 .../SQL/SQLite/{1 => 2}/select_userid.sql | 0 .../SQLite/{1 => 2}/setup_000_quasseluser.sql | 0 .../SQL/SQLite/{1 => 2}/setup_010_sender.sql | 0 .../SQL/SQLite/{1 => 2}/setup_020_network.sql | 0 .../SQL/SQLite/{1 => 2}/setup_040_buffer.sql | 0 .../SQLite/{1 => 2}/setup_050_buffer_idx.sql | 0 .../SQL/SQLite/{1 => 2}/setup_060_backlog.sql | 0 .../SQLite/{1 => 2}/setup_070_coreinfo.sql | 0 .../SQL/SQLite/{1 => 2}/setup_080_version.sql | 0 .../SQL/SQLite/{1 => 2}/update_username.sql | 0 .../SQLite/{1 => 2}/update_userpassword.sql | 0 .../SQLite/2/upgrade_000_drop_buffergroup.sql | 1 + .../2/upgrade_010_update_schemaversion.sql | 3 + src/core/abstractsqlstorage.cpp | 15 ++- src/core/core.cpp | 14 ++- src/core/core.h | 18 ++- src/core/coresession.cpp | 48 ++++---- src/core/coresession.h | 2 +- src/core/sql.qrc | 60 +++++----- src/core/sqlitestorage.cpp | 104 +++++++++--------- src/core/sqlitestorage.h | 7 +- src/core/storage.h | 15 ++- .../settingspages/networkssettingspage.cpp | 1 - version.inc | 4 +- 49 files changed, 187 insertions(+), 162 deletions(-) delete mode 100644 src/core/SQL/SQLite/1/insert_buffer.sql delete mode 100644 src/core/SQL/SQLite/1/select_messageRange.sql rename src/core/SQL/SQLite/{1 => 2}/delete_backlog_by_uid.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/delete_buffers_by_uid.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/delete_networks_by_uid.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/delete_quasseluser.sql (100%) create mode 100644 src/core/SQL/SQLite/2/insert_buffer.sql rename src/core/SQL/SQLite/{1 => 2}/insert_message.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/insert_network.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/insert_quasseluser.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/insert_sender.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/select_authuser.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/select_bufferByName.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/select_buffers.sql (68%) rename src/core/SQL/SQLite/{1 => 2}/select_lastMessage.sql (100%) create mode 100644 src/core/SQL/SQLite/2/select_messageRange.sql rename src/core/SQL/SQLite/{1 => 2}/select_messages.sql (57%) rename src/core/SQL/SQLite/{1 => 2}/select_messagesOffset.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/select_messagesSince.sql (53%) rename src/core/SQL/SQLite/{1 => 2}/select_messagesSinceOffset.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/select_userid.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_000_quasseluser.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_010_sender.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_020_network.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_040_buffer.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_050_buffer_idx.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_060_backlog.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_070_coreinfo.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/setup_080_version.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/update_username.sql (100%) rename src/core/SQL/SQLite/{1 => 2}/update_userpassword.sql (100%) create mode 100644 src/core/SQL/SQLite/2/upgrade_000_drop_buffergroup.sql create mode 100644 src/core/SQL/SQLite/2/upgrade_010_update_schemaversion.sql diff --git a/src/client/client.cpp b/src/client/client.cpp index 9e3fc9a2..e79ae465 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -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) { - 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); } diff --git a/src/common/bufferinfo.cpp b/src/common/bufferinfo.cpp index e36defcf..8d45a47d 100644 --- a/src/common/bufferinfo.cpp +++ b/src/common/bufferinfo.cpp @@ -31,16 +31,16 @@ BufferInfo::BufferInfo() : _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), - _networkName(net), - _bufferName(buf) { + _bufferName(buf) +{ } QString BufferInfo::buffer() const { @@ -51,22 +51,19 @@ QString BufferInfo::buffer() const { } 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) { - 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) { - 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; } diff --git a/src/common/bufferinfo.h b/src/common/bufferinfo.h index 5e2b5f24..f0b92032 100644 --- a/src/common/bufferinfo.h +++ b/src/common/bufferinfo.h @@ -29,12 +29,11 @@ class QDataStream; 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 QString network() const { return _networkName; } QString buffer() const; void setGroupId(uint gid) { _gid = gid; } @@ -45,7 +44,6 @@ private: BufferId _id; NetworkId _netid; uint _gid; - QString _networkName; // WILL BE REMOVED QString _bufferName; friend uint qHash(const BufferInfo &); diff --git a/src/common/message.cpp b/src/common/message.cpp index e51cc6b1..d49e6cbf 100644 --- a/src/common/message.cpp +++ b/src/common/message.cpp @@ -115,7 +115,6 @@ void Message::format() { 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")); diff --git a/src/common/types.h b/src/common/types.h index 64bfbbc7..551bd13a 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -32,6 +32,7 @@ class SignedId { 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; } diff --git a/src/core/SQL/SQLite/1/insert_buffer.sql b/src/core/SQL/SQLite/1/insert_buffer.sql deleted file mode 100644 index 84ac02ab..00000000 --- a/src/core/SQL/SQLite/1/insert_buffer.sql +++ /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 index 55dd0730..00000000 --- a/src/core/SQL/SQLite/1/select_messageRange.sql +++ /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/1/delete_backlog_by_uid.sql b/src/core/SQL/SQLite/2/delete_backlog_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/1/delete_backlog_by_uid.sql rename to src/core/SQL/SQLite/2/delete_backlog_by_uid.sql diff --git a/src/core/SQL/SQLite/1/delete_buffers_by_uid.sql b/src/core/SQL/SQLite/2/delete_buffers_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/1/delete_buffers_by_uid.sql rename to src/core/SQL/SQLite/2/delete_buffers_by_uid.sql diff --git a/src/core/SQL/SQLite/1/delete_networks_by_uid.sql b/src/core/SQL/SQLite/2/delete_networks_by_uid.sql similarity index 100% rename from src/core/SQL/SQLite/1/delete_networks_by_uid.sql rename to src/core/SQL/SQLite/2/delete_networks_by_uid.sql diff --git a/src/core/SQL/SQLite/1/delete_quasseluser.sql b/src/core/SQL/SQLite/2/delete_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/1/delete_quasseluser.sql rename to src/core/SQL/SQLite/2/delete_quasseluser.sql diff --git a/src/core/SQL/SQLite/2/insert_buffer.sql b/src/core/SQL/SQLite/2/insert_buffer.sql new file mode 100644 index 00000000..da5aa808 --- /dev/null +++ b/src/core/SQL/SQLite/2/insert_buffer.sql @@ -0,0 +1,2 @@ +INSERT INTO buffer (userid, networkid, buffername) +VALUES (:userid, :networkid, :buffername) diff --git a/src/core/SQL/SQLite/1/insert_message.sql b/src/core/SQL/SQLite/2/insert_message.sql similarity index 100% rename from src/core/SQL/SQLite/1/insert_message.sql rename to src/core/SQL/SQLite/2/insert_message.sql diff --git a/src/core/SQL/SQLite/1/insert_network.sql b/src/core/SQL/SQLite/2/insert_network.sql similarity index 100% rename from src/core/SQL/SQLite/1/insert_network.sql rename to src/core/SQL/SQLite/2/insert_network.sql diff --git a/src/core/SQL/SQLite/1/insert_quasseluser.sql b/src/core/SQL/SQLite/2/insert_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/1/insert_quasseluser.sql rename to src/core/SQL/SQLite/2/insert_quasseluser.sql diff --git a/src/core/SQL/SQLite/1/insert_sender.sql b/src/core/SQL/SQLite/2/insert_sender.sql similarity index 100% rename from src/core/SQL/SQLite/1/insert_sender.sql rename to src/core/SQL/SQLite/2/insert_sender.sql diff --git a/src/core/SQL/SQLite/1/select_authuser.sql b/src/core/SQL/SQLite/2/select_authuser.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_authuser.sql rename to src/core/SQL/SQLite/2/select_authuser.sql diff --git a/src/core/SQL/SQLite/1/select_bufferByName.sql b/src/core/SQL/SQLite/2/select_bufferByName.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_bufferByName.sql rename to src/core/SQL/SQLite/2/select_bufferByName.sql diff --git a/src/core/SQL/SQLite/1/select_buffers.sql b/src/core/SQL/SQLite/2/select_buffers.sql similarity index 68% rename from src/core/SQL/SQLite/1/select_buffers.sql rename to src/core/SQL/SQLite/2/select_buffers.sql index 11e21c54..0e096e67 100644 --- a/src/core/SQL/SQLite/1/select_buffers.sql +++ b/src/core/SQL/SQLite/2/select_buffers.sql @@ -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 diff --git a/src/core/SQL/SQLite/1/select_lastMessage.sql b/src/core/SQL/SQLite/2/select_lastMessage.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_lastMessage.sql rename to src/core/SQL/SQLite/2/select_lastMessage.sql diff --git a/src/core/SQL/SQLite/2/select_messageRange.sql b/src/core/SQL/SQLite/2/select_messageRange.sql new file mode 100644 index 00000000..0b63e07d --- /dev/null +++ b/src/core/SQL/SQLite/2/select_messageRange.sql @@ -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 diff --git a/src/core/SQL/SQLite/1/select_messages.sql b/src/core/SQL/SQLite/2/select_messages.sql similarity index 57% rename from src/core/SQL/SQLite/1/select_messages.sql rename to src/core/SQL/SQLite/2/select_messages.sql index b9596e73..4514d944 100644 --- a/src/core/SQL/SQLite/1/select_messages.sql +++ b/src/core/SQL/SQLite/2/select_messages.sql @@ -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 -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 diff --git a/src/core/SQL/SQLite/1/select_messagesOffset.sql b/src/core/SQL/SQLite/2/select_messagesOffset.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_messagesOffset.sql rename to src/core/SQL/SQLite/2/select_messagesOffset.sql diff --git a/src/core/SQL/SQLite/1/select_messagesSince.sql b/src/core/SQL/SQLite/2/select_messagesSince.sql similarity index 53% rename from src/core/SQL/SQLite/1/select_messagesSince.sql rename to src/core/SQL/SQLite/2/select_messagesSince.sql index 9776b58a..05a7ccc9 100644 --- a/src/core/SQL/SQLite/1/select_messagesSince.sql +++ b/src/core/SQL/SQLite/2/select_messagesSince.sql @@ -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 -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 diff --git a/src/core/SQL/SQLite/1/select_messagesSinceOffset.sql b/src/core/SQL/SQLite/2/select_messagesSinceOffset.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_messagesSinceOffset.sql rename to src/core/SQL/SQLite/2/select_messagesSinceOffset.sql diff --git a/src/core/SQL/SQLite/1/select_userid.sql b/src/core/SQL/SQLite/2/select_userid.sql similarity index 100% rename from src/core/SQL/SQLite/1/select_userid.sql rename to src/core/SQL/SQLite/2/select_userid.sql diff --git a/src/core/SQL/SQLite/1/setup_000_quasseluser.sql b/src/core/SQL/SQLite/2/setup_000_quasseluser.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_000_quasseluser.sql rename to src/core/SQL/SQLite/2/setup_000_quasseluser.sql diff --git a/src/core/SQL/SQLite/1/setup_010_sender.sql b/src/core/SQL/SQLite/2/setup_010_sender.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_010_sender.sql rename to src/core/SQL/SQLite/2/setup_010_sender.sql diff --git a/src/core/SQL/SQLite/1/setup_020_network.sql b/src/core/SQL/SQLite/2/setup_020_network.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_020_network.sql rename to src/core/SQL/SQLite/2/setup_020_network.sql diff --git a/src/core/SQL/SQLite/1/setup_040_buffer.sql b/src/core/SQL/SQLite/2/setup_040_buffer.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_040_buffer.sql rename to src/core/SQL/SQLite/2/setup_040_buffer.sql diff --git a/src/core/SQL/SQLite/1/setup_050_buffer_idx.sql b/src/core/SQL/SQLite/2/setup_050_buffer_idx.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_050_buffer_idx.sql rename to src/core/SQL/SQLite/2/setup_050_buffer_idx.sql diff --git a/src/core/SQL/SQLite/1/setup_060_backlog.sql b/src/core/SQL/SQLite/2/setup_060_backlog.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_060_backlog.sql rename to src/core/SQL/SQLite/2/setup_060_backlog.sql diff --git a/src/core/SQL/SQLite/1/setup_070_coreinfo.sql b/src/core/SQL/SQLite/2/setup_070_coreinfo.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_070_coreinfo.sql rename to src/core/SQL/SQLite/2/setup_070_coreinfo.sql diff --git a/src/core/SQL/SQLite/1/setup_080_version.sql b/src/core/SQL/SQLite/2/setup_080_version.sql similarity index 100% rename from src/core/SQL/SQLite/1/setup_080_version.sql rename to src/core/SQL/SQLite/2/setup_080_version.sql diff --git a/src/core/SQL/SQLite/1/update_username.sql b/src/core/SQL/SQLite/2/update_username.sql similarity index 100% rename from src/core/SQL/SQLite/1/update_username.sql rename to src/core/SQL/SQLite/2/update_username.sql diff --git a/src/core/SQL/SQLite/1/update_userpassword.sql b/src/core/SQL/SQLite/2/update_userpassword.sql similarity index 100% rename from src/core/SQL/SQLite/1/update_userpassword.sql rename to src/core/SQL/SQLite/2/update_userpassword.sql 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 index 00000000..82fe07fa --- /dev/null +++ b/src/core/SQL/SQLite/2/upgrade_000_drop_buffergroup.sql @@ -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 index 00000000..eb15178b --- /dev/null +++ b/src/core/SQL/SQLite/2/upgrade_010_update_schemaversion.sql @@ -0,0 +1,3 @@ +UPDATE coreinfo +SET value='2' +WHERE key = 'schemaversion' diff --git a/src/core/abstractsqlstorage.cpp b/src/core/abstractsqlstorage.cpp index 47442705..bc18cafb 100644 --- a/src/core/abstractsqlstorage.cpp +++ b/src/core/abstractsqlstorage.cpp @@ -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)) { - qDebug() << queryString(fileInfo.baseName()); 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!"; - 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; } diff --git a/src/core/core.cpp b/src/core/core.cpp index e222a137..2024387e 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -28,6 +28,7 @@ #include "coresettings.h" #include "signalproxy.h" #include "sqlitestorage.h" +#include "network.h" Core *Core::instanceptr = 0; QMutex Core::mutex; @@ -127,15 +128,24 @@ void Core::saveState() { } /*** 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); } -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); - return instance()->storage->getBufferInfo(user, network, buffer); + return instance()->storage->getBufferInfo(user, networkId, buffer); } MsgId Core::storeMessage(const Message &message) { diff --git a/src/core/core.h b/src/core/core.h index 67f6dec8..51237ec7 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -37,6 +37,7 @@ class CoreSession; class SessionThread; class Storage; +struct NetworkInfo; class Core : public QObject { Q_OBJECT @@ -51,6 +52,15 @@ class Core : public QObject { /*** 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. * @@ -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. * - * \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 */ - 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. diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index cbc6110b..02cc6687 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -128,9 +128,10 @@ void CoreSession::loadSettings() { createIdentity(i); } + // FIXME switch to a pure DB storage foreach(NetworkId id, s.networkIds()) { NetworkInfo info = s.networkInfo(id); - createNetwork(info, true); + createNetwork(info); } // FIXME Migrate old settings if available... @@ -155,7 +156,7 @@ void CoreSession::loadSettings() { 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) { - Core::bufferInfo(user(), networkConnection(networkid)->networkName()); // create status buffer + Core::bufferInfo(user(), networkid); // create status buffer } 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) { - NetworkConnection *s = qobject_cast(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(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); @@ -417,17 +420,18 @@ void CoreSession::removeIdentity(IdentityId id) { /*** Network Handling ***/ -void CoreSession::createNetwork(const NetworkInfo &_info, bool useId) { - NetworkInfo info = _info; +void CoreSession::createNetwork(const NetworkInfo &info_) { + NetworkInfo info = info_; 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))); diff --git a/src/core/coresession.h b/src/core/coresession.h index 9726f4c1..208095c2 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -88,7 +88,7 @@ public slots: //! 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. diff --git a/src/core/sql.qrc b/src/core/sql.qrc index f4da999f..6498a91d 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -1,36 +1,38 @@ - ./SQL/SQLite/1/delete_backlog_by_uid.sql - ./SQL/SQLite/1/delete_buffers_by_uid.sql - ./SQL/SQLite/1/delete_networks_by_uid.sql - ./SQL/SQLite/1/delete_quasseluser.sql - ./SQL/SQLite/1/insert_buffer.sql - ./SQL/SQLite/1/insert_message.sql - ./SQL/SQLite/1/insert_network.sql - ./SQL/SQLite/1/insert_quasseluser.sql - ./SQL/SQLite/1/insert_sender.sql - ./SQL/SQLite/1/select_authuser.sql - ./SQL/SQLite/1/select_bufferByName.sql - ./SQL/SQLite/1/select_buffers.sql - ./SQL/SQLite/1/select_lastMessage.sql - ./SQL/SQLite/1/select_messageRange.sql - ./SQL/SQLite/1/select_messages.sql - ./SQL/SQLite/1/select_messagesOffset.sql - ./SQL/SQLite/1/select_messagesSince.sql - ./SQL/SQLite/1/select_messagesSinceOffset.sql - ./SQL/SQLite/1/select_userid.sql - ./SQL/SQLite/1/setup_000_quasseluser.sql - ./SQL/SQLite/1/setup_010_sender.sql - ./SQL/SQLite/1/setup_020_network.sql - ./SQL/SQLite/1/setup_040_buffer.sql - ./SQL/SQLite/1/setup_050_buffer_idx.sql - ./SQL/SQLite/1/setup_060_backlog.sql - ./SQL/SQLite/1/setup_070_coreinfo.sql - ./SQL/SQLite/1/setup_080_version.sql - ./SQL/SQLite/1/update_username.sql - ./SQL/SQLite/1/update_userpassword.sql ./SQL/SQLite/1/upgrade_000_drop_coreinfo.sql ./SQL/SQLite/1/upgrade_010_create_coreinfo.sql ./SQL/SQLite/1/upgrade_020_update_schemaversion.sql + ./SQL/SQLite/2/delete_backlog_by_uid.sql + ./SQL/SQLite/2/delete_buffers_by_uid.sql + ./SQL/SQLite/2/delete_networks_by_uid.sql + ./SQL/SQLite/2/delete_quasseluser.sql + ./SQL/SQLite/2/insert_buffer.sql + ./SQL/SQLite/2/insert_message.sql + ./SQL/SQLite/2/insert_network.sql + ./SQL/SQLite/2/insert_quasseluser.sql + ./SQL/SQLite/2/insert_sender.sql + ./SQL/SQLite/2/select_authuser.sql + ./SQL/SQLite/2/select_bufferByName.sql + ./SQL/SQLite/2/select_buffers.sql + ./SQL/SQLite/2/select_lastMessage.sql + ./SQL/SQLite/2/select_messageRange.sql + ./SQL/SQLite/2/select_messages.sql + ./SQL/SQLite/2/select_messagesOffset.sql + ./SQL/SQLite/2/select_messagesSince.sql + ./SQL/SQLite/2/select_messagesSinceOffset.sql + ./SQL/SQLite/2/select_userid.sql + ./SQL/SQLite/2/setup_000_quasseluser.sql + ./SQL/SQLite/2/setup_010_sender.sql + ./SQL/SQLite/2/setup_020_network.sql + ./SQL/SQLite/2/setup_040_buffer.sql + ./SQL/SQLite/2/setup_050_buffer_idx.sql + ./SQL/SQLite/2/setup_060_backlog.sql + ./SQL/SQLite/2/setup_070_coreinfo.sql + ./SQL/SQLite/2/setup_080_version.sql + ./SQL/SQLite/2/update_username.sql + ./SQL/SQLite/2/update_userpassword.sql + ./SQL/SQLite/2/upgrade_000_drop_buffergroup.sql + ./SQL/SQLite/2/upgrade_010_update_schemaversion.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 48f2df8b..29fb9eb0 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -21,9 +21,10 @@ #include "sqlitestorage.h" #include - #include +#include "network.h" + SqliteStorage::SqliteStorage(QObject *parent) : AbstractSqlStorage(parent) { @@ -138,29 +139,19 @@ void SqliteStorage::delUser(UserId 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) { @@ -173,43 +164,46 @@ NetworkId SqliteStorage::getNetworkId(UserId user, const QString &network) { 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 SqliteStorage::requestBuffers(UserId user, QDateTime since) { @@ -226,7 +220,7 @@ QList SqliteStorage::requestBuffers(UserId user, QDateTime since) { 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; } diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index 2038b2bc..adaabe7c 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -51,10 +51,10 @@ public slots: 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 */ - virtual BufferInfo getBufferInfo(UserId user, const QString &network, const QString &buffer = ""); + virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = ""); virtual QList requestBuffers(UserId user, QDateTime since = QDateTime()); /* Message handling */ @@ -71,7 +71,8 @@ protected: 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 diff --git a/src/core/storage.h b/src/core/storage.h index 1af8d86e..30c1c0bd 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -23,7 +23,9 @@ #include +#include "types.h" #include "message.h" +struct NetworkInfo; class Storage : public QObject { Q_OBJECT @@ -96,10 +98,17 @@ class Storage : public QObject { /* 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. - /** \param user The core user who owns this buffername + /** \param user The core user who owns this network * \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; @@ -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 */ - 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. diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 30de94b7..66b76492 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -177,7 +177,6 @@ void NetworksSettingsPage::setWidgetStates() { } // FIXME disable network creation/deletion because of the storage issue - ui.addNetwork->setEnabled(false); ui.deleteNetwork->setEnabled(false); ui.renameNetwork->setEnabled(false); } diff --git a/version.inc b/version.inc index 782d1662..51bdc10a 100644 --- a/version.inc +++ b/version.inc @@ -5,14 +5,14 @@ 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 - coreBuildNeeded = 435; + coreBuildNeeded = 437; coreVersionNeeded = quasselVersion; } -- 2.20.1