posted new IDBDriver API - no natives are implemented yet, MySQL extension coming very shortly
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40864
This commit is contained in:
+101
-108
@@ -28,7 +28,22 @@ void DBManager::OnSourceModAllInitialized()
|
||||
|
||||
m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
|
||||
m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
||||
m_QueryType = g_HandleSys.CreateType("IQuery", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
||||
}
|
||||
|
||||
void DBManager::OnSourceModShutdown()
|
||||
{
|
||||
g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
|
||||
g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
|
||||
}
|
||||
|
||||
unsigned int DBManager::GetInterfaceVersion()
|
||||
{
|
||||
return SMINTERFACE_DBI_VERSION;
|
||||
}
|
||||
|
||||
const char *DBManager::GetInterfaceName()
|
||||
{
|
||||
return SMINTERFACE_DBI_NAME;
|
||||
}
|
||||
|
||||
void DBManager::OnHandleDestroy(HandleType_t type, void *object)
|
||||
@@ -39,124 +54,24 @@ void DBManager::OnHandleDestroy(HandleType_t type, void *object)
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_HandleSys.TypeCheck(type, m_QueryType))
|
||||
if (g_HandleSys.TypeCheck(type, m_DatabaseType))
|
||||
{
|
||||
IQuery *pQuery = (IQuery *)object;
|
||||
pQuery->Release();
|
||||
} else if (g_HandleSys.TypeCheck(type, m_DatabaseType)) {
|
||||
IDatabase *pdb = (IDatabase *)object;
|
||||
pdb->Close();
|
||||
}
|
||||
}
|
||||
|
||||
void DBManager::AddDriver(IDBDriver *pDriver, IdentityToken_t *ident)
|
||||
{
|
||||
if (!pDriver)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_drivers.size() >= HANDLESYS_MAX_SUBTYPES)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
db_driver *driver = new db_driver;
|
||||
|
||||
driver->driver = pDriver;
|
||||
driver->ident = ident;
|
||||
|
||||
HandleSecurity sec;
|
||||
|
||||
sec.pIdentity = ident;
|
||||
sec.pOwner = g_pCoreIdent;
|
||||
driver->hDriver = g_HandleSys.CreateHandleEx(m_DriverType, driver, &sec, NULL, NULL);
|
||||
|
||||
driver->htDatabase = g_HandleSys.CreateType(NULL, this, m_DatabaseType, NULL, NULL, g_pCoreIdent, NULL);
|
||||
driver->htQuery = g_HandleSys.CreateType(NULL, this, m_QueryType, NULL, NULL, g_pCoreIdent, NULL);
|
||||
|
||||
m_drivers.push_back(driver);
|
||||
}
|
||||
|
||||
void DBManager::RemoveDriver(IDBDriver *pDriver)
|
||||
{
|
||||
CVector<db_driver *>::iterator iter;
|
||||
for (iter = m_drivers.begin();
|
||||
iter != m_drivers.end();
|
||||
iter++)
|
||||
{
|
||||
if ((*iter)->driver == pDriver)
|
||||
{
|
||||
db_driver *driver = (*iter);
|
||||
HandleSecurity sec;
|
||||
|
||||
sec.pIdentity = driver->ident;
|
||||
sec.pOwner = g_pCoreIdent;
|
||||
g_HandleSys.RemoveType(driver->htQuery, driver->ident);
|
||||
g_HandleSys.RemoveType(driver->htDatabase, driver->ident);
|
||||
g_HandleSys.FreeHandle(driver->hDriver, &sec);
|
||||
|
||||
delete driver;
|
||||
m_drivers.erase(iter);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char *DBManager::GetInterfaceName()
|
||||
{
|
||||
return SMINTERFACE_DBI_NAME;
|
||||
}
|
||||
|
||||
unsigned int DBManager::GetInterfaceVersion()
|
||||
{
|
||||
return SMINTERFACE_DBI_VERSION;
|
||||
}
|
||||
|
||||
unsigned int DBManager::GetDriverCount()
|
||||
{
|
||||
return (unsigned int)m_drivers.size();
|
||||
}
|
||||
|
||||
IDBDriver *DBManager::GetDriver(unsigned int index, IdentityToken_t **pToken)
|
||||
{
|
||||
if (index >= GetDriverCount())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pToken)
|
||||
{
|
||||
*pToken = m_drivers[index]->ident;
|
||||
}
|
||||
|
||||
return m_drivers[index]->driver;
|
||||
}
|
||||
|
||||
const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
|
||||
{
|
||||
/* :TODO: implement */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent)
|
||||
bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength)
|
||||
{
|
||||
const DatabaseInfo *pInfo = FindDatabaseConf(name);
|
||||
|
||||
unsigned int count = GetDriverCount();
|
||||
for (unsigned int i=0; i<count; i++)
|
||||
for (size_t i=0; i<m_drivers.size(); i++)
|
||||
{
|
||||
IDBDriver *driver = GetDriver(i);
|
||||
if (strcmp(driver->GetIdentifier(), pInfo->driver) == 0)
|
||||
if (strcasecmp(pInfo->driver, m_drivers[i]->GetIdentifier()) == 0)
|
||||
{
|
||||
*pdr = driver;
|
||||
if (persistent)
|
||||
{
|
||||
*pdb = driver->PConnect(pInfo);
|
||||
} else {
|
||||
*pdb = driver->Connect(pInfo);
|
||||
}
|
||||
*pdr = m_drivers[i];
|
||||
*pdb = m_drivers[i]->Connect(pInfo, persistent, error, maxlength);
|
||||
return (*pdb == NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,3 +80,81 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void DBManager::AddDriver(IDBDriver *pDriver)
|
||||
{
|
||||
m_drivers.push_back(pDriver);
|
||||
}
|
||||
|
||||
void DBManager::RemoveDriver(IDBDriver *pDriver)
|
||||
{
|
||||
for (size_t i=0; i<m_drivers.size(); i++)
|
||||
{
|
||||
if (m_drivers[i] == pDriver)
|
||||
{
|
||||
m_drivers.erase(m_drivers.iterAt(i));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken)
|
||||
{
|
||||
HandleType_t type = 0;
|
||||
|
||||
if (dtype == DBHandle_Driver)
|
||||
{
|
||||
type = m_DriverType;
|
||||
} else if (dtype == DBHandle_Database) {
|
||||
type = m_DatabaseType;
|
||||
} else {
|
||||
return BAD_HANDLE;
|
||||
}
|
||||
|
||||
return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
|
||||
}
|
||||
|
||||
HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
|
||||
{
|
||||
HandleType_t type = 0;
|
||||
|
||||
if (dtype == DBHandle_Driver)
|
||||
{
|
||||
type = m_DriverType;
|
||||
} else if (dtype == DBHandle_Database) {
|
||||
type = m_DatabaseType;
|
||||
} else {
|
||||
return HandleError_Type;
|
||||
}
|
||||
|
||||
HandleSecurity sec(NULL, g_pCoreIdent);
|
||||
|
||||
return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
|
||||
}
|
||||
|
||||
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
|
||||
{
|
||||
HandleSecurity sec(token, g_pCoreIdent);
|
||||
return g_HandleSys.FreeHandle(hndl, &sec);
|
||||
}
|
||||
|
||||
unsigned int DBManager::GetDriverCount()
|
||||
{
|
||||
return (unsigned int)m_drivers.size();
|
||||
}
|
||||
|
||||
IDBDriver *DBManager::GetDriver(unsigned int index)
|
||||
{
|
||||
if (index >= m_drivers.size())
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return m_drivers[index];
|
||||
}
|
||||
|
||||
const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
|
||||
{
|
||||
/* :TODO: */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+9
-17
@@ -16,46 +16,38 @@
|
||||
#define _INCLUDE_DATABASE_MANAGER_H_
|
||||
|
||||
#include <IDBDriver.h>
|
||||
#include <IHandleSys.h>
|
||||
#include "sm_globals.h"
|
||||
#include <sh_vector.h>
|
||||
|
||||
using namespace SourceHook;
|
||||
|
||||
struct db_driver
|
||||
{
|
||||
IDBDriver *driver;
|
||||
IdentityToken_t *ident;
|
||||
HandleType_t htDatabase;
|
||||
HandleType_t htQuery;
|
||||
Handle_t hDriver;
|
||||
};
|
||||
|
||||
class DBManager :
|
||||
public IDBManager,
|
||||
public SMGlobalClass,
|
||||
public IHandleTypeDispatch
|
||||
{
|
||||
public:
|
||||
const char *GetInterfaceName();
|
||||
unsigned int GetInterfaceVersion();
|
||||
public: //SMGlobalClass
|
||||
void OnSourceModAllInitialized();
|
||||
void OnSourceModShutdown();
|
||||
public: //IHandleTypeDispatch
|
||||
void OnHandleDestroy(HandleType_t type, void *object);
|
||||
public: //IDBManager
|
||||
void AddDriver(IDBDriver *pDriver, IdentityToken_t *ident);
|
||||
void AddDriver(IDBDriver *pDrivera);
|
||||
void RemoveDriver(IDBDriver *pDriver);
|
||||
const DatabaseInfo *FindDatabaseConf(const char *name);
|
||||
bool Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent);
|
||||
bool Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength);
|
||||
unsigned int GetDriverCount();
|
||||
IDBDriver *GetDriver(unsigned int index, IdentityToken_t **pToken=NULL);
|
||||
public:
|
||||
db_driver *GetDriverInfo(unsigned int index);
|
||||
IDBDriver *GetDriver(unsigned int index);
|
||||
Handle_t CreateHandle(DBHandleType type, void *ptr, IdentityToken_t *pToken);
|
||||
HandleError ReadHandle(Handle_t hndl, DBHandleType type, void **ptr);
|
||||
HandleError ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token);
|
||||
private:
|
||||
CVector<db_driver *> m_drivers;
|
||||
CVector<IDBDriver *> m_drivers;
|
||||
HandleType_t m_DriverType;
|
||||
HandleType_t m_DatabaseType;
|
||||
HandleType_t m_QueryType;
|
||||
};
|
||||
|
||||
extern DBManager g_DBMan;
|
||||
|
||||
Reference in New Issue
Block a user