diff --git a/src/db/Db2DbiXX.cpp b/src/db/Db2DbiXX.cpp index 4b4023f..e3f155d 100644 --- a/src/db/Db2DbiXX.cpp +++ b/src/db/Db2DbiXX.cpp @@ -7,9 +7,14 @@ #include "Db2DbiXX.hpp" +//PostgreSQL: #define GETNEXTGAMENUMBER "SELECT nextval('oastat_games_gamenumber_seq')" +#define GETLASTGAMENUMBER "SELECT curval('oastat_games_gamenumber_seq')" +//MySQL: +#define GETLASTGAMENUMBER_MYSQL "SELECT LAST_INSERT_ID() FROM DUAL" #define STARTGAME "INSERT INTO oastat_games(gamenumber,gametype, mapname, basegame,servername,time) VALUES (?,?,LOWER(?),?,?,?)" +#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,guid,team,model,skill) VALUES (?,?,?,?,?,?)" @@ -22,11 +27,38 @@ #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 (?,?,?,?,?,?,'ctfelim')" - -static char* booltext[2] = {"false","true"}; +static string S_GETLASTGAMENUMBER = GETLASTGAMENUMBER; +static string S_STARTGAME = STARTGAME; +static string S_STARTGAME_LASTVALUE = STARTGAME_LASTVALUE; +static string S_PLAYERSINSERT = PLAYERSINSERT; +static string S_PLAYERSUPDATE = PLAYERSUPDATE; +static string S_USERINFOINSERT = USERINFOINSERT; +static string S_ENDGAME = ENDGAME; +static string S_KILL = KILL; +static string S_AWARD = AWARD; +static string S_POINT = POINT; +static string S_CTF = CTF; +static string S_CTF1F = CTF1F; +static string S_ELIMINATION = ELIMINATION; +static string S_CTF_ELIM = CTF_ELIM; + +static string booltext[2] = {"n","y"}; + +void Db2DbiXX::InitStrings(string backend) { + last_value = false; + if(backend == "pgsql") { + last_value = true; //Now also use last for PostgreSQL + } + if(backend == "mysql") { + last_value = true; + S_GETLASTGAMENUMBER = GETLASTGAMENUMBER_MYSQL; + } + sql_backend = backend; +} Db2DbiXX::Db2DbiXX() { sql = new session("pgsql"); + InitStrings("pgsql"); sql->param("dbname","oastat"); sql->connect(); commitlock = new transaction(*sql); @@ -40,6 +72,7 @@ Db2DbiXX::Db2DbiXX(string dbargs) string holder; stream >> holder; sql = new session(holder); + InitStrings("mysql"); while(!stream.eof()) { stream >> holder; if(!stream.eof()) { @@ -71,8 +104,17 @@ void Db2DbiXX::startGame(int gametype, string mapname, string basegame, string s sql->reconnect(); Rollback(); //in case there was some garbage that could be comitted (like warmup or an unfinished game) SetOk(true); - gamenumber = getNextGameNumber(); - *sql << STARTGAME,gamenumber,gametype,mapname,basegame,servername,oss->getDateTime(),exec(); + if(last_value) { + *sql << S_STARTGAME_LASTVALUE,gametype,mapname,basegame,servername,oss->getDateTime(),exec(); + gamenumber = getLastGameNumber(); + if(gamenumber < 1) { + SetOk(false); + cout << "Must FAIL!" << endl; + } + } else { + gamenumber = getNextGameNumber(); + *sql << S_STARTGAME,gamenumber,gametype,mapname,basegame,servername,oss->getDateTime(),exec(); + } DebugMessage("startGame"); } @@ -80,7 +122,7 @@ void Db2DbiXX::startGame(int gametype, string mapname, string basegame, string s endGame is called then we finnish the game. This also means that it is safe to commit */ void Db2DbiXX::endGame(int second) { - *sql << ENDGAME,second,gamenumber,exec(); + *sql << S_ENDGAME,second,gamenumber,exec(); Commit(); //Game have ended, transaction is in a stable state DebugMessage("endgame"); } @@ -94,20 +136,20 @@ void Db2DbiXX::setPlayerInfo(string guid, string nickname, bool isBot, int secon { try{ *sql << "SAVEPOINT SETPLAYER",exec(); - *sql << PLAYERSINSERT,guid,nickname,oss->getDateTime(),booltext[isBot],model,headmodel,exec(); + *sql << S_PLAYERSINSERT,guid,nickname,oss->getDateTime(),booltext[isBot],model,headmodel,exec(); *sql << "RELEASE SAVEPOINT SETPLAYER",exec(); //Needed by postgresql }catch (dbixx_error &e) { DebugMessage("Already inserted? "+(string)e.what()); *sql << "ROLLBACK TO SAVEPOINT SETPLAYER",exec(); } - *sql << PLAYERSUPDATE,nickname,oss->getDateTime(),booltext[isBot],model,headmodel,guid,oss->getDateTime(),exec(); + *sql << S_PLAYERSUPDATE,nickname,oss->getDateTime(),booltext[isBot],model,headmodel,guid,oss->getDateTime(),exec(); } - *sql << USERINFOINSERT,gamenumber,second,guid,team,model,skill,exec(); + *sql << S_USERINFOINSERT,gamenumber,second,guid,team,model,skill,exec(); DebugMessage("setPlayerInfo for "+nickname+" with GUID: "+guid); } void Db2DbiXX::addKill(int second, string attackerID, string targetID, int type) { - *sql<< KILL,gamenumber,second,attackerID,targetID,type,exec(); + *sql<< S_KILL,gamenumber,second,attackerID,targetID,type,exec(); DebugMessage("addKill"); } @@ -117,27 +159,27 @@ void Db2DbiXX::addKill(int second, string attackerID, string targetID, int type) }*/ void Db2DbiXX::addAward(int second, string player, int award) { - *sql << AWARD,gamenumber,second,player,award,exec(); + *sql << S_AWARD,gamenumber,second,player,award,exec(); DebugMessage("addAward"); } void Db2DbiXX::addScoreInfo(int second, string player, int score) { - *sql << POINT,gamenumber,second,player,score,exec(); + *sql << S_POINT,gamenumber,second,player,score,exec(); DebugMessage("addScoreInfo"); } void Db2DbiXX::addCtf(int second, string player, int team, int event) { - *sql << CTF,gamenumber,second,team,player,event,exec(); + *sql << S_CTF,gamenumber,second,team,player,event,exec(); DebugMessage("addCtf"); } void Db2DbiXX::addCtf1f(int second, string player, int team, int event) { - *sql << CTF1F,gamenumber,second,team,player,event,exec(); + *sql << S_CTF1F,gamenumber,second,team,player,event,exec(); DebugMessage("addCtf1f"); } void Db2DbiXX::addElimination(int second, int roundnumber, int team, int event) { - *sql << ELIMINATION,gamenumber,second,team,event,roundnumber,exec(); + *sql << S_ELIMINATION,gamenumber,second,team,event,roundnumber,exec(); DebugMessage("addElimination"); } @@ -155,6 +197,22 @@ int Db2DbiXX::getNextGameNumber() { } } +int Db2DbiXX::getLastGameNumber() { + int result = -1; + row r; + *sql<< S_GETLASTGAMENUMBER; + DebugMessage("Gettings last game number"); + if(sql->single(r)) { + r>> result; + cout << "Game number: " << result << endl; + return result; + } + else { + throw "Could not get last gamenumber"; + } +} + + /* This is a helper function so we never forget to start a new transaction after a commit. */ diff --git a/src/db/Db2DbiXX.hpp b/src/db/Db2DbiXX.hpp index 5ac15e2..159262e 100644 --- a/src/db/Db2DbiXX.hpp +++ b/src/db/Db2DbiXX.hpp @@ -42,11 +42,15 @@ private: bool debug; int gamenumber; int getNextGameNumber(); + int getLastGameNumber(); void Commit(); void Rollback(); bool Ok(); void SetOk(bool ok); void DebugMessage(string msg); + void InitStrings(string backend); + string sql_backend; + bool last_value; }; #endif /* _DB2DBIXX_HPP */ diff --git a/src/oastat.cpp b/src/oastat.cpp index 8805094..64df048 100644 --- a/src/oastat.cpp +++ b/src/oastat.cpp @@ -149,14 +149,14 @@ static int processStdIn() { osslist.pop_front(); for(int i=0;iprocess(oss); - } catch (exception &e) + /*} catch (exception &e) { cerr << "oastat: Sql_error at line: \"" << line << "\"" << endl << "oastat: Error is: " << e.what() << "oastat: Last error will be ignored" << endl; - } + }*/ } } } diff --git a/src/oss2db/init2db.cpp b/src/oss2db/init2db.cpp index bdba243..f91be3d 100644 --- a/src/oss2db/init2db.cpp +++ b/src/oss2db/init2db.cpp @@ -34,7 +34,7 @@ bool Init2Db::canProcess(OaStatStruct oss) { } void Init2Db::process(OaStatStruct oss) { - if(oss.command != getCommand()) + if(!canProcess(oss)) return; //Invalid oss map arguments = oss.GetInfostring(); int gametype = atoi(arguments["g_gametype"].c_str());