commit 806dd25f
Fixed recovery for database errors
Changed files
| M | src/db/Db2CppDb.cpp before |
| M | src/oastat.cpp before |
diff --git a/src/db/Db2CppDb.cpp b/src/db/Db2CppDb.cpp
index 87e337e..f85589c 100644
--- a/src/db/Db2CppDb.cpp
+++ b/src/db/Db2CppDb.cpp
@@ -102,18 +102,20 @@ void Db2CppDb::startGame(int gametype, const std::string &mapname, const std::st
sql = std::shared_ptr<cppdb::session>(new cppdb::session(connectstring));
commitlock = std::shared_ptr<cppdb::transaction>(new cppdb::transaction(*sql));
Rollback(); //in case there was some garbage that could be comitted (like warmup or an unfinished game)
- SetOk(true);
+ SetOk(false);
timestamp = oss.getDateTime();
if (oss.restOfLine.find("\\isWarmup\\1") != std::string::npos) {
- SetOk(false);
std::cout << "Warmup: " << servername << ", " << oss.getTimeStamp() << "\n";
return;
}
if (IsDuplicate(servername,timestamp)) {
- SetOk(false);
std::cout << "Duplicate:" << servername << ", " << oss.getTimeStamp() << "\n";
return;
}
+ if (oss.getDateTime().tm_year+1900 == 0) {
+ std::cout << "No timestamp: "<< servername << "\n";
+ return;
+ }
if (last_value) {
cppdb::statement st = *sql << "INSERT INTO oastat_games(gametype, mapname, basegame,servername,time) VALUES (?,LOWER(?),?,?,?)"; //<<gametype<<mapname<<basegame<<servername<<timestamp<<exec;
st.bind(gametype);
@@ -124,13 +126,16 @@ void Db2CppDb::startGame(int gametype, const std::string &mapname, const std::st
st.exec();
gamenumber = st.last_insert_id();
if (gamenumber < 1) {
- SetOk(false);
std::cout << "Must FAIL!\n";
}
+ else {
+ SetOk(true);
+ }
} else {
gamenumber = getNextGameNumber();
*sql << "INSERT INTO oastat_games(gamenumber,gametype, mapname, basegame,servername,time) VALUES (?,?,LOWER(?),?,?,?)"<<
gamenumber << gametype << mapname << basegame << servername << timestamp << cppdb::exec;
+ SetOk(true);
}
DebugMessage("startGame");
}
diff --git a/src/oastat.cpp b/src/oastat.cpp
index 7793418..0bc8664 100644
--- a/src/oastat.cpp
+++ b/src/oastat.cpp
@@ -103,9 +103,10 @@ static void addCommands(std::shared_ptr<Database> &db,std::vector<std::shared_pt
static int processStdIn(std::istream &in_p, std::vector<std::shared_ptr<Struct2Db> > &commands)
{
- bool done = true;
+ bool done = false;
OaStatStruct *startstruct = nullptr;
- do {
+ while(!done) {
+ done = true;
std::string line = "";
OaStatStruct oss;
std::deque<OaStatStruct> osslist;
@@ -140,12 +141,13 @@ static int processStdIn(std::istream &in_p, std::vector<std::shared_ptr<Struct2D
/*
If there is an error write it in the log and try again continue
*/
+ startstruct = nullptr;
osslist.clear();
std::cerr << "oastat: Crashed (NEAR FATAL EXCEPTION) at line: \"" << line << "\"\n"<<
"oastat: Error is: " << e2.what() << "\n";
done = false;
}
- } while (!done);
+ }
return 0;
}
@@ -210,8 +212,8 @@ int main (int argc, const char* argv[])
if (vm.count("help")) {
std::cout << desc << "\n";
std::cout << "Examples: \n";
- std::cout << argv[0] << " -f \"~/.openarena/baseoa/games.log\" --backend \"CppDb\" --dbarg \"mysql:database=oastat;username=openarena\"\n";
- std::cout << argv[0] << " -f \"~/.openarena/baseoa/games.log\" --backend \"CppDb\" --dbarg \"pgsql:database=oastat;username=openarena\"\n";
+ std::cout << argv[0] << " -f \""<< f << "/.openarena/baseoa/games.log\" --backend \"CppDb\" --dbarg \"mysql:database=oastat;user=openarena\"\n";
+ std::cout << argv[0] << " -f \"" << f << "/.openarena/baseoa/games.log\" --backend \"CppDb\" --dbarg \"pgsql:database=oastat;username=openarena\"\n";
std::cout << "cat \"~/.openarena/baseoa/games.log\" |" << argv[0] << " -f \"\" --backend \"CppDb\" --dbarg \"pgsql:database=oastat;username=openarena\"\n";
std::cout << argv[0] << " -f %APPDATA%/OpenArena/baseoa/games.log --backend \"CppDb\" --dbarg \"sqlite3:db=defoastat.db3\"\n";
std::cout << "\n";