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