/***************************************************************************
- * Copyright (C) 2005-07 by the Quassel IRC Team *
+ * Copyright (C) 2005-07 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include <QtSql>
-#include "network.h"
-
-#include "util.h"
#include "logger.h"
+#include "network.h"
+#include "quassel.h"
int SqliteStorage::_maxRetryCount = 150; // yes this is a large number... only other way to "handle" this is bailing out...
return AbstractSqlStorage::installedSchemaVersion();
}
+bool SqliteStorage::updateSchemaVersion(int newVersion) {
+ QSqlQuery query(logDb());
+ query.prepare("UPDATE coreinfo SET value = :version WHERE key = 'schemaversion'");
+ query.bindValue(":version", newVersion);
+ query.exec();
+
+ bool success = true;
+ if(query.lastError().isValid()) {
+ qCritical() << "SqliteStorage::updateSchemaVersion(int): Updating schema version failed!";
+ success = false;
+ }
+ return success;
+}
+
+bool SqliteStorage::setupSchemaVersion(int version) {
+ QSqlQuery query(logDb());
+ query.prepare("INSERT INTO coreinfo (key, value) VALUES ('schemaversion', :version)");
+ query.bindValue(":version", version);
+ query.exec();
+
+ bool success = true;
+ if(query.lastError().isValid()) {
+ qCritical() << "SqliteStorage::setupSchemaVersion(int): Updating schema version failed!";
+ success = false;
+ }
+ return success;
+}
+
UserId SqliteStorage::addUser(const QString &user, const QString &password) {
QSqlQuery query(logDb());
query.prepare(queryString("insert_quasseluser"));
query.bindValue(":kickreason", identity.kickReason());
query.bindValue(":partreason", identity.partReason());
query.bindValue(":quitreason", identity.quitReason());
+#ifdef HAVE_SSL
query.bindValue(":sslcert", identity.sslCert().toPem());
query.bindValue(":sslkey", identity.sslKey().toPem());
+#else
+ query.bindValue(":sslcert", QByteArray());
+ query.bindValue(":sslkey", QByteArray());
+#endif
+
safeExec(query);
identityId = query.lastInsertId().toInt();
- qDebug() << identityId << identity.nicks();
if(!identityId.isValid()) {
watchQuery(query);
} else {
query.bindValue(":kickreason", identity.kickReason());
query.bindValue(":partreason", identity.partReason());
query.bindValue(":quitreason", identity.quitReason());
+#ifdef HAVE_SSL
query.bindValue(":sslcert", identity.sslCert().toPem());
query.bindValue(":sslkey", identity.sslKey().toPem());
+#else
+ query.bindValue(":sslcert", QByteArray());
+ query.bindValue(":sslkey", QByteArray());
+#endif
query.bindValue(":identityid", identity.id().toInt());
safeExec(query);
+ watchQuery(query);
QSqlQuery deleteNickQuery(logDb());
deleteNickQuery.prepare(queryString("delete_nicks"));
deleteNickQuery.bindValue(":identityid", identity.id().toInt());
safeExec(deleteNickQuery);
+ watchQuery(deleteNickQuery);
QSqlQuery insertNickQuery(logDb());
insertNickQuery.prepare(queryString("insert_nick"));
insertNickQuery.bindValue(":identityid", identity.id().toInt());
insertNickQuery.bindValue(":nick", nick);
safeExec(insertNickQuery);
+ watchQuery(insertNickQuery);
}
return true;
identity.setKickReason(query.value(15).toString());
identity.setPartReason(query.value(16).toString());
identity.setQuitReason(query.value(17).toString());
+#ifdef HAVE_SSL
identity.setSslCert(query.value(18).toByteArray());
identity.setSslKey(query.value(19).toByteArray());
+#endif
nickQuery.bindValue(":identityid", identity.id().toInt());
QList<QString> nicks;
QSqlQuery insertServersQuery(logDb());
insertServersQuery.prepare(queryString("insert_server"));
foreach(Network::Server server, info.serverList) {
+ insertServersQuery.bindValue(":userid", user.toInt());
+ insertServersQuery.bindValue(":networkid", info.networkId.toInt());
insertServersQuery.bindValue(":hostname", server.host);
insertServersQuery.bindValue(":port", server.port);
insertServersQuery.bindValue(":password", server.password);
insertServersQuery.bindValue(":ssl", server.useSsl ? 1 : 0);
- insertServersQuery.bindValue(":userid", user.toInt());
- insertServersQuery.bindValue(":networkid", info.networkId.toInt());
+ insertServersQuery.bindValue(":sslversion", server.sslVersion);
+ insertServersQuery.bindValue(":useproxy", server.useProxy ? 1 : 0);
+ insertServersQuery.bindValue(":proxytype", server.proxyType);
+ insertServersQuery.bindValue(":proxyhost", server.proxyHost);
+ insertServersQuery.bindValue(":proxyport", server.proxyPort);
+ insertServersQuery.bindValue(":proxyuser", server.proxyUser);
+ insertServersQuery.bindValue(":proxypass", server.proxyPass);
safeExec(insertServersQuery);
if(!watchQuery(insertServersQuery))
server.port = serversQuery.value(1).toUInt();
server.password = serversQuery.value(2).toString();
server.useSsl = serversQuery.value(3).toInt() == 1 ? true : false;
+ server.sslVersion = serversQuery.value(4).toInt();
+ server.useProxy = serversQuery.value(5).toInt() == 1 ? true : false;
+ server.proxyType = serversQuery.value(6).toInt();
+ server.proxyHost = serversQuery.value(7).toString();
+ server.proxyPort = serversQuery.value(8).toUInt();
+ server.proxyUser = serversQuery.value(9).toString();
+ server.proxyPass = serversQuery.value(10).toString();
servers << server;
}
net.serverList = servers;
watchQuery(query);
}
+QString SqliteStorage::awayMessage(UserId user, NetworkId networkId) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_network_awaymsg"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ safeExec(query);
+ watchQuery(query);
+ QString awayMsg;
+ if(query.first())
+ awayMsg = query.value(0).toString();
+ return awayMsg;
+}
+
+void SqliteStorage::setAwayMessage(UserId user, NetworkId networkId, const QString &awayMsg) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("update_network_set_awaymsg"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ query.bindValue(":awaymsg", awayMsg);
+ safeExec(query);
+ watchQuery(query);
+}
+
+QString SqliteStorage::userModes(UserId user, NetworkId networkId) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_network_usermode"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ safeExec(query);
+ watchQuery(query);
+ QString modes;
+ if(query.first())
+ modes = query.value(0).toString();
+ return modes;
+}
+
+void SqliteStorage::setUserModes(UserId user, NetworkId networkId, const QString &userModes) {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("update_network_set_usermode"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":networkid", networkId.toInt());
+ query.bindValue(":usermode", userModes);
+ safeExec(query);
+ watchQuery(query);
+}
void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
QSqlQuery query(logDb());
watchQuery(query);
}
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
+BufferInfo SqliteStorage::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer, bool create) {
QSqlQuery query(logDb());
query.prepare(queryString("select_bufferByName"));
query.bindValue(":networkid", networkId.toInt());
safeExec(query);
if(!query.first()) {
+ if(!create)
+ return BufferInfo();
+
createBuffer(user, networkId, type, buffer);
safeExec(query);
if(!query.first()) {
return true;
}
-BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) {
- // check if such a buffer exists...
- QSqlQuery existsQuery(logDb());
- existsQuery.prepare(queryString("select_bufferByName"));
- existsQuery.bindValue(":networkid", networkId.toInt());
- existsQuery.bindValue(":userid", user.toInt());
- existsQuery.bindValue(":buffercname", oldName.toLower());
- safeExec(existsQuery);
- if(!watchQuery(existsQuery))
+bool SqliteStorage::renameBuffer(const UserId &user, const BufferId &bufferId, const QString &newName) {
+ if(!isValidBuffer(user, bufferId))
return false;
- if(!existsQuery.first())
+ QSqlQuery query(logDb());
+ query.prepare(queryString("update_buffer_name"));
+ query.bindValue(":buffername", newName);
+ query.bindValue(":buffercname", newName.toLower());
+ query.bindValue(":bufferid", bufferId.toInt());
+ safeExec(query);
+ if(query.lastError().isValid()) {
+ // unexepcted error occured (19 == constraint violation)
+ if(query.lastError().number() != 19)
+ watchQuery(query);
return false;
+ }
- const int bufferid = existsQuery.value(0).toInt();
-
- Q_ASSERT(!existsQuery.next());
+ return true;
+}
- // ... and if the new name is still free.
- existsQuery.bindValue(":networkid", networkId.toInt());
- existsQuery.bindValue(":userid", user.toInt());
- existsQuery.bindValue(":buffercname", newName.toLower());
- safeExec(existsQuery);
- if(!watchQuery(existsQuery))
+bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &bufferId1, const BufferId &bufferId2) {
+ if(!isValidBuffer(user, bufferId1) || !isValidBuffer(user, bufferId2))
return false;
- if(existsQuery.first())
+ QSqlQuery query(logDb());
+ query.prepare(queryString("update_backlog_bufferid"));
+ query.bindValue(":oldbufferid", bufferId2.toInt());
+ query.bindValue(":newbufferid", bufferId1.toInt());
+ safeExec(query);
+ if(!watchQuery(query))
return false;
- QSqlQuery renameBufferQuery(logDb());
- renameBufferQuery.prepare(queryString("update_buffer_name"));
- renameBufferQuery.bindValue(":buffername", newName);
- renameBufferQuery.bindValue(":buffercname", newName.toLower());
- renameBufferQuery.bindValue(":bufferid", bufferid);
- safeExec(renameBufferQuery);
- if(watchQuery(existsQuery))
- return BufferId(bufferid);
- else
- return BufferId();
+ QSqlQuery delBufferQuery(logDb());
+ delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
+ delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
+ safeExec(delBufferQuery);
+ watchQuery(delBufferQuery);
+
+ return true;
}
void SqliteStorage::setBufferLastSeenMsg(UserId user, const BufferId &bufferId, const MsgId &msgId) {
return messagelist;
QSqlQuery query(logDb());
- if(last == -1) {
- query.prepare(queryString("select_messagesNew"));
+
+ if(last == -1 && first == -1) {
+ query.prepare(queryString("select_messagesNewestK"));
+ } else if(last == -1) {
+ query.prepare(queryString("select_messagesNewerThan"));
+ query.bindValue(":firstmsg", first.toInt());
} else {
query.prepare(queryString("select_messages"));
query.bindValue(":lastmsg", last.toInt());
+ query.bindValue(":firstmsg", first.toInt());
}
query.bindValue(":bufferid", bufferId.toInt());
- query.bindValue(":firstmsg", first.toInt());
query.bindValue(":limit", limit);
safeExec(query);
}
QString SqliteStorage::backlogFile() {
- return quasselDir().absolutePath() + "/quassel-storage.sqlite";
+ return Quassel::configDirPath() + "quassel-storage.sqlite";
}
bool SqliteStorage::safeExec(QSqlQuery &query, int retryCount) {