Define new database interface

This commit is contained in:
Zwelf 2020-07-04 10:13:21 +02:00
parent 6e6e51e626
commit d59cdf47b5
4 changed files with 217 additions and 1 deletions

View file

@ -1834,11 +1834,14 @@ set_src(ANTIBOT_SRC GLOB src/antibot
antibot_null.cpp antibot_null.cpp
) )
set_src(ENGINE_SERVER GLOB src/engine/server set_src(ENGINE_SERVER GLOB_RECURSE src/engine/server
antibot.cpp antibot.cpp
antibot.h antibot.h
authmanager.cpp authmanager.cpp
authmanager.h authmanager.h
databases/connection.h
databases/mysql.cpp
databases/mysql.h
name_ban.cpp name_ban.cpp
name_ban.h name_ban.h
register.cpp register.cpp

View file

@ -0,0 +1,58 @@
#ifndef ENGINE_SERVER_DATABASES_CONNECTION_H
#define ENGINE_SERVER_DATABASES_CONNECTION_H
#include <base/system.h>
// can hold one PreparedStatement with Results
class IDbConnection
{
public:
IDbConnection(const char *pPrefix)
{
str_copy(m_aPrefix, pPrefix, sizeof(m_aPrefix));
}
virtual ~IDbConnection() {}
// copies the credentials, not the active connection
virtual IDbConnection *Copy() = 0;
// returns the database prefix
const char *GetPrefix() { return m_aPrefix; }
enum Status
{
IN_USE,
SUCCESS,
ERROR,
};
// returns true if connection was established
virtual Status Connect() = 0;
virtual void Disconnect() = 0;
// get exclusive read/write access to the database
virtual void Lock() = 0;
virtual void Unlock() = 0;
// ? for Placeholders, connection has to be established, can overwrite previous prepared statements
virtual void PrepareStatement(const char *pStmt) = 0;
// PrepareStatement has to be called beforehand,
virtual void BindString(int Idx, const char *pString) = 0;
virtual void BindInt(int Idx, int Value) = 0;
virtual void Execute() = 0;
// if true if another result row exists and selects it
virtual bool Step() = 0;
virtual int GetInt(int Col) const = 0;
// ensures that the string is null terminated
virtual void GetString(int Col, char *pBuffer, int BufferSize) const = 0;
// returns number of bytes read into the buffer
virtual int GetBlob(int Col, unsigned char *pBuffer, int BufferSize) const = 0;
protected:
char m_aPrefix[64];
};
#endif // ENGINE_SERVER_DATABASES_CONNECTION_H

View file

@ -0,0 +1,88 @@
#include "mysql.h"
#include <cppconn/driver.h>
CMysqlConnection::CMysqlConnection(
const char *pDatabase,
const char *pPrefix,
const char *pUser,
const char *pPass,
const char *pIp,
int Port,
bool Setup) :
IDbConnection(pPrefix),
m_pDriver(nullptr),
m_Port(Port),
m_Setup(Setup),
m_InUse(false)
{
str_copy(m_aDatabase, pDatabase, sizeof(m_aDatabase));
str_copy(m_aUser, pUser, sizeof(m_aUser));
str_copy(m_aPass, pPass, sizeof(m_aPass));
str_copy(m_aIp, pIp, sizeof(m_aIp));
}
CMysqlConnection::~CMysqlConnection()
{
}
CMysqlConnection *CMysqlConnection::Copy()
{
return new CMysqlConnection(m_aDatabase, m_aPrefix, m_aUser, m_aPass, m_aIp, m_Port, m_Setup);
}
IDbConnection::Status CMysqlConnection::Connect()
{
if(m_InUse.exchange(true))
return Status::IN_USE;
return Status::ERROR;
}
void CMysqlConnection::Disconnect()
{
m_InUse.store(false);
}
void CMysqlConnection::Lock()
{
}
void CMysqlConnection::Unlock()
{
}
void CMysqlConnection::PrepareStatement(const char *pStmt)
{
}
void CMysqlConnection::BindString(int Idx, const char *pString)
{
}
void CMysqlConnection::BindInt(int Idx, int Value)
{
}
void CMysqlConnection::Execute()
{
}
bool CMysqlConnection::Step()
{
return false;
}
int CMysqlConnection::GetInt(int Col) const
{
return 0;
}
void CMysqlConnection::GetString(int Col, char *pBuffer, int BufferSize) const
{
}
int CMysqlConnection::GetBlob(int Col, unsigned char *pBuffer, int BufferSize) const
{
return 0;
}

View file

@ -0,0 +1,67 @@
#ifndef ENGINE_SERVER_DATABASES_MYSQL_H
#define ENGINE_SERVER_DATABASES_MYSQL_H
#include "connection.h"
#include <atomic>
#include <memory>
#include <cppconn/exception.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/statement.h>
namespace sql {
class Driver;
} /* namespace sql */
class CMysqlConnection : public IDbConnection
{
public:
CMysqlConnection(
const char *pDatabase,
const char *pPrefix,
const char *pUser,
const char *pPass,
const char *pIp,
int Port,
bool Setup);
virtual ~CMysqlConnection();
virtual CMysqlConnection *Copy();
virtual Status Connect();
virtual void Disconnect();
virtual void Lock();
virtual void Unlock();
virtual void PrepareStatement(const char *pStmt);
virtual void BindString(int Idx, const char *pString);
virtual void BindInt(int Idx, int Value);
virtual void Execute();
virtual bool Step();
virtual int GetInt(int Col) const;
virtual void GetString(int Col, char *pBuffer, int BufferSize) const;
virtual int GetBlob(int Col, unsigned char *pBuffer, int BufferSize) const;
private:
std::unique_ptr<sql::Connection> m_pConnection;
sql::Driver *m_pDriver;
std::unique_ptr<sql::PreparedStatement> m_pPreparedStmt;
std::unique_ptr<sql::ResultSet> m_pResults;
// copy of config vars
char m_aDatabase[64];
char m_aUser[64];
char m_aPass[64];
char m_aIp[64];
int m_Port;
bool m_Setup;
std::atomic_bool m_InUse;
};
#endif // ENGINE_SERVER_DATABASES_MYSQL_H