posted new IDBDriver API - no natives are implemented yet, MySQL extension coming very shortly
3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
7 * This file is not open source and may not be copied without explicit
8 * written permission of AlliedModders LLC. This file may not be redistributed
9 * in whole or significant part.
10 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
16 #include "HandleSys.h"
17 #include "sourcemod.h"
21 void DBManager::OnSourceModAllInitialized()
25 g_HandleSys.InitAccessDefaults(NULL, &sec);
26 sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY;
27 sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY;
29 m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
30 m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
33 void DBManager::OnSourceModShutdown()
35 g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
36 g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
39 unsigned int DBManager::GetInterfaceVersion()
41 return SMINTERFACE_DBI_VERSION;
44 const char *DBManager::GetInterfaceName()
46 return SMINTERFACE_DBI_NAME;
49 void DBManager::OnHandleDestroy(HandleType_t type, void *object)
51 if (type == m_DriverType)
57 if (g_HandleSys.TypeCheck(type, m_DatabaseType))
59 IDatabase *pdb = (IDatabase *)object;
64 bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength)
66 const DatabaseInfo *pInfo = FindDatabaseConf(name);
68 for (size_t i=0; i<m_drivers.size(); i++)
70 if (strcasecmp(pInfo->driver, m_drivers[i]->GetIdentifier()) == 0)
73 *pdb = m_drivers[i]->Connect(pInfo, persistent, error, maxlength);
74 return (*pdb == NULL);
84 void DBManager::AddDriver(IDBDriver *pDriver)
86 m_drivers.push_back(pDriver);
89 void DBManager::RemoveDriver(IDBDriver *pDriver)
91 for (size_t i=0; i<m_drivers.size(); i++)
93 if (m_drivers[i] == pDriver)
95 m_drivers.erase(m_drivers.iterAt(i));
101 Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken)
103 HandleType_t type = 0;
105 if (dtype == DBHandle_Driver)
108 } else if (dtype == DBHandle_Database) {
109 type = m_DatabaseType;
114 return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
117 HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
119 HandleType_t type = 0;
121 if (dtype == DBHandle_Driver)
124 } else if (dtype == DBHandle_Database) {
125 type = m_DatabaseType;
127 return HandleError_Type;
130 HandleSecurity sec(NULL, g_pCoreIdent);
132 return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
135 HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
137 HandleSecurity sec(token, g_pCoreIdent);
138 return g_HandleSys.FreeHandle(hndl, &sec);
141 unsigned int DBManager::GetDriverCount()
143 return (unsigned int)m_drivers.size();
146 IDBDriver *DBManager::GetDriver(unsigned int index)
148 if (index >= m_drivers.size())
153 return m_drivers[index];
156 const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)