diff --git a/sql/create_tables/oastat_create_tables_common.sql b/sql/create_tables/oastat_create_tables_common.sql index 6d4d89c..4b43279 100644 --- a/sql/create_tables/oastat_create_tables_common.sql +++ b/sql/create_tables/oastat_create_tables_common.sql @@ -1,4 +1,6 @@ --- oastat. General create table file +-- oastat. General create table file RESTRICT2MYSQL RESTRICT2POSTGRESQL +-- oastat. Create table file for PostgreSQL RESTRICT2POSTGRESQL +-- oastat. Create table file for MySQL RESTRICT2MYSQL -- Note: Lines containing RESTRICT2MYSQL are MySQL specific -- Note: Lines containing RESTRICT2POSTGRESQL are PostgreSQL specific @@ -63,7 +65,7 @@ CREATE TABLE oastat_kills ( eventnumber SERIAL PRIMARY KEY, gamenumber bigint NOT NULL, second integer NOT NULL, - attacker character varying(64) NOT NULL, + attacker bigint NOT NULL, target bigint NOT NULL, modtype integer NOT NULL ); @@ -136,7 +138,7 @@ ALTER TABLE oastat_userinfo -- PRIMARY KEYS START - +-- Notice that pRIMARY KEY must not be only uppercase letters or it will be replaced by a script! ALTER TABLE oastat_players ADD CONSTRAINT oastat_players_pk pRIMARY KEY (guid); @@ -196,10 +198,23 @@ set foreign_key_checks = 1 ; -- RESTRICT2MYSQL -- STANDARD VALUES +-- default uservars to save: INSERT INTO oastat_config_uservars2save (thekey) VALUES ('hc'); +-- default cvars to save: INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('g_instantgib'); INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('g_rockets'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('dmflags'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('g_lms_mode'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('elimination_roundtime'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('capturelimit'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('sv_maxclients'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('fraglimit'); +INSERT INTO oastat_config_gamevars2save (cvar) VALUES ('bot_minplayers'); + + +-- default player for WORLD events: +INSERT INTO oastat_players (guid,playerid,lastseen, isbot, model,headmodel,nickname) VALUES ('WORLD',-1,now(),'n','-','-','-'); COMMIT; diff --git a/src/db/Db2DbiXX.cpp b/src/db/Db2DbiXX.cpp index 1e5093f..034bfb9 100644 --- a/src/db/Db2DbiXX.cpp +++ b/src/db/Db2DbiXX.cpp @@ -18,18 +18,21 @@ #define STARTGAME_LASTVALUE "INSERT INTO oastat_games(gametype, mapname, basegame,servername,time) VALUES (?,LOWER(?),?,?,?)" #define PLAYERSINSERT "INSERT INTO oastat_players(guid,nickname,lastseen,isBot, model, headmodel) VALUES (?,?,?,?,?,?)" #define PLAYERSUPDATE "UPDATE oastat_players SET nickname = ?,lastseen = ?,isBot = ?, model = ?, headmodel = ? WHERE guid = ? AND lastseen < ?" -#define USERINFOINSERT "INSERT INTO oastat_userinfo(gamenumber,second,player,team,model,skill) VALUES (?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),?,?,?)" -#define USERINFOUPDATE "UPDATE oastat_userinfo SET team = ?, model = ?, skill = ? WHERE gamenumber = ? AND second = ? AND player IN (SELECT playerid FROM oastat_players WHERE GUID = ?)" +#define USERINFOINSERT "INSERT INTO oastat_userinfo(gamenumber,second,player,team,model,skill) VALUES (?,?,COALESCE(SELECT playerid FROM oastat_players WHERE guid = ?),0),?,?,?)" +#define USERINFOUPDATE "UPDATE oastat_userinfo SET team = ?, model = ?, skill = ? WHERE gamenumber = ? AND second = ? AND player = COALESCE((SELECT playerid FROM oastat_players WHERE GUID = ?),0)" #define ENDGAME "UPDATE oastat_games SET second=? WHERE gamenumber = ?" -#define KILL "INSERT INTO oastat_kills(gamenumber,second,attacker,target,modtype) VALUES(?,?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),?)" -#define AWARD "INSERT INTO oastat_awards(gamenumber,second,player,award) VALUES (?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),?)" -#define POINT "INSERT INTO oastat_points(gamenumber,second,player,score) VALUES (?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),?)" -#define CTF "INSERT INTO oastat_team_events(gamenumber,second,team,player,gametype,eventtype) VALUES (?,?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),'ctf',?)" -#define CTF1F "INSERT INTO oastat_team_events(gamenumber,second,team,player,gametype,eventtype) VALUES (?,?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),'1fctf',?)" +#define KILL "INSERT INTO oastat_kills(gamenumber,second,attacker,target,modtype) VALUES(?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?)" +#define AWARD "INSERT INTO oastat_awards(gamenumber,second,player,award) VALUES (?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?)" +#define POINT "INSERT INTO oastat_points(gamenumber,second,player,score) VALUES (?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?)" +#define CTF "INSERT INTO oastat_team_events(gamenumber,second,team,player,gametype,eventtype) VALUES (?,?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),'ctf',?)" +#define CTF1F "INSERT INTO oastat_team_events(gamenumber,second,team,player,gametype,eventtype) VALUES (?,?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),'1fctf',?)" #define ELIMINATION "INSERT INTO oastat_team_events(gamenumber,second,team,eventtype,generic1,gametype) VALUES (?,?,?,?,?,'elimination')" -#define CTF_ELIM "INSERT INTO oastat_team_events(gamenumber,second,team,player,eventtype,generic1,gametype) VALUES (?,?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),?,?,'ctfelim')" -#define HARVESTER "INSERT INTO oastat_team_events(gamenumber,second,team,player,player2,eventtype,amount,gametype) VALUES (?,?,?,(SELECT playerid FROM oastat_players WHERE guid = ?),(SELECT playerid FROM oastat_players WHERE guid = ?),?,?,'harvester')" -#define CHALLENGES "INSERT INTO oastat_challenges(gamenumber,player,challenge,amount) VALUES (?,(SELECT playerid FROM oastat_players WHERE guid = ?),?,?)" +#define CTF_ELIM "INSERT INTO oastat_team_events(gamenumber,second,team,player,eventtype,generic1,gametype) VALUES (?,?,?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?,?,'ctfelim')" +#define HARVESTER "INSERT INTO oastat_team_events(gamenumber,second,team,player,player2,eventtype,amount,gametype) VALUES (?,?,?,NVL((SELECT playerid FROM oastat_players WHERE guid = ?),0),COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?,?,'harvester')" +#define CHALLENGES "INSERT INTO oastat_challenges(gamenumber,player,challenge,amount) VALUES (?,COALESCE((SELECT playerid FROM oastat_players WHERE guid = ?),0),?,?)" + +#define SELECT_USERVARS2SAVE "SELECT thekey FROM oastat_config_uservars2save" +#define SELECT_CVARS2SAVE "SELECT cvar FROM oastat_config_gamevars2save" static string S_GETLASTGAMENUMBER = GETLASTGAMENUMBER; static string S_STARTGAME = STARTGAME; @@ -64,11 +67,28 @@ void Db2DbiXX::InitStrings(string backend) { sql_backend = backend; } +void Db2DbiXX::ReadConfigFromDb() { + result res; + row r; + string value; + *sql<> value; + uservars2save.insert(value); + } + *sql<< SELECT_CVARS2SAVE,res; + while(res.next(r)) { + r >> value; + cvars2save.insert(value); + } +} + Db2DbiXX::Db2DbiXX() { sql = new session("pgsql"); InitStrings("pgsql"); sql->param("dbname","oastat"); sql->connect(); + ReadConfigFromDb(); commitlock = new transaction(*sql); debug = true; } @@ -90,6 +110,7 @@ Db2DbiXX::Db2DbiXX(string dbargs) } } sql->connect(); + ReadConfigFromDb(); commitlock = new transaction(*sql); debug = true; //sql(dbargs); @@ -105,7 +126,7 @@ Db2DbiXX::~Db2DbiXX() { } void Db2DbiXX::createTables() { - + } void Db2DbiXX::startGame(int gametype, string mapname, string basegame, string servername, OaStatStruct *oss) { diff --git a/src/db/Db2DbiXX.hpp b/src/db/Db2DbiXX.hpp index 7fb1cd8..25f12f1 100644 --- a/src/db/Db2DbiXX.hpp +++ b/src/db/Db2DbiXX.hpp @@ -13,6 +13,7 @@ #include #include #include +#include using namespace std; using namespace dbixx; @@ -54,8 +55,11 @@ private: void SetOk(bool ok); void DebugMessage(string msg); void InitStrings(string backend); + void ReadConfigFromDb(); string sql_backend; bool last_value; + set cvars2save; + set uservars2save; }; #endif /* _DB2DBIXX_HPP */ diff --git a/src/oastat.cpp b/src/oastat.cpp index 7f67845..37f5e92 100644 --- a/src/oastat.cpp +++ b/src/oastat.cpp @@ -165,7 +165,7 @@ static int processStdIn(istream* in_p) { oss.clear(); oss.parseLine(line); osslist.push_back(oss); - if(oss.command=="ShutdownGame") + if(true || oss.command=="ShutdownGame") { while(!osslist.empty()) { diff --git a/src/oss2db/Award2Db.cpp b/src/oss2db/Award2Db.cpp index 897c3be..1ed0596 100644 --- a/src/oss2db/Award2Db.cpp +++ b/src/oss2db/Award2Db.cpp @@ -23,6 +23,9 @@ void Award2Db::process(OaStatStruct oss) { if(!canProcess(oss)) return; //Invalid oss + if(oss.parameters.at(0)>-1 && oss.parameters.at(0)addAward(oss.second,player,oss.parameters.at(1)); diff --git a/src/oss2db/Challenge2Db.cpp b/src/oss2db/Challenge2Db.cpp index eb5631b..593f017 100644 --- a/src/oss2db/Challenge2Db.cpp +++ b/src/oss2db/Challenge2Db.cpp @@ -21,6 +21,9 @@ bool Challenge2Db::canProcess(OaStatStruct oss) { void Challenge2Db::process(OaStatStruct oss) { if(!canProcess(oss)) return; //Invalid oss + + if(oss.parameters.at(0)>-1 && oss.parameters.at(0)-1 && oss.parameters.at(0)-1 && oss.parameters.at(3)addHarvester(oss.second,player1,player2,oss.parameters.at(1) /*team*/,oss.parameters.at(2) /*event*/, oss.parameters.at(4) /*score*/ );