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);
31 m_QueryType = g_HandleSys.CreateType("IQuery", this, 0, NULL, NULL, g_pCoreIdent, NULL);
34 void DBManager::OnHandleDestroy(HandleType_t type, void *object)
36 if (type == m_DriverType)
42 if (g_HandleSys.TypeCheck(type, m_QueryType))
44 IQuery *pQuery = (IQuery *)object;
46 } else if (g_HandleSys.TypeCheck(type, m_DatabaseType)) {
47 IDatabase *pdb = (IDatabase *)object;
52 void DBManager::AddDriver(IDBDriver *pDriver, IdentityToken_t *ident)
59 if (m_drivers.size() >= HANDLESYS_MAX_SUBTYPES)
64 db_driver *driver = new db_driver;
66 driver->driver = pDriver;
67 driver->ident = ident;
71 sec.pIdentity = ident;
72 sec.pOwner = g_pCoreIdent;
73 driver->hDriver = g_HandleSys.CreateHandleEx(m_DriverType, driver, &sec, NULL, NULL);
75 driver->htDatabase = g_HandleSys.CreateType(NULL, this, m_DatabaseType, NULL, NULL, g_pCoreIdent, NULL);
76 driver->htQuery = g_HandleSys.CreateType(NULL, this, m_QueryType, NULL, NULL, g_pCoreIdent, NULL);
78 m_drivers.push_back(driver);
81 void DBManager::RemoveDriver(IDBDriver *pDriver)
83 CVector<db_driver *>::iterator iter;
84 for (iter = m_drivers.begin();
85 iter != m_drivers.end();
88 if ((*iter)->driver == pDriver)
90 db_driver *driver = (*iter);
93 sec.pIdentity = driver->ident;
94 sec.pOwner = g_pCoreIdent;
95 g_HandleSys.RemoveType(driver->htQuery, driver->ident);
96 g_HandleSys.RemoveType(driver->htDatabase, driver->ident);
97 g_HandleSys.FreeHandle(driver->hDriver, &sec);
100 m_drivers.erase(iter);
107 const char *DBManager::GetInterfaceName()
109 return SMINTERFACE_DBI_NAME;
112 unsigned int DBManager::GetInterfaceVersion()
114 return SMINTERFACE_DBI_VERSION;
117 unsigned int DBManager::GetDriverCount()
119 return (unsigned int)m_drivers.size();
122 IDBDriver *DBManager::GetDriver(unsigned int index, IdentityToken_t **pToken)
124 if (index >= GetDriverCount())
131 *pToken = m_drivers[index]->ident;
134 return m_drivers[index]->driver;
137 const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
139 /* :TODO: implement */
143 bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent)
145 const DatabaseInfo *pInfo = FindDatabaseConf(name);
147 unsigned int count = GetDriverCount();
148 for (unsigned int i=0; i<count; i++)
150 IDBDriver *driver = GetDriver(i);
151 if (strcmp(driver->GetIdentifier(), pInfo->driver) == 0)
156 *pdb = driver->PConnect(pInfo);
158 *pdb = driver->Connect(pInfo);