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 d480c7bc4..5ae9529d6 100644 --- a/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h +++ b/libcockatrice_network/libcockatrice/network/server/remote/server_database_interface.h @@ -733,6 +733,23 @@ public: return {}; } + /** @brief One row the periodic status update appends to the uptime table. */ + struct UptimeRecord + { + int serverId = 0; + int uptimeSecs = 0; + int usersCount = 0; + int modsCount = 0; + QString modsList; + int gamesCount = 0; + quint64 txBytes = 0; + quint64 rxBytes = 0; + }; + /** @brief Appends one uptime row; a no-op when persistence is unavailable. */ + virtual void recordUptime(const UptimeRecord & /* record */) + { + } + virtual void clearSessionTables() { } diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index f5abe0a43..aa272fb53 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -879,19 +879,16 @@ void Servatrice::statusUpdate() rxBytes = 0; rxBytesMutex.unlock(); - QSqlQuery *query = servatriceDatabaseInterface->prepareQuery( - "insert into {prefix}_uptime (id_server, timest, uptime, users_count, mods_count, mods_list, games_count, " - "tx_bytes, rx_bytes) values(:id, NOW(), :uptime, :users_count, :mods_count, :mods_list, :games_count, :tx, " - ":rx)"); - query->bindValue(":id", serverId); - query->bindValue(":uptime", uptime); - query->bindValue(":users_count", uc); - query->bindValue(":mods_count", mc); - query->bindValue(":mods_list", ml); - query->bindValue(":games_count", gc); - query->bindValue(":tx", tx); - query->bindValue(":rx", rx); - servatriceDatabaseInterface->execSqlQuery(query); + Server_DatabaseInterface::UptimeRecord uptimeRecord; + uptimeRecord.serverId = serverId; + uptimeRecord.uptimeSecs = uptime; + uptimeRecord.usersCount = uc; + uptimeRecord.modsCount = mc; + uptimeRecord.modsList = ml; + uptimeRecord.gamesCount = gc; + uptimeRecord.txBytes = tx; + uptimeRecord.rxBytes = rx; + servatriceDatabaseInterface->recordUptime(uptimeRecord); if (getRegistrationEnabled() && getEnableInternalSMTPClient()) { if (getRequireEmailActivationEnabled()) { diff --git a/servatrice/src/servatrice_database_interface.cpp b/servatrice/src/servatrice_database_interface.cpp index 7db682751..a2558f11b 100644 --- a/servatrice/src/servatrice_database_interface.cpp +++ b/servatrice/src/servatrice_database_interface.cpp @@ -3337,6 +3337,27 @@ QList Servatrice_DatabaseInterf return entries; } +void Servatrice_DatabaseInterface::recordUptime(const UptimeRecord &record) +{ + if (!checkSql()) { + return; + } + + QSqlQuery *query = prepareQuery( + "insert into {prefix}_uptime (id_server, timest, uptime, users_count, mods_count, mods_list, games_count, " + "tx_bytes, rx_bytes) values(:id, NOW(), :uptime, :users_count, :mods_count, :mods_list, :games_count, :tx, " + ":rx)"); + query->bindValue(":id", record.serverId); + query->bindValue(":uptime", record.uptimeSecs); + query->bindValue(":users_count", record.usersCount); + query->bindValue(":mods_count", record.modsCount); + query->bindValue(":mods_list", record.modsList); + query->bindValue(":games_count", record.gamesCount); + query->bindValue(":tx", record.txBytes); + query->bindValue(":rx", record.rxBytes); + execSqlQuery(query); +} + 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 6f290028c..6a01b57ce 100644 --- a/servatrice/src/servatrice_database_interface.h +++ b/servatrice/src/servatrice_database_interface.h @@ -280,6 +280,7 @@ public: UptimeSnapshot getLatestUptimeSnapshot(int serverId) override; bool getLatestServerMessage(int serverId, QString &message) override; QList getServerListEntries() override; + void recordUptime(const UptimeRecord &record) 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.