core/Database.cpp
author David Anderson <dvander@alliedmods.net>
Thu Apr 05 07:09:17 2007 +0000 (2007-04-05)
changeset 667 0347227ef615
parent 666 c01aae04c0ff
child 858 b783a611f604
permissions -rw-r--r--
added file headers
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     5  * ===============================================================
     6  *
     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
    11  *
    12  * Version: $Id$
    13  */
    14 
    15 #include "Database.h"
    16 #include "HandleSys.h"
    17 #include "sourcemod.h"
    18 
    19 DBManager g_DBMan;
    20 
    21 void DBManager::OnSourceModAllInitialized()
    22 {
    23 	HandleAccess sec;
    24 
    25 	g_HandleSys.InitAccessDefaults(NULL, &sec);
    26 	sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY;
    27 	sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY;
    28 	
    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);
    32 }
    33 
    34 void DBManager::OnHandleDestroy(HandleType_t type, void *object)
    35 {
    36 	if (type == m_DriverType)
    37 	{
    38 		/* Ignore */
    39 		return;
    40 	}
    41 
    42 	if (g_HandleSys.TypeCheck(type, m_QueryType))
    43 	{
    44 		IQuery *pQuery = (IQuery *)object;
    45 		pQuery->Release();
    46 	} else if (g_HandleSys.TypeCheck(type, m_DatabaseType)) {
    47 		IDatabase *pdb = (IDatabase *)object;
    48 		pdb->Close();
    49 	}
    50 }
    51 
    52 void DBManager::AddDriver(IDBDriver *pDriver, IdentityToken_t *ident)
    53 {
    54 	if (!pDriver)
    55 	{
    56 		return;
    57 	}
    58 
    59 	if (m_drivers.size() >= HANDLESYS_MAX_SUBTYPES)
    60 	{
    61 		return;
    62 	}
    63 
    64 	db_driver *driver = new db_driver;
    65 
    66 	driver->driver = pDriver;
    67 	driver->ident = ident;
    68 
    69 	HandleSecurity sec;
    70 
    71 	sec.pIdentity = ident;
    72 	sec.pOwner = g_pCoreIdent;
    73 	driver->hDriver = g_HandleSys.CreateHandleEx(m_DriverType, driver, &sec, NULL, NULL);
    74 
    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);
    77 	
    78 	m_drivers.push_back(driver);
    79 }
    80 
    81 void DBManager::RemoveDriver(IDBDriver *pDriver)
    82 {
    83 	CVector<db_driver *>::iterator iter;
    84 	for (iter = m_drivers.begin();
    85 		 iter != m_drivers.end();
    86 		 iter++)
    87 	{
    88 		if ((*iter)->driver == pDriver)
    89 		{
    90 			db_driver *driver = (*iter);
    91 			HandleSecurity sec;
    92 
    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);
    98 
    99 			delete driver;
   100 			m_drivers.erase(iter);
   101 
   102 			return;
   103 		}
   104 	}
   105 }
   106 
   107 const char *DBManager::GetInterfaceName()
   108 {
   109 	return SMINTERFACE_DBI_NAME;
   110 }
   111 
   112 unsigned int DBManager::GetInterfaceVersion()
   113 {
   114 	return SMINTERFACE_DBI_VERSION;
   115 }
   116 
   117 unsigned int DBManager::GetDriverCount()
   118 {
   119 	return (unsigned int)m_drivers.size();
   120 }
   121 
   122 IDBDriver *DBManager::GetDriver(unsigned int index, IdentityToken_t **pToken)
   123 {
   124 	if (index >= GetDriverCount())
   125 	{
   126 		return NULL;
   127 	}
   128 
   129 	if (pToken)
   130 	{
   131 		*pToken = m_drivers[index]->ident;
   132 	}
   133 
   134 	return m_drivers[index]->driver;
   135 }
   136 
   137 const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
   138 {
   139 	/* :TODO: implement */
   140 	return NULL;
   141 }
   142 
   143 bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent)
   144 {
   145 	const DatabaseInfo *pInfo = FindDatabaseConf(name);
   146 
   147 	unsigned int count = GetDriverCount();
   148 	for (unsigned int i=0; i<count; i++)
   149 	{
   150 		IDBDriver *driver = GetDriver(i);
   151 		if (strcmp(driver->GetIdentifier(), pInfo->driver) == 0)
   152 		{
   153 			*pdr = driver;
   154 			if (persistent)
   155 			{
   156 				*pdb = driver->PConnect(pInfo);
   157 			} else {
   158 				*pdb = driver->Connect(pInfo);
   159 			}
   160 		}
   161 	}
   162 
   163 	*pdr = NULL;
   164 	*pdb = NULL;
   165 
   166 	return false;
   167 }