+ logMessageQuery = NULL;
+ addSenderQuery = NULL;
+ getLastMessageIdQuery = NULL;
+ requestMsgsQuery = NULL;
+ requestMsgsOffsetQuery = NULL;
+ requestMsgsSinceQuery = NULL;
+ requestMsgsSinceOffsetQuery = NULL;
+ requestMsgRangeQuery = NULL;
+ createNetworkQuery = NULL;
+ createBufferQuery = NULL;
+ getBufferInfoQuery = NULL;
+}
+
+SqliteStorage::~SqliteStorage() {
+ if (logMessageQuery) delete logMessageQuery;
+ if (addSenderQuery) delete addSenderQuery;
+ if (getLastMessageIdQuery) delete getLastMessageIdQuery;
+ if (requestMsgsQuery) delete requestMsgsQuery;
+ if (requestMsgsOffsetQuery) delete requestMsgsOffsetQuery;
+ if (requestMsgsSinceQuery) delete requestMsgsSinceQuery;
+ if (requestMsgsSinceOffsetQuery) delete requestMsgsSinceOffsetQuery;
+ if (requestMsgRangeQuery) delete requestMsgRangeQuery;
+ if (createNetworkQuery) delete createNetworkQuery;
+ if (createBufferQuery) delete createBufferQuery;
+ if (getBufferInfoQuery) delete getBufferInfoQuery;
+
+ logDb.close();
+}
+
+bool SqliteStorage::isAvailable() {
+ if(!QSqlDatabase::isDriverAvailable("QSQLITE")) return false;
+ return true;
+}
+
+QString SqliteStorage::displayName() {
+ return QString("SQlite");
+}
+
+bool SqliteStorage::setup(const QVariantMap &settings) {
+ bool ok;
+ // this extra scope is needed to be able to remove the database connection later
+ {
+ logDb = QSqlDatabase::addDatabase("QSQLITE", "quassel_setup");
+ logDb.setDatabaseName(SqliteStorage::backlogFile(true));
+ ok = logDb.open();
+
+ if (!ok) {
+ qWarning(tr("Could not open backlog database: %1").arg(logDb.lastError().text()).toAscii());
+ } else {
+ logDb.exec("CREATE TABLE quasseluser ("
+ "userid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "username TEXT UNIQUE NOT NULL,"
+ "password BLOB NOT NULL)");
+
+ logDb.exec("CREATE TABLE sender ("
+ "senderid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "sender TEXT UNIQUE NOT NULL)");
+
+ logDb.exec("CREATE TABLE network ("
+ "networkid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "userid INTEGER NOT NULL,"
+ "networkname TEXT NOT NULL,"
+ "UNIQUE (userid, networkname))");
+
+ logDb.exec("CREATE TABLE buffergroup ("
+ "groupid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "userid INTEGER NOT NULL,"
+ "displayname TEXT)");
+
+ logDb.exec("CREATE TABLE buffer ("
+ "bufferid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "userid INTEGER NOT NULL,"
+ "groupid INTEGER,"
+ "networkid INTEGER NOT NULL,"
+ "buffername TEXT NOT NULL)");
+
+ logDb.exec("CREATE UNIQUE INDEX buffer_idx "
+ "ON buffer(userid, networkid, buffername)");
+
+ logDb.exec("CREATE TABLE backlog ("
+ "messageid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "time INTEGER NOT NULL,"
+ "bufferid INTEGER NOT NULL,"
+ "type INTEGER NOT NULL,"
+ "flags INTEGER NOT NULL,"
+ "senderid INTEGER NOT NULL,"
+ "message TEXT)");
+
+ logDb.exec("CREATE TABLE coreinfo ("
+ "updateid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
+ "version INTEGER NOT NULL)");
+
+ logDb.exec("INSERT INTO coreinfo (version) VALUES (0)");
+
+ // something fucked up -> no logging possible
+ // FIXME logDb.lastError is reset whenever exec is called
+ if(logDb.lastError().isValid()) {
+ qWarning(tr("Could not create backlog table: %1").arg(logDb.lastError().text()).toAscii());
+ qWarning(tr("Disabling logging...").toAscii());
+ Q_ASSERT(false); // quassel does require logging
+ ok = false;
+ }
+
+ logDb.close();
+ }
+ }
+
+ QSqlDatabase::removeDatabase("quassel_setup");
+ return ok;
+}
+
+bool SqliteStorage::init(const QVariantMap &settings) {
+ bool ok;
+ // i need the extra scope to be able to remove the database connection
+ {
+ logDb = QSqlDatabase::database("quassel_connection", false);
+ if (!logDb.isValid()) {
+ logDb = QSqlDatabase::addDatabase("QSQLITE", "quassel_connection");
+ }
+ logDb.setDatabaseName(SqliteStorage::backlogFile());
+ ok = logDb.open();
+ if (!ok) {
+ qWarning(tr("Could not open backlog database: %1").arg(logDb.lastError().text()).toAscii());
+ }
+ }
+
+ if (!ok) {
+ //QSqlDatabase::removeDatabase("quassel_connection");
+ return false;