aboutsummaryrefslogtreecommitdiff
path: root/src/database_postgres.cc
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-10-17 16:12:31 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-10-17 16:12:31 -0300
commitd92f642810dc3125515d64f953d2bee840de1cc1 (patch)
treefbb497f3e65725a86366bc49aff0270e029d0316 /src/database_postgres.cc
parent63705942a366d39308251549a018451808c20ac8 (diff)
downloadquerymanager-d92f642810dc3125515d64f953d2bee840de1cc1.tar.gz
querymanager-d92f642810dc3125515d64f953d2bee840de1cc1.zip
world startup/shutdown timestamps + adjust a few column names
Diffstat (limited to 'src/database_postgres.cc')
-rw-r--r--src/database_postgres.cc68
1 files changed, 59 insertions, 9 deletions
diff --git a/src/database_postgres.cc b/src/database_postgres.cc
index 80076c9..241637a 100644
--- a/src/database_postgres.cc
+++ b/src/database_postgres.cc
@@ -1325,7 +1325,7 @@ bool GetWorlds(TDatabase *Database, DynamicArray<TWorld> *Worlds){
"SELECT WorldID, COUNT(*) FROM OnlineCharacters GROUP BY WorldID"
")"
" SELECT W.Name, W.Type, COALESCE(N.NumPlayers, 0), W.MaxPlayers,"
- " W.OnlineRecord, W.OnlineRecordTimestamp"
+ " W.OnlinePeak, W.OnlinePeakTimestamp, W.LastStartup, W.LastShutdown"
" FROM Worlds AS W"
" LEFT JOIN N ON W.WorldID = N.WorldID");
if(Stmt == NULL){
@@ -1347,8 +1347,10 @@ bool GetWorlds(TDatabase *Database, DynamicArray<TWorld> *Worlds){
World.Type = GetResultInt(Result, Row, 1);
World.NumPlayers = GetResultInt(Result, Row, 2);
World.MaxPlayers = GetResultInt(Result, Row, 3);
- World.OnlineRecord = GetResultInt(Result, Row, 4);
- World.OnlineRecordTimestamp = GetResultTimestamp(Result, Row, 5);
+ World.OnlinePeak = GetResultInt(Result, Row, 4);
+ World.OnlinePeakTimestamp = GetResultTimestamp(Result, Row, 5);
+ World.LastStartup = GetResultTimestamp(Result, Row, 6);
+ World.LastShutdown = GetResultTimestamp(Result, Row, 7);
Worlds->Push(World);
}
@@ -3299,12 +3301,12 @@ bool InsertOnlineCharacters(TDatabase *Database, int WorldID,
return true;
}
-bool CheckOnlineRecord(TDatabase *Database, int WorldID, int NumCharacters, bool *NewRecord){
- ASSERT(Database != NULL && NewRecord != NULL);
+bool CheckOnlinePeak(TDatabase *Database, int WorldID, int NumCharacters, bool *NewPeak){
+ ASSERT(Database != NULL && NewPeak != NULL);
const char *Stmt = PrepareQuery(Database,
- "UPDATE Worlds SET OnlineRecord = $2::INTEGER,"
- " OnlineRecordTimestamp = CURRENT_TIMESTAMP"
- " WHERE WorldID = $1::INTEGER AND OnlineRecord < $2::INTEGER");
+ "UPDATE Worlds SET OnlinePeak = $2::INTEGER,"
+ " OnlinePeakTimestamp = CURRENT_TIMESTAMP"
+ " WHERE WorldID = $1::INTEGER AND OnlinePeak < $2::INTEGER");
if(Stmt == NULL){
LOG_ERR("Failed to prepare query");
return false;
@@ -3322,7 +3324,55 @@ bool CheckOnlineRecord(TDatabase *Database, int WorldID, int NumCharacters, bool
return false;
}
- *NewRecord = (ResultAffectedRows(Result) > 0);
+ *NewPeak = (ResultAffectedRows(Result) > 0);
+ return true;
+}
+
+bool CheckWorldStartupTime(TDatabase *Database, int WorldID){
+ ASSERT(Database != NULL);
+ const char *Stmt = PrepareQuery(Database,
+ "UPDATE Worlds SET LastStartup = CURRENT_TIMESTAMP"
+ " WHERE WorldID = $1::INTEGER AND LastStartup <= LastShutdown");
+ if(Stmt == NULL){
+ LOG_ERR("Failed to prepare query");
+ return false;
+ }
+
+ ParamBuffer Params = {};
+ ParamBegin(&Params, 1, 1);
+ ParamInt(&Params, WorldID);
+ PGresult *Result = PQexecPrepared(Database->Handle, Stmt, Params.NumParams,
+ Params.Values, Params.Lengths, Params.Formats, 1);
+ AutoResultClear ResultGuard(Result);
+ if(PQresultStatus(Result) != PGRES_COMMAND_OK){
+ LOG_ERR("Failed to execute query: %s", PQerrorMessage(Database->Handle));
+ return false;
+ }
+
+ return true;
+}
+
+bool CheckWorldShutdownTime(TDatabase *Database, int WorldID){
+ ASSERT(Database != NULL);
+ const char *Stmt = PrepareQuery(Database,
+ "UPDATE Worlds SET LastShutdown = CURRENT_TIMESTAMP"
+ " WHERE WorldID = $1::INTEGER AND LastShutdown <= LastStartup");
+ if(Stmt == NULL){
+ LOG_ERR("Failed to prepare query");
+ return false;
+ }
+
+ ParamBuffer Params = {};
+ ParamBegin(&Params, 1, 1);
+ ParamInt(&Params, WorldID);
+ PGresult *Result = PQexecPrepared(Database->Handle, Stmt, Params.NumParams,
+ Params.Values, Params.Lengths, Params.Formats, 1);
+ AutoResultClear ResultGuard(Result);
+ if(PQresultStatus(Result) != PGRES_COMMAND_OK){
+ LOG_ERR("Failed to execute query: %s", PQerrorMessage(Database->Handle));
+ return false;
+ }
+
return true;
}