dvander@667: /** dvander@667: * vim: set ts=4 : dvander@667: * =============================================================== dvander@667: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@667: * =============================================================== dvander@667: * dvander@667: * This file is not open source and may not be copied without explicit dvander@667: * written permission of AlliedModders LLC. This file may not be redistributed dvander@667: * in whole or significant part. dvander@667: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@667: * dvander@667: * Version: $Id$ dvander@667: */ dvander@667: dvander@666: #include "Database.h" dvander@666: #include "HandleSys.h" dvander@666: #include "sourcemod.h" dvander@666: dvander@666: DBManager g_DBMan; dvander@666: dvander@666: void DBManager::OnSourceModAllInitialized() dvander@666: { dvander@666: HandleAccess sec; dvander@666: dvander@666: g_HandleSys.InitAccessDefaults(NULL, &sec); dvander@666: sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY; dvander@666: sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY; dvander@666: dvander@666: m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL); dvander@666: m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@666: m_QueryType = g_HandleSys.CreateType("IQuery", this, 0, NULL, NULL, g_pCoreIdent, NULL); dvander@666: } dvander@666: dvander@666: void DBManager::OnHandleDestroy(HandleType_t type, void *object) dvander@666: { dvander@666: if (type == m_DriverType) dvander@666: { dvander@666: /* Ignore */ dvander@666: return; dvander@666: } dvander@666: dvander@666: if (g_HandleSys.TypeCheck(type, m_QueryType)) dvander@666: { dvander@666: IQuery *pQuery = (IQuery *)object; dvander@666: pQuery->Release(); dvander@666: } else if (g_HandleSys.TypeCheck(type, m_DatabaseType)) { dvander@666: IDatabase *pdb = (IDatabase *)object; dvander@666: pdb->Close(); dvander@666: } dvander@666: } dvander@666: dvander@666: void DBManager::AddDriver(IDBDriver *pDriver, IdentityToken_t *ident) dvander@666: { dvander@666: if (!pDriver) dvander@666: { dvander@666: return; dvander@666: } dvander@666: dvander@666: if (m_drivers.size() >= HANDLESYS_MAX_SUBTYPES) dvander@666: { dvander@666: return; dvander@666: } dvander@666: dvander@666: db_driver *driver = new db_driver; dvander@666: dvander@666: driver->driver = pDriver; dvander@666: driver->ident = ident; dvander@666: dvander@666: HandleSecurity sec; dvander@666: dvander@666: sec.pIdentity = ident; dvander@666: sec.pOwner = g_pCoreIdent; dvander@666: driver->hDriver = g_HandleSys.CreateHandleEx(m_DriverType, driver, &sec, NULL, NULL); dvander@666: dvander@666: driver->htDatabase = g_HandleSys.CreateType(NULL, this, m_DatabaseType, NULL, NULL, g_pCoreIdent, NULL); dvander@666: driver->htQuery = g_HandleSys.CreateType(NULL, this, m_QueryType, NULL, NULL, g_pCoreIdent, NULL); dvander@666: dvander@666: m_drivers.push_back(driver); dvander@666: } dvander@666: dvander@666: void DBManager::RemoveDriver(IDBDriver *pDriver) dvander@666: { dvander@666: CVector::iterator iter; dvander@666: for (iter = m_drivers.begin(); dvander@666: iter != m_drivers.end(); dvander@666: iter++) dvander@666: { dvander@666: if ((*iter)->driver == pDriver) dvander@666: { dvander@666: db_driver *driver = (*iter); dvander@666: HandleSecurity sec; dvander@666: dvander@666: sec.pIdentity = driver->ident; dvander@666: sec.pOwner = g_pCoreIdent; dvander@666: g_HandleSys.RemoveType(driver->htQuery, driver->ident); dvander@666: g_HandleSys.RemoveType(driver->htDatabase, driver->ident); dvander@666: g_HandleSys.FreeHandle(driver->hDriver, &sec); dvander@666: dvander@666: delete driver; dvander@666: m_drivers.erase(iter); dvander@666: dvander@666: return; dvander@666: } dvander@666: } dvander@666: } dvander@666: dvander@666: const char *DBManager::GetInterfaceName() dvander@666: { dvander@666: return SMINTERFACE_DBI_NAME; dvander@666: } dvander@666: dvander@666: unsigned int DBManager::GetInterfaceVersion() dvander@666: { dvander@666: return SMINTERFACE_DBI_VERSION; dvander@666: } dvander@666: dvander@666: unsigned int DBManager::GetDriverCount() dvander@666: { dvander@666: return (unsigned int)m_drivers.size(); dvander@666: } dvander@666: dvander@666: IDBDriver *DBManager::GetDriver(unsigned int index, IdentityToken_t **pToken) dvander@666: { dvander@666: if (index >= GetDriverCount()) dvander@666: { dvander@666: return NULL; dvander@666: } dvander@666: dvander@666: if (pToken) dvander@666: { dvander@666: *pToken = m_drivers[index]->ident; dvander@666: } dvander@666: dvander@666: return m_drivers[index]->driver; dvander@666: } dvander@666: dvander@666: const DatabaseInfo *DBManager::FindDatabaseConf(const char *name) dvander@666: { dvander@666: /* :TODO: implement */ dvander@666: return NULL; dvander@666: } dvander@666: dvander@666: bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent) dvander@666: { dvander@666: const DatabaseInfo *pInfo = FindDatabaseConf(name); dvander@666: dvander@666: unsigned int count = GetDriverCount(); dvander@666: for (unsigned int i=0; iGetIdentifier(), pInfo->driver) == 0) dvander@666: { dvander@666: *pdr = driver; dvander@666: if (persistent) dvander@666: { dvander@666: *pdb = driver->PConnect(pInfo); dvander@666: } else { dvander@666: *pdb = driver->Connect(pInfo); dvander@666: } dvander@666: } dvander@666: } dvander@666: dvander@666: *pdr = NULL; dvander@666: *pdb = NULL; dvander@666: dvander@666: return false; dvander@666: }