X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fpostgresqlstorage.cpp;h=030423f6e409c68a0283e28abd9210a11f888836;hp=90b0fdbbc4ef8fdbac8869e2073e19e458e902d2;hb=99055e8e4a83c234ae424cc225d3a7aa17c1544b;hpb=b134e777b822b929a78455fd92146bf7443e9aa1 diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index 90b0fdbb..030423f6 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -49,7 +49,7 @@ bool PostgreSqlStorage::isAvailable() const { if (!QSqlDatabase::isDriverAvailable("QPSQL")) { qWarning() << qPrintable(tr("PostgreSQL driver plugin not available for Qt. Installed drivers:")) - << qPrintable(QSqlDatabase::drivers().join(", ")); + << qPrintable(QSqlDatabase::drivers().join(", ")); return false; } return true; @@ -115,7 +115,8 @@ bool PostgreSqlStorage::initDbSession(QSqlDatabase& db) break; default: // The slash got replaced with 0 or more than 2 slashes! o_O - qCritical() << "Your version of Qt does something _VERY_ strange to slashes in QSqlQueries! You should consult your trusted doctor!"; + qCritical() + << "Your version of Qt does something _VERY_ strange to slashes in QSqlQueries! You should consult your trusted doctor!"; return false; break; } @@ -527,13 +528,8 @@ IdentityId PostgreSqlStorage::createIdentity(UserId user, CoreIdentity& identity 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); if (!watchQuery(query)) { db.rollback(); @@ -610,13 +606,8 @@ bool PostgreSqlStorage::updateIdentity(UserId user, const CoreIdentity& identity 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); @@ -717,10 +708,8 @@ std::vector PostgreSqlStorage::identities(UserId user) 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 nicks; @@ -811,6 +800,8 @@ void PostgreSqlStorage::bindNetworkInfo(QSqlQuery& query, const NetworkInfo& inf query.bindValue(":messagerateburstsize", info.messageRateBurstSize); query.bindValue(":messageratedelay", info.messageRateDelay); query.bindValue(":unlimitedmessagerate", info.unlimitedMessageRate); + query.bindValue(":skipcaps", info.skipCapsToString()); + if (info.networkId.isValid()) query.bindValue(":networkid", info.networkId.toInt()); } @@ -958,6 +949,7 @@ std::vector PostgreSqlStorage::networks(UserId user) net.messageRateBurstSize = networksQuery.value(20).toUInt(); net.messageRateDelay = networksQuery.value(21).toUInt(); net.unlimitedMessageRate = networksQuery.value(22).toBool(); + net.skipCapsFromString(networksQuery.value(23).toString()); serversQuery.bindValue(":networkid", net.networkId.toInt()); safeExec(serversQuery); @@ -1541,7 +1533,7 @@ Message::Types PostgreSqlStorage::bufferActivity(BufferId bufferId, MsgId lastSe query.bindValue(":lastseenmsgid", lastSeenMsgId.toQint64()); safeExec(query); watchQuery(query); - Message::Types result = Message::Types(nullptr); + Message::Types result{}; if (query.first()) result = Message::Types(query.value(0).toInt()); return result; @@ -1919,6 +1911,82 @@ std::vector PostgreSqlStorage::requestMsgsFiltered( return messagelist; } +std::vector PostgreSqlStorage::requestMsgsForward( + UserId user, BufferId bufferId, MsgId first, MsgId last, int limit, Message::Types type, Message::Flags flags) +{ + std::vector messagelist; + + QSqlDatabase db = logDb(); + if (!beginReadOnlyTransaction(db)) { + qWarning() << "PostgreSqlStorage::requestMsgsForward(): cannot start read only transaction!"; + qWarning() << " -" << qPrintable(db.lastError().text()); + return messagelist; + } + + BufferInfo bufferInfo = getBufferInfo(user, bufferId); + if (!bufferInfo.isValid()) { + db.rollback(); + return messagelist; + } + + QString queryName; + QVariantList params; + + if (first == -1) { + params << std::numeric_limits::min(); + } else { + params << first.toQint64(); + } + + if (last == -1) { + params << std::numeric_limits::max(); + } else { + params << last.toQint64(); + } + + params << bufferId.toInt(); + + int typeRaw = type; + int flagsRaw = flags; + params << typeRaw; + params << flagsRaw; + + if (limit != -1) + params << limit; + else + params << QVariant(QVariant::Int); + + QSqlQuery query = executePreparedQuery("select_messagesForward", params, db); + + if (!watchQuery(query)) { + qDebug() << "select_messages failed"; + db.rollback(); + return messagelist; + } + + QDateTime timestamp; + while (query.next()) { + // PostgreSQL returns date/time in ISO 8601 format, no 64-bit handling needed + // See https://www.postgresql.org/docs/current/static/datatype-datetime.html#DATATYPE-DATETIME-OUTPUT + timestamp = query.value(1).toDateTime(); + timestamp.setTimeSpec(Qt::UTC); + Message msg(timestamp, + bufferInfo, + (Message::Type)query.value(2).toInt(), + 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).toInt()); + msg.setMsgId(query.value(0).toLongLong()); + messagelist.push_back(std::move(msg)); + } + + db.commit(); + return messagelist; +} + std::vector PostgreSqlStorage::requestAllMsgs(UserId user, MsgId first, MsgId last, int limit) { std::vector messagelist; @@ -2359,6 +2427,8 @@ bool PostgreSqlMigrationWriter::writeMo(const NetworkMO& network) bindValue(26, network.messagerateburstsize); bindValue(27, network.messageratedelay); bindValue(28, network.unlimitedmessagerate); + // Skipped IRCv3 caps + bindValue(29, network.skipcaps); return exec(); }