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"
18 #include "sourcemod.h"
22 void DBManager::OnSourceModAllInitialized()
26 g_HandleSys.InitAccessDefaults(NULL, &sec);
27 sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY;
28 sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY;
30 m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
31 m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
33 g_ShareSys.AddInterface(NULL, this);
36 void DBManager::OnSourceModShutdown()
38 g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
39 g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
42 unsigned int DBManager::GetInterfaceVersion()
44 return SMINTERFACE_DBI_VERSION;
47 const char *DBManager::GetInterfaceName()
49 return SMINTERFACE_DBI_NAME;
52 void DBManager::OnHandleDestroy(HandleType_t type, void *object)
54 if (type == m_DriverType)
60 if (g_HandleSys.TypeCheck(type, m_DatabaseType))
62 IDatabase *pdb = (IDatabase *)object;
67 bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength)
69 const DatabaseInfo *pInfo = FindDatabaseConf(name);
71 for (size_t i=0; i<m_drivers.size(); i++)
73 if (strcasecmp(pInfo->driver, m_drivers[i]->GetIdentifier()) == 0)
76 *pdb = m_drivers[i]->Connect(pInfo, persistent, error, maxlength);
77 return (*pdb == NULL);
87 void DBManager::AddDriver(IDBDriver *pDriver)
89 m_drivers.push_back(pDriver);
92 void DBManager::RemoveDriver(IDBDriver *pDriver)
94 for (size_t i=0; i<m_drivers.size(); i++)
96 if (m_drivers[i] == pDriver)
98 m_drivers.erase(m_drivers.iterAt(i));
104 Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken)
106 HandleType_t type = 0;
108 if (dtype == DBHandle_Driver)
111 } else if (dtype == DBHandle_Database) {
112 type = m_DatabaseType;
117 return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
120 HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
122 HandleType_t type = 0;
124 if (dtype == DBHandle_Driver)
127 } else if (dtype == DBHandle_Database) {
128 type = m_DatabaseType;
130 return HandleError_Type;
133 HandleSecurity sec(NULL, g_pCoreIdent);
135 return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
138 HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
140 HandleSecurity sec(token, g_pCoreIdent);
141 return g_HandleSys.FreeHandle(hndl, &sec);
144 unsigned int DBManager::GetDriverCount()
146 return (unsigned int)m_drivers.size();
149 IDBDriver *DBManager::GetDriver(unsigned int index)
151 if (index >= m_drivers.size())
156 return m_drivers[index];
159 const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)