#pragma once
/************************************************************************
MeOS - Orienteering Software
Copyright (C) 2009-2020 Melin Software HB
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 3 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 .
Melin Software HB - software@melin.nu - www.melin.nu
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
************************************************************************/
#pragma warning( disable : 4251)
#include
#include
#include "sqltypes.h"
class oRunner;
class oEvent;
class oCard;
class oClub;
class oCourse;
class oClass;
class oControl;
class oBase;
class oFreePunch;
class oDataInterface;
class oTeam;
class oDataContainer;
struct SqlUpdated;
namespace mysqlpp {
class Query;
}
using namespace std;
class MeosSQL
{
protected:
bool warnedOldVersion;
int monitorId;
int buildVersion;
mysqlpp::Connection con;
string CmpDataBase;
void alert(const string &s);
vector missingObjects;
string errorMessage;
string serverName;
string serverUser;
string serverPassword;
unsigned int serverPort;
bool isOld(int counter, const string &time, oBase *ob);
string andWhereOld(oBase *ob);
OpFailStatus updateTime(const char *oTable, oBase *ob);
// Update object in database with fixed query. If useId is false, Id is ignored (used
OpFailStatus syncUpdate(mysqlpp::Query &updateqry, const char *oTable, oBase *ob);
bool storeData(oDataInterface odi, const mysqlpp::Row &row, unsigned long &revision);
void importLists(oEvent *oe, const char *bf);
void encodeLists(const oEvent *or, string &listEnc) const;
//Set DB to default competition DB
void setDefaultDB();
// Update the courses of a class.
OpFailStatus syncReadClassCourses(oClass *c,const set &courses,
bool readRecursive);
OpFailStatus syncRead(bool forceRead, oTeam *t, bool readRecursive);
OpFailStatus syncRead(bool forceRead, oRunner *r, bool readClassClub, bool readCourseCard);
OpFailStatus syncReadCourse(bool forceRead, oCourse *c, set &readControls);
OpFailStatus syncRead(bool forceRead, oClass *c, bool readCourses);
OpFailStatus syncReadControls(oEvent *oe, const set &controlIds);
void storeClub(const mysqlpp::Row &row, oClub &c);
void storeControl(const mysqlpp::Row &row, oControl &c);
void storeCard(const mysqlpp::Row &row, oCard &c);
void storePunch(const mysqlpp::Row &row, oFreePunch &p, bool rehash);
OpFailStatus storeTeam(const mysqlpp::Row &row, oTeam &t,
bool readRecursive, bool allowSubRead);
OpFailStatus storeRunner(const mysqlpp::Row &row, oRunner &r,
bool readCourseCard,
bool readClassClub,
bool readRunners,
bool allowSubRead);
OpFailStatus storeCourse(const mysqlpp::Row &row, oCourse &c,
set &readControls,
bool allowSubRead);
OpFailStatus storeClass(const mysqlpp::Row &row, oClass &c,
bool readCourses,
bool allowSubRead);
void getColumns(const string &table, set &output);
void upgradeDB(const string &db, oDataContainer const *odi);
void warnOldDB();
bool checkOldVersion(oEvent *oe, mysqlpp::Row &row);
map, DWORD> readTimes;
void synchronized(const oBase &entity);
bool skipSynchronize(const oBase &entity) const;
mysqlpp::ResNSel updateCounter(const char *oTable, int id, mysqlpp::Query *updateqry);
string selectUpdated(const char *oTable, const SqlUpdated &updated);
void addedFromDatabase(oBase *object);
void updateCounters(OpFailStatus st,
int counter,
const string &modified,
SqlUpdated &update, int &maxCounter);
public:
void clearReadTimes();
bool dropDatabase(oEvent *oe);
bool checkConnection(oEvent *oe);
void processMissingObjects();
bool repairTables(const string &db, vector &output);
bool getErrorMessage(char *bf);
bool reConnect();
bool listCompetitions(oEvent *oe, bool keepConnection);
bool Remove(oBase *ob);
// Create database of runners and clubs
bool createRunnerDB(oEvent *oe, mysqlpp::Query &query);
// Upload runner database to server
OpFailStatus uploadRunnerDB(oEvent *oe);
bool openDB(oEvent *oe);
bool closeDB();
bool syncListRunner(oEvent *oe);
bool syncListClass(oEvent *oe);
bool syncListCourse(oEvent *oe);
bool syncListControl(oEvent *oe);
bool syncListCard(oEvent *oe);
bool syncListClub(oEvent *oe);
bool syncListPunch(oEvent *oe);
bool syncListTeam(oEvent *oe);
OpFailStatus SyncEvent(oEvent *oe);
OpFailStatus SyncUpdate(oEvent *oe);
OpFailStatus SyncRead(oEvent *oe);
OpFailStatus syncUpdate(oRunner *r, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oRunner *r);
OpFailStatus syncUpdate(oCard *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oCard *c);
OpFailStatus syncUpdate(oClass *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oClass *c);
OpFailStatus syncUpdate(oClub *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oClub *c);
OpFailStatus syncUpdate(oCourse *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oCourse *c);
OpFailStatus syncUpdate(oControl *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oControl *c);
OpFailStatus syncUpdate(oFreePunch *c, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oFreePunch *c, bool rehash);
OpFailStatus syncUpdate(oTeam *t, bool forceWriteAll);
OpFailStatus syncRead(bool forceRead, oTeam *t);
/** General interface. TypeId lookup */
OpFailStatus syncRead(bool forceRead, oBase *c);
int getModifiedMask(oEvent &oe);
MeosSQL(void);
virtual ~MeosSQL(void);
};