[Server] Serve the server list through the database interface (#7855)

This commit is contained in:
BruebachL 2026-11-10 12:16:32 +01:00 • committed by GitHub
parent f8f8fffa6b
commit f1ee6bdc2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 47 additions and 7 deletions

View file

@ -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<ServerListEntryRecord> getServerListEntries()
{
return {};
}
virtual void clearSessionTables()
{

View file

@ -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)

View file

@ -3310,6 +3310,33 @@ bool Servatrice_DatabaseInterface::getLatestServerMessage(int serverId, QString
return true;
}
QList<Server_DatabaseInterface::ServerListEntryRecord> Servatrice_DatabaseInterface::getServerListEntries()
{
QList<ServerListEntryRecord> 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()) {

View file

@ -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<ServerListEntryRecord> 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.