diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c87d914
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,11 @@
+{
+ "editor.insertSpaces": false,
+ "files.exclude": {
+ "**/*.db3": true,
+ "**/*.o": true,
+ "**/*~": true,
+ "*/*.tgz": true,
+ "Makefile": true,
+ "nbproject": true
+ }
+}
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a029055..2de5ab4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,8 +4,12 @@ find_package(Boost COMPONENTS program_options REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -std=c++11 -DUSECPPDB=1")
-file(GLOB SOURCES "src/*.cpp" "src/*/*.cpp")
+file(GLOB SOURCES "src/*/*.cpp")
-add_executable(oastat ${SOURCES})
+add_executable(oastat src/oastat.cpp ${SOURCES})
TARGET_LINK_LIBRARIES( oastat ${Boost_LIBRARIES} )
target_link_libraries( oastat cppdb gcrypt gpg-error)
+
+add_executable(oastat_delete_games src/oastat_delete_games.cpp ${SOURCES})
+TARGET_LINK_LIBRARIES( oastat_delete_games ${Boost_LIBRARIES} )
+target_link_libraries( oastat_delete_games cppdb gcrypt gpg-error)
\ No newline at end of file
diff --git a/README.md b/README.md
index 992ef87..e9ea7fc 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Homepage:
* libgcrypt
* boost_program_options
-On Ubuntu (15.04 or later) all requirements can be installed with: sudo apt-get install build-essential libboost-program-options-dev libcppdb-dev libgcrypt20-dev cmake
+On Ubuntu (16.04 or later) all requirements can be installed with: sudo apt-get install build-essential libboost-program-options-dev libcppdb-dev libgcrypt20-dev cmake
On earlier versions CppDb must be installed manually.
To compile:
diff --git a/src/common/common.cpp b/src/common/common.cpp
new file mode 100644
index 0000000..c5127d1
--- /dev/null
+++ b/src/common/common.cpp
@@ -0,0 +1,53 @@
+/*
+===========================================================================
+oastat - a program for parsing log files and write the result to a database
+Copyright (C) 2012 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/oastat/
+===========================================================================
+*/
+
+#include
+#include
+#include
+
+std::vector clientIdMap;
+
+/**
+ * Hashes the user id so they cannot be recovered from the db.
+ *
+ * @param unhashedID - The unhashed id
+ * @return the hashed id
+ */
+std::string getHashedId(const std::string& unhashedID)
+{
+ int msg_len = unhashedID.length();
+ int hash_len = gcry_md_get_algo_dlen( GCRY_MD_SHA1 );
+ std::vector hash_binary(hash_len);
+ std::vector hash_hex(hash_len*2+1);
+ char *out = &hash_hex.at(0);
+ char *p = out;
+
+ gcry_md_hash_buffer( GCRY_MD_SHA1, &hash_binary[0], unhashedID.c_str(), msg_len );
+ for ( int i = 0; i < hash_len; i++, p += 2 ) {
+ snprintf ( p, 3, "%02x", hash_binary[i] );
+ }
+
+ std::string hashedID = &hash_hex.at(0);
+
+ return hashedID; //Replace with md5 at some point
+}
\ No newline at end of file
diff --git a/src/common/local.h b/src/common/local.h
new file mode 100644
index 0000000..4a915ac
--- /dev/null
+++ b/src/common/local.h
@@ -0,0 +1,38 @@
+/*
+===========================================================================
+oastat - a program for parsing log files and write the result to a database
+Copyright (C) 2012 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/oastat/
+===========================================================================
+*/
+
+#ifndef _LOCAL_H
+#define _LOCAL_H
+
+#define MAX_ID 128
+
+#include "oastatstruct.h"
+
+/* This array contains all the guid hashes of the players in a game */
+extern std::vector clientIdMap;
+
+/* returns the SHA-1 code of the parameter */
+std::string getHashedId(const std::string& unhashedID);
+
+#endif /* _LOCAL_H */
+
diff --git a/src/common/oastatstruct.cpp b/src/common/oastatstruct.cpp
new file mode 100644
index 0000000..c835816
--- /dev/null
+++ b/src/common/oastatstruct.cpp
@@ -0,0 +1,169 @@
+/*
+===========================================================================
+oastat - a program for parsing log files and write the result to a database
+Copyright (C) 2012 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/oastat/
+===========================================================================
+*/
+
+#include "oastatstruct.h"
+#include
+#include
+#include
+#include
+
+static void makeLower(std::string &x)
+{
+ for (size_t i=0; i= 'A' && x[i] <= 'X') {
+ x[i] = x[i]-'A'+'a';
+ }
+ }
+}
+
+
+void OaStatStruct::clear()
+{
+ second=0;
+ command = "";
+ parameters.clear();
+ restOfLine = "";
+}
+
+void OaStatStruct::parseLine(const std::string& orgLine)
+{
+ //Parse time
+ std::string tempTimeString = orgLine.substr(0,7);
+ int posColon = tempTimeString.find(":");
+ int minute = atoi(tempTimeString.substr(0,posColon).c_str());
+ second = atoi(tempTimeString.substr(posColon+1,7).c_str());
+ second+=minute*60;
+ std::string line = orgLine.substr(7, orgLine.length()); //Cut the first part of the string.
+
+ //Parse command name:
+ posColon = line.find(":");
+ command = line.substr(0,posColon);
+ try {
+ line = line.substr(posColon+2,line.length()); //Also remove the colon and the first space after it (+2)
+
+ posColon = line.find_first_not_of(" -0123456789"); //First non-number or space
+ std::stringstream ss;
+ ss << line.substr(0,posColon);
+ int counter = 0; //to ensure that we don't go on forever
+ while (ss && counter++<10) {
+ int value;
+ ss >> value;
+ parameters.push_back(value);
+ }
+
+
+ if (line.at(posColon) == ':') {
+ posColon++; //There is some inconsistensy about then there is a colon here
+ if(line.at(posColon) == ' ') {
+ posColon++; //If there is a colon there is likely a space
+ }
+ }
+ line = line.substr(posColon,line.length());
+ } catch (std::exception &e) {
+ //The last part does not always exist... ignore it
+ restOfLine = "";
+ return;
+ }
+
+
+ restOfLine = line;
+}
+
+
+std::map OaStatStruct::GetInfostring(const std::string& restOfLine) const
+{
+ std::map list;
+ size_t lastPos = 0;
+ bool iskey = true;
+ std::string key;
+ if (restOfLine[0] == '\\') {
+ lastPos++;
+ }
+ while (lastPos0) {
+ list[key] = value;
+ }
+ }
+ iskey = !iskey;
+ lastPos = curPos+1;
+ }
+ return list;
+}
+
+std::map OaStatStruct::GetInfostring() const
+{
+ return GetInfostring(restOfLine);
+}
+
+const tm OaStatStruct::getDateTime() const
+{
+ return _datetime;
+}
+
+std::string ZeroPadNumber(int num, int size = 2)
+{
+ std::ostringstream ss;
+ ss.clear();
+ ss << std::setw( size ) << std::setfill( '0' ) << num;
+ return ss.str();
+}
+
+std::string OaStatStruct::getTimeStamp() const
+{
+ std::string s = "TIMESTAMP \'" + ZeroPadNumber(_datetime.tm_year+1900,4) + "-" + ZeroPadNumber(_datetime.tm_mon+1) + "-"
+ + ZeroPadNumber(_datetime.tm_mday) + " " + ZeroPadNumber(_datetime.tm_hour) + ":"
+ + ZeroPadNumber(_datetime.tm_min) + ":" + ZeroPadNumber(_datetime.tm_sec) + "\'";
+ return s;
+}
+
+void OaStatStruct::setTimeStamp(const std::string ×tring)
+{
+ if (timestring.empty()) {
+ std::time_t t = std::time(0);
+ _datetime = *std::gmtime(&t);
+ return;
+ }
+ std::stringstream ss(timestring);
+ std::string tmp;
+ getline(ss,tmp,'-');
+ _datetime.tm_year = atoi(tmp.c_str())-1900;
+ getline(ss,tmp,'-');
+ _datetime.tm_mon = atoi(tmp.c_str())-1;
+ getline(ss,tmp,' ');
+ _datetime.tm_mday = atoi(tmp.c_str());
+ getline(ss,tmp,':');
+ _datetime.tm_hour = atoi(tmp.c_str());
+ getline(ss,tmp,':');
+ _datetime.tm_min = atoi(tmp.c_str());
+ getline(ss,tmp);
+ _datetime.tm_sec = atoi(tmp.c_str());
+}
diff --git a/src/common/oastatstruct.h b/src/common/oastatstruct.h
new file mode 100644
index 0000000..758b5fe
--- /dev/null
+++ b/src/common/oastatstruct.h
@@ -0,0 +1,83 @@
+/*
+===========================================================================
+oastat - a program for parsing log files and write the result to a database
+Copyright (C) 2012 Poul Sander
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see http://www.gnu.org/licenses/
+
+Source information and contacts persons can be found at
+https://github.com/sago007/oastat/
+===========================================================================
+*/
+
+#ifndef _OASTATSTRUCT_H
+#define _OASTATSTRUCT_H
+
+#include
+#include
+#include