git repos / oastat

commit 66716d43

sago007 · 2011-01-16 11:49
66716d4332371da84af727278549d5744c93c249 patch · browse files
parent 54d9d00b860927d55687d94d386a1b4d72821a45

further MySQL problems


git-svn-id: http://oastat.googlecode.com/svn/trunk@18 a36be8df-c75f-1e49-46ad-4f0ee64bdc62

Changed files

M src/db/Db2DbiXX.cpp before
M src/db/Db2DbiXX.hpp before
M src/oastat.cpp before
M src/oss2db/init2db.cpp before
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;i<commands.size();i++)
{
- try {
+ //try {
commands.at(i)->process(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<string,string> arguments = oss.GetInfostring();
int gametype = atoi(arguments["g_gametype"].c_str());