- 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;
+ uid = query.lastInsertId().toInt();
+ db.commit();
+ }
+ }
+ unlock();
+
+ if(uid.isValid())
+ emit userAdded(uid, user);
+ return uid;
+}
+
+bool SqliteStorage::updateUser(UserId user, const QString &password) {
+ QSqlDatabase db = logDb();
+ bool success = false;
+
+ db.transaction();
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_userpassword"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":password", cryptedPassword(password));
+ lockForWrite();
+ safeExec(query);
+ success = query.numRowsAffected() != 0;
+ db.commit();
+ }
+ unlock();
+ return success;
+}
+
+void SqliteStorage::renameUser(UserId user, const QString &newName) {
+ QSqlDatabase db = logDb();
+ db.transaction();
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("update_username"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":username", newName);
+ lockForWrite();
+ safeExec(query);
+ db.commit();
+ }
+ unlock();
+ emit userRenamed(user, newName);
+}
+
+UserId SqliteStorage::validateUser(const QString &user, const QString &password) {
+ UserId userId;
+
+ {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_authuser"));
+ query.bindValue(":username", user);
+ query.bindValue(":password", cryptedPassword(password));
+
+ lockForRead();
+ safeExec(query);
+
+ if(query.first()) {
+ userId = query.value(0).toInt();
+ }
+ }
+ unlock();
+
+ return userId;
+}
+
+UserId SqliteStorage::getUserId(const QString &username) {
+ UserId userId;
+
+ {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_userid"));
+ query.bindValue(":username", username);
+
+ lockForRead();
+ safeExec(query);
+
+ if(query.first()) {
+ userId = query.value(0).toInt();
+ }
+ }
+ unlock();
+
+ return userId;
+}
+
+UserId SqliteStorage::internalUser() {
+ UserId userId;
+
+ {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_internaluser"));
+ lockForRead();
+ safeExec(query);
+
+ if(query.first()) {
+ userId = query.value(0).toInt();
+ }
+ }
+ unlock();
+
+ return userId;
+}
+
+void SqliteStorage::delUser(UserId user) {
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ lockForWrite();
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("delete_backlog_by_uid"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+
+ query.prepare(queryString("delete_buffers_by_uid"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+
+ query.prepare(queryString("delete_networks_by_uid"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+
+ query.prepare(queryString("delete_quasseluser"));
+ query.bindValue(":userid", user.toInt());
+ safeExec(query);
+ // I hate the lack of foreign keys and on delete cascade... :(
+ db.commit();
+ }
+ unlock();
+
+ emit userRemoved(user);
+}
+
+void SqliteStorage::setUserSetting(UserId userId, const QString &settingName, const QVariant &data) {
+ QByteArray rawData;
+ QDataStream out(&rawData, QIODevice::WriteOnly);
+ out.setVersion(QDataStream::Qt_4_2);
+ out << data;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("insert_user_setting"));
+ query.bindValue(":userid", userId.toInt());
+ query.bindValue(":settingname", settingName);
+ query.bindValue(":settingvalue", rawData);
+ lockForWrite();
+ safeExec(query);
+
+ if(query.lastError().isValid()) {
+ QSqlQuery updateQuery(db);
+ updateQuery.prepare(queryString("update_user_setting"));
+ updateQuery.bindValue(":userid", userId.toInt());
+ updateQuery.bindValue(":settingname", settingName);
+ updateQuery.bindValue(":settingvalue", rawData);
+ safeExec(updateQuery);
+ }
+ db.commit();
+ }
+ unlock();
+}
+
+QVariant SqliteStorage::getUserSetting(UserId userId, const QString &settingName, const QVariant &defaultData) {
+ QVariant data = defaultData;
+ {
+ QSqlQuery query(logDb());
+ query.prepare(queryString("select_user_setting"));
+ query.bindValue(":userid", userId.toInt());
+ query.bindValue(":settingname", settingName);
+ lockForRead();
+ safeExec(query);
+
+ if(query.first()) {
+ QByteArray rawData = query.value(0).toByteArray();
+ QDataStream in(&rawData, QIODevice::ReadOnly);
+ in.setVersion(QDataStream::Qt_4_2);
+ in >> data;
+ }
+ }
+ unlock();
+ return data;
+}
+
+IdentityId SqliteStorage::createIdentity(UserId user, CoreIdentity &identity) {
+ IdentityId identityId;
+
+ QSqlDatabase db = logDb();
+ db.transaction();
+
+ {
+ QSqlQuery query(db);
+ query.prepare(queryString("insert_identity"));
+ query.bindValue(":userid", user.toInt());
+ query.bindValue(":identityname", identity.identityName());
+ query.bindValue(":realname", identity.realName());
+ query.bindValue(":awaynick", identity.awayNick());
+ query.bindValue(":awaynickenabled", identity.awayNickEnabled() ? 1 : 0);
+ query.bindValue(":awayreason", identity.awayReason());
+ query.bindValue(":awayreasonenabled", identity.awayReasonEnabled() ? 1 : 0);
+ query.bindValue(":autoawayenabled", identity.awayReasonEnabled() ? 1 : 0);
+ query.bindValue(":autoawaytime", identity.autoAwayTime());
+ query.bindValue(":autoawayreason", identity.autoAwayReason());
+ query.bindValue(":autoawayreasonenabled", identity.autoAwayReasonEnabled() ? 1 : 0);
+ query.bindValue(":detachawayenabled", identity.detachAwayEnabled() ? 1 : 0);
+ query.bindValue(":detachawayreason", identity.detachAwayReason());
+ query.bindValue(":detachawayreasonenabled", identity.detachAwayReasonEnabled() ? 1 : 0);
+ query.bindValue(":ident", identity.ident());
+ 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
+
+ lockForWrite();
+ safeExec(query);
+
+ identityId = query.lastInsertId().toInt();
+ if(!identityId.isValid()) {
+ watchQuery(query);
+ } else {
+ QSqlQuery deleteNickQuery(db);
+ deleteNickQuery.prepare(queryString("delete_nicks"));
+ deleteNickQuery.bindValue(":identityid", identityId.toInt());
+ safeExec(deleteNickQuery);
+
+ QSqlQuery insertNickQuery(db);
+ insertNickQuery.prepare(queryString("insert_nick"));
+ foreach(QString nick, identity.nicks()) {
+ insertNickQuery.bindValue(":identityid", identityId.toInt());
+ insertNickQuery.bindValue(":nick", nick);
+ safeExec(insertNickQuery);