diff --git a/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h b/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h index 6f1fbd2f0..d480c7bc4 100644 --- a/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h +++ b/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h @@ -717,6 +717,21 @@ public: { return false; } + /** @brief One row of the server list, with the certificate exactly as stored. */ + struct ServerListEntryRecord + { + int id = 0; + QByteArray sslCert; + QString hostname; + QString address; + int gamePort = 0; + int controlPort = 0; + }; + /** @brief Every published server-list row, in id order; empty when the query fails. */ + virtual QList getServerListEntries() + { + return {}; + } virtual void clearSessionTables() { diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 222832db3..f5abe0a43 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -743,13 +743,10 @@ void Servatrice::updateServerList() serverListMutex.lock(); serverList.clear(); - QSqlQuery *query = servatriceDatabaseInterface->prepareQuery( - "select id, ssl_cert, hostname, address, game_port, control_port from {prefix}_servers order by id asc"); - servatriceDatabaseInterface->execSqlQuery(query); - while (query->next()) { - ServerProperties prop(query->value(0).toInt(), QSslCertificate(query->value(1).toString().toUtf8()), - query->value(2).toString(), QHostAddress(query->value(3).toString()), - query->value(4).toInt(), query->value(5).toInt()); + const auto serverListEntries = servatriceDatabaseInterface->getServerListEntries(); + for (const auto &entry : serverListEntries) { + ServerProperties prop(entry.id, QSslCertificate(entry.sslCert), entry.hostname, QHostAddress(entry.address), + entry.gamePort, entry.controlPort); serverList.append(prop); qDebug() << QString("#%1 CERT=%2 NAME=%3 IP=%4:%5 CPORT=%6") .arg(prop.id) diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index c49e295ab..7db682751 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -3310,6 +3310,33 @@ bool Servatrice_DatabaseInterface::getLatestServerMessage(int serverId, QString return true; } +QList Servatrice_DatabaseInterface::getServerListEntries() +{ + QList entries; + if (!checkSql()) { + return entries; + } + + QSqlQuery *query = prepareQuery( + "select id, ssl_cert, hostname, address, game_port, control_port from {prefix}_servers order by id asc"); + if (!execSqlQuery(query)) { + return entries; + } + + while (query->next()) { + ServerListEntryRecord entry; + entry.id = query->value(0).toInt(); + entry.sslCert = query->value(1).toString().toUtf8(); + entry.hostname = query->value(2).toString(); + entry.address = query->value(3).toString(); + entry.gamePort = query->value(4).toInt(); + entry.controlPort = query->value(5).toInt(); + entries.append(entry); + } + + return entries; +} + bool Servatrice_DatabaseInterface::removeUserAvatar(const QString &userName) { if (!checkSql()) { diff --git a/servatrice/src/servatrice_database_interface.h b/servatrice/src/servatrice_database_interface.h index 76d35cd48..6f290028c 100644 --- a/servatrice/src/servatrice_database_interface.h +++ b/servatrice/src/servatrice_database_interface.h @@ -279,6 +279,7 @@ public: // {prefix}_uptime table. valid is false when no snapshot exists yet. UptimeSnapshot getLatestUptimeSnapshot(int serverId) override; bool getLatestServerMessage(int serverId, QString &message) override; + QList getServerListEntries() override; bool removeUserAvatar(const QString &userName) override; // Outcome of removeUserBanner(), so the caller can tell a missing user apart // from a user who simply has no banner card set.