X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fpostgresqlstorage.cpp;h=3c15b2c08b216bd987f54e771543e2ff5e52589a;hp=6a7f788acdcc2518f511072cc7cb7b43d82078f3;hb=20f446a492d8e681156423f0dc3637db78c45bae;hpb=7fb88a023ef8e4658b39d22c2d88c0d8bd6709f8 diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index 6a7f788a..3c15b2c0 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -38,9 +38,9 @@ PostgreSqlStorage::~PostgreSqlStorage() } -AbstractSqlMigrationWriter *PostgreSqlStorage::createMigrationWriter() +std::unique_ptr PostgreSqlStorage::createMigrationWriter() { - PostgreSqlMigrationWriter *writer = new PostgreSqlMigrationWriter(); + auto writer = new PostgreSqlMigrationWriter(); QVariantMap properties; properties["Username"] = _userName; properties["Password"] = _password; @@ -48,51 +48,50 @@ AbstractSqlMigrationWriter *PostgreSqlStorage::createMigrationWriter() properties["Port"] = _port; properties["Database"] = _databaseName; writer->setConnectionProperties(properties); - return writer; + return std::unique_ptr{writer}; } bool PostgreSqlStorage::isAvailable() const { - qDebug() << QSqlDatabase::drivers(); - if (!QSqlDatabase::isDriverAvailable("QPSQL")) return false; + if (!QSqlDatabase::isDriverAvailable("QPSQL")) { + quWarning() << qPrintable(tr("PostgreSQL driver plugin not available for Qt. Installed drivers:")) + << qPrintable(QSqlDatabase::drivers().join(", ")); + return false; + } return true; } -QString PostgreSqlStorage::displayName() const +QString PostgreSqlStorage::backendId() const { return QString("PostgreSQL"); } -QString PostgreSqlStorage::description() const +QString PostgreSqlStorage::displayName() const { - // FIXME: proper description - return tr("PostgreSQL Turbo Bomber HD!"); + return backendId(); // Note: Pre-0.13 clients use the displayName property for backend idenfication } -QStringList PostgreSqlStorage::setupKeys() const +QString PostgreSqlStorage::description() const { - QStringList keys; - keys << "Username" - << "Password" - << "Hostname" - << "Port" - << "Database"; - return keys; + // FIXME: proper description + return tr("PostgreSQL Turbo Bomber HD!"); } -QVariantMap PostgreSqlStorage::setupDefaults() const +QVariantList PostgreSqlStorage::setupData() const { - QVariantMap map; - map["Username"] = QVariant(QString("quassel")); - map["Hostname"] = QVariant(QString("localhost")); - map["Port"] = QVariant(5432); - map["Database"] = QVariant(QString("quassel")); - return map; + QVariantList data; + data << "Username" << tr("Username") << QString("quassel") + << "Password" << tr("Password") << QString() + << "Hostname" << tr("Hostname") << QString("localhost") + << "Port" << tr("Port") << 5432 + << "Database" << tr("Database") << QString("quassel") + ; + return data; } @@ -1386,6 +1385,154 @@ QHash PostgreSqlStorage::bufferMarkerLineMsgIds(UserId user) return markerLineHash; } + +void PostgreSqlStorage::setBufferActivity(UserId user, BufferId bufferId, Message::Types bufferActivity) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("update_buffer_bufferactivity")); + + query.bindValue(":userid", user.toInt()); + query.bindValue(":bufferid", bufferId.toInt()); + query.bindValue(":bufferactivity", (int) bufferActivity); + safeExec(query); + watchQuery(query); +} + +QHash PostgreSqlStorage::bufferActivities(UserId user) +{ + QHash bufferActivityHash; + + QSqlDatabase db = logDb(); + if (!beginReadOnlyTransaction(db)) { + qWarning() << "PostgreSqlStorage::bufferActivities(): cannot start read only transaction!"; + qWarning() << " -" << qPrintable(db.lastError().text()); + return bufferActivityHash; + } + + QSqlQuery query(db); + query.prepare(queryString("select_buffer_bufferactivities")); + query.bindValue(":userid", user.toInt()); + safeExec(query); + if (!watchQuery(query)) { + db.rollback(); + return bufferActivityHash; + } + + while (query.next()) { + bufferActivityHash[query.value(0).toInt()] = Message::Types(query.value(1).toInt()); + } + + db.commit(); + return bufferActivityHash; +} + +Message::Types PostgreSqlStorage::bufferActivity(BufferId bufferId, MsgId lastSeenMsgId) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("select_buffer_bufferactivity")); + query.bindValue(":bufferid", bufferId.toInt()); + query.bindValue(":lastseenmsgid", lastSeenMsgId.toInt()); + safeExec(query); + watchQuery(query); + Message::Types result = Message::Types(0); + if (query.first()) + result = Message::Types(query.value(0).toInt()); + return result; +} + +QHash PostgreSqlStorage::bufferCiphers(UserId user, const NetworkId &networkId) +{ + QHash bufferCiphers; + + QSqlDatabase db = logDb(); + if (!beginReadOnlyTransaction(db)) { + qWarning() << "PostgreSqlStorage::persistentChannels(): cannot start read only transaction!"; + qWarning() << " -" << qPrintable(db.lastError().text()); + return bufferCiphers; + } + + QSqlQuery query(db); + query.prepare(queryString("select_buffer_ciphers")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkid", networkId.toInt()); + safeExec(query); + watchQuery(query); + + while (query.next()) { + bufferCiphers[query.value(0).toString()] = QByteArray::fromHex(query.value(1).toString().toUtf8()); + } + + db.commit(); + return bufferCiphers; +} + +void PostgreSqlStorage::setBufferCipher(UserId user, const NetworkId &networkId, const QString &bufferName, const QByteArray &cipher) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("update_buffer_cipher")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":networkid", networkId.toInt()); + query.bindValue(":buffercname", bufferName.toLower()); + query.bindValue(":cipher", QString(cipher.toHex())); + safeExec(query); + watchQuery(query); +} + + +void PostgreSqlStorage::setHighlightCount(UserId user, BufferId bufferId, int highlightcount) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("update_buffer_highlightcount")); + + query.bindValue(":userid", user.toInt()); + query.bindValue(":bufferid", bufferId.toInt()); + query.bindValue(":highlightcount", highlightcount); + safeExec(query); + watchQuery(query); +} + +QHash PostgreSqlStorage::highlightCounts(UserId user) +{ + QHash highlightCountHash; + + QSqlDatabase db = logDb(); + if (!beginReadOnlyTransaction(db)) { + qWarning() << "PostgreSqlStorage::highlightCounts(): cannot start read only transaction!"; + qWarning() << " -" << qPrintable(db.lastError().text()); + return highlightCountHash; + } + + QSqlQuery query(db); + query.prepare(queryString("select_buffer_highlightcounts")); + query.bindValue(":userid", user.toInt()); + safeExec(query); + if (!watchQuery(query)) { + db.rollback(); + return highlightCountHash; + } + + while (query.next()) { + highlightCountHash[query.value(0).toInt()] = query.value(1).toInt(); + } + + db.commit(); + return highlightCountHash; +} + +int PostgreSqlStorage::highlightCount(BufferId bufferId, MsgId lastSeenMsgId) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("select_buffer_highlightcount")); + query.bindValue(":bufferid", bufferId.toInt()); + query.bindValue(":lastseenmsgid", lastSeenMsgId.toInt()); + safeExec(query); + watchQuery(query); + int result = int(0); + if (query.first()) + result = query.value(0).toInt(); + return result; +} + bool PostgreSqlStorage::logMessage(Message &msg) { QSqlDatabase db = logDb(); @@ -1395,7 +1542,11 @@ bool PostgreSqlStorage::logMessage(Message &msg) return false; } - QSqlQuery getSenderIdQuery = executePreparedQuery("select_senderid", msg.sender(), db); + QVariantList senderParams; + senderParams << msg.sender() + << msg.realName() + << msg.avatarUrl(); + QSqlQuery getSenderIdQuery = executePreparedQuery("select_senderid", senderParams, db); int senderId; if (getSenderIdQuery.first()) { senderId = getSenderIdQuery.value(0).toInt(); @@ -1404,11 +1555,11 @@ bool PostgreSqlStorage::logMessage(Message &msg) // it's possible that the sender was already added by another thread // since the insert might fail we're setting a savepoint savePoint("sender_sp1", db); - QSqlQuery addSenderQuery = executePreparedQuery("insert_sender", msg.sender(), db); + QSqlQuery addSenderQuery = executePreparedQuery("insert_sender", senderParams, db); if (addSenderQuery.lastError().isValid()) { rollbackSavePoint("sender_sp1", db); - getSenderIdQuery = executePreparedQuery("select_senderid", msg.sender(), db); + getSenderIdQuery = executePreparedQuery("select_senderid", senderParams, db); watchQuery(getSenderIdQuery); getSenderIdQuery.first(); senderId = getSenderIdQuery.value(0).toInt(); @@ -1426,6 +1577,7 @@ bool PostgreSqlStorage::logMessage(Message &msg) << msg.type() << (int)msg.flags() << senderId + << msg.senderPrefixes() << msg.contents(); QSqlQuery logMessageQuery = executePreparedQuery("insert_message", params, db); @@ -1457,28 +1609,34 @@ bool PostgreSqlStorage::logMessages(MessageList &msgs) } QList senderIdList; - QHash senderIds; + QHash senderIds; QSqlQuery addSenderQuery; QSqlQuery selectSenderQuery;; for (int i = 0; i < msgs.count(); i++) { - const QString &sender = msgs.at(i).sender(); + auto &msg = msgs.at(i); + SenderData sender = { msg.sender(), msg.realName(), msg.avatarUrl() }; if (senderIds.contains(sender)) { senderIdList << senderIds[sender]; continue; } - selectSenderQuery = executePreparedQuery("select_senderid", sender, db); + QVariantList senderParams; + senderParams << sender.sender + << sender.realname + << sender.avatarurl; + + selectSenderQuery = executePreparedQuery("select_senderid", senderParams, db); if (selectSenderQuery.first()) { senderIdList << selectSenderQuery.value(0).toInt(); senderIds[sender] = selectSenderQuery.value(0).toInt(); } else { savePoint("sender_sp", db); - addSenderQuery = executePreparedQuery("insert_sender", sender, db); + addSenderQuery = executePreparedQuery("insert_sender", senderParams, db); if (addSenderQuery.lastError().isValid()) { // seems it was inserted meanwhile... by a different thread rollbackSavePoint("sender_sp", db); - selectSenderQuery = executePreparedQuery("select_senderid", sender, db); + selectSenderQuery = executePreparedQuery("select_senderid", senderParams, db); watchQuery(selectSenderQuery); selectSenderQuery.first(); senderIdList << selectSenderQuery.value(0).toInt(); @@ -1503,6 +1661,7 @@ bool PostgreSqlStorage::logMessages(MessageList &msgs) << msg.type() << (int)msg.flags() << senderIdList.at(i) + << msg.senderPrefixes() << msg.contents(); QSqlQuery logMessageQuery = executePreparedQuery("insert_message", params, db); if (!watchQuery(logMessageQuery)) { @@ -1581,8 +1740,11 @@ QList PostgreSqlStorage::requestMsgs(UserId user, BufferId bufferId, Ms Message msg(timestamp, bufferInfo, (Message::Type)query.value(2).toUInt(), - query.value(5).toString(), + query.value(8).toString(), query.value(4).toString(), + query.value(5).toString(), + query.value(6).toString(), + query.value(7).toString(), (Message::Flags)query.value(3).toUInt()); msg.setMsgId(query.value(0).toInt()); messagelist << msg; @@ -1628,13 +1790,16 @@ QList PostgreSqlStorage::requestAllMsgs(UserId user, MsgId first, MsgId QDateTime timestamp; for (int i = 0; i < limit && query.next(); i++) { - timestamp = query.value(1).toDateTime(); + timestamp = query.value(2).toDateTime(); timestamp.setTimeSpec(Qt::UTC); Message msg(timestamp, bufferInfoHash[query.value(1).toInt()], (Message::Type)query.value(3).toUInt(), - query.value(6).toString(), + query.value(9).toString(), query.value(5).toString(), + query.value(6).toString(), + query.value(7).toString(), + query.value(8).toString(), (Message::Flags)query.value(4).toUInt()); msg.setMsgId(query.value(0).toInt()); messagelist << msg; @@ -1645,6 +1810,36 @@ QList PostgreSqlStorage::requestAllMsgs(UserId user, MsgId first, MsgId } +QMap PostgreSqlStorage::getAllAuthUserNames() +{ + QMap authusernames; + QSqlQuery query(logDb()); + query.prepare(queryString("select_all_authusernames")); + safeExec(query); + watchQuery(query); + + while (query.next()) { + authusernames[query.value(0).toInt()] = query.value(1).toString(); + } + return authusernames; +} + + +QString PostgreSqlStorage::getAuthUserName(UserId user) +{ + QString authusername; + QSqlQuery query(logDb()); + query.prepare(queryString("select_authusername")); + query.bindValue(":userid", user.toInt()); + safeExec(query); + watchQuery(query); + + if (query.first()) { + authusername = query.value(0).toString(); + } + return authusername; +} + // void PostgreSqlStorage::safeExec(QSqlQuery &query) { // qDebug() << "PostgreSqlStorage::safeExec"; // qDebug() << " executing:\n" << query.executedQuery(); @@ -1869,6 +2064,7 @@ bool PostgreSqlMigrationWriter::writeMo(const QuasselUserMO &user) bindValue(1, user.username); bindValue(2, user.password); bindValue(3, user.hashversion); + bindValue(4, user.authenticator); return exec(); } @@ -1878,6 +2074,8 @@ bool PostgreSqlMigrationWriter::writeMo(const SenderMO &sender) { bindValue(0, sender.senderId); bindValue(1, sender.sender); + bindValue(2, sender.realname); + bindValue(3, sender.avatarurl); return exec(); } @@ -1974,8 +2172,11 @@ bool PostgreSqlMigrationWriter::writeMo(const BufferMO &buffer) bindValue(7, buffer.lastmsgid); bindValue(8, buffer.lastseenmsgid); bindValue(9, buffer.markerlinemsgid); - bindValue(10, buffer.key); - bindValue(11, buffer.joined); + bindValue(10, buffer.bufferactivity); + bindValue(11, buffer.highlightcount); + bindValue(12, buffer.key); + bindValue(13, buffer.joined); + bindValue(14, buffer.cipher); return exec(); } @@ -1989,7 +2190,8 @@ bool PostgreSqlMigrationWriter::writeMo(const BacklogMO &backlog) bindValue(3, backlog.type); bindValue(4, (int)backlog.flags); bindValue(5, backlog.senderid); - bindValue(6, backlog.message); + bindValue(6, backlog.senderprefixes); + bindValue(7, backlog.message); return exec(); }