X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fpostgresqlstorage.cpp;h=ac6dec93b67255bb3194ab98252cb90139fce628;hb=32582b14a442c35d1a64131ac10792683fb06f82;hp=acb7f37c922cb6917e36c57fe34b47226bd05968;hpb=e4712c3a52b8aeff334947b7d81b1a9d12b935ce;p=quassel.git diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index acb7f37c..ac6dec93 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2016 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; } @@ -210,13 +209,14 @@ bool PostgreSqlStorage::setupSchemaVersion(int version) } -UserId PostgreSqlStorage::addUser(const QString &user, const QString &password) +UserId PostgreSqlStorage::addUser(const QString &user, const QString &password, const QString &authenticator) { QSqlQuery query(logDb()); query.prepare(queryString("insert_quasseluser")); query.bindValue(":username", user); query.bindValue(":password", hashPassword(password)); query.bindValue(":hashversion", Storage::HashVersion::Latest); + query.bindValue(":authenticator", authenticator); safeExec(query); if (!watchQuery(query)) return 0; @@ -286,6 +286,21 @@ UserId PostgreSqlStorage::getUserId(const QString &user) } } +QString PostgreSqlStorage::getUserAuthenticator(const UserId userid) +{ + QSqlQuery query(logDb()); + query.prepare(queryString("select_authenticator")); + query.bindValue(":userid", userid.toInt()); + safeExec(query); + watchQuery(query); + + if (query.first()) { + return query.value(0).toString(); + } + else { + return QString(""); + } +} UserId PostgreSqlStorage::internalUser() { @@ -697,6 +712,11 @@ void PostgreSqlStorage::bindNetworkInfo(QSqlQuery &query, const NetworkInfo &inf query.bindValue(":autoreconnectretries", info.autoReconnectRetries); query.bindValue(":unlimitedconnectretries", info.unlimitedReconnectRetries); query.bindValue(":rejoinchannels", info.rejoinChannels); + // Custom rate limiting + query.bindValue(":usecustomessagerate", info.useCustomMessageRate); + query.bindValue(":messagerateburstsize", info.messageRateBurstSize); + query.bindValue(":messageratedelay", info.messageRateDelay); + query.bindValue(":unlimitedmessagerate", info.unlimitedMessageRate); if (info.networkId.isValid()) query.bindValue(":networkid", info.networkId.toInt()); } @@ -715,6 +735,7 @@ void PostgreSqlStorage::bindServerInfo(QSqlQuery &query, const Network::Server & query.bindValue(":proxyport", server.proxyPort); query.bindValue(":proxyuser", server.proxyUser); query.bindValue(":proxypass", server.proxyPass); + query.bindValue(":sslverify", server.sslVerify); } @@ -842,6 +863,11 @@ QList PostgreSqlStorage::networks(UserId user) net.useSasl = networksQuery.value(16).toBool(); net.saslAccount = networksQuery.value(17).toString(); net.saslPassword = networksQuery.value(18).toString(); + // Custom rate limiting + net.useCustomMessageRate = networksQuery.value(19).toBool(); + net.messageRateBurstSize = networksQuery.value(20).toUInt(); + net.messageRateDelay = networksQuery.value(21).toUInt(); + net.unlimitedMessageRate = networksQuery.value(22).toBool(); serversQuery.bindValue(":networkid", net.networkId.toInt()); safeExec(serversQuery); @@ -864,6 +890,7 @@ QList PostgreSqlStorage::networks(UserId user) server.proxyPort = serversQuery.value(8).toUInt(); server.proxyUser = serversQuery.value(9).toString(); server.proxyPass = serversQuery.value(10).toString(); + server.sslVerify = serversQuery.value(11).toBool(); servers << server; } net.serverList = servers; @@ -1358,7 +1385,6 @@ QHash PostgreSqlStorage::bufferMarkerLineMsgIds(UserId user) return markerLineHash; } - bool PostgreSqlStorage::logMessage(Message &msg) { QSqlDatabase db = logDb(); @@ -1522,7 +1548,7 @@ QList PostgreSqlStorage::requestMsgs(UserId user, BufferId bufferId, Ms QString queryName; QVariantList params; if (last == -1 && first == -1) { - queryName = "select_messages"; + queryName = "select_messagesNewestK"; } else if (last == -1) { queryName = "select_messagesNewerThan"; @@ -1842,6 +1868,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(); } @@ -1925,6 +1952,11 @@ bool PostgreSqlMigrationWriter::writeMo(const NetworkMO &network) bindValue(22, network.usesasl); bindValue(23, network.saslaccount); bindValue(24, network.saslpassword); + // Custom rate limiting + bindValue(25, network.usecustommessagerate); + bindValue(26, network.messagerateburstsize); + bindValue(27, network.messageratedelay); + bindValue(28, network.unlimitedmessagerate); return exec(); } @@ -1939,10 +1971,11 @@ bool PostgreSqlMigrationWriter::writeMo(const BufferMO &buffer) bindValue(4, buffer.buffername); bindValue(5, buffer.buffercname); bindValue(6, (int)buffer.buffertype); - bindValue(7, buffer.lastseenmsgid); - bindValue(8, buffer.markerlinemsgid); - bindValue(9, buffer.key); - bindValue(10, buffer.joined); + bindValue(7, buffer.lastmsgid); + bindValue(8, buffer.lastseenmsgid); + bindValue(9, buffer.markerlinemsgid); + bindValue(10, buffer.key); + bindValue(11, buffer.joined); return exec(); } @@ -1978,6 +2011,7 @@ bool PostgreSqlMigrationWriter::writeMo(const IrcServerMO &ircserver) bindValue(11, ircserver.proxyport); bindValue(12, ircserver.proxyuser); bindValue(13, ircserver.proxypass); + bindValue(14, ircserver.sslverify); return exec(); } @@ -2011,5 +2045,11 @@ bool PostgreSqlMigrationWriter::postProcess() if (!exec()) return false; } + + // Update the lastmsgid for all existing buffers. + resetQuery(); + newQuery(QString("SELECT populate_lastmsgid()"), db); + if (!exec()) + return false; return true; }