core/Database.cpp
author David Anderson <dvander@alliedmods.net>
Wed May 30 03:25:18 2007 +0000 (2007-05-30)
changeset 862 b8636f596080
parent 858 b783a611f604
child 868 bdbf922e246f
permissions -rw-r--r--
added new (somewhat experimental) mysql extension and finalized the API
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@862
    17
#include "ShareSys.h"
dvander@666
    18
#include "sourcemod.h"
dvander@666
    19
dvander@666
    20
DBManager g_DBMan;
dvander@666
    21
dvander@666
    22
void DBManager::OnSourceModAllInitialized()
dvander@666
    23
{
dvander@666
    24
	HandleAccess sec;
dvander@666
    25
dvander@666
    26
	g_HandleSys.InitAccessDefaults(NULL, &sec);
dvander@666
    27
	sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY;
dvander@666
    28
	sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY;
dvander@666
    29
	
dvander@666
    30
	m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
dvander@666
    31
	m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@862
    32
dvander@862
    33
	g_ShareSys.AddInterface(NULL, this);
dvander@858
    34
}
dvander@858
    35
dvander@858
    36
void DBManager::OnSourceModShutdown()
dvander@858
    37
{
dvander@858
    38
	g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
dvander@858
    39
	g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
dvander@858
    40
}
dvander@858
    41
dvander@858
    42
unsigned int DBManager::GetInterfaceVersion()
dvander@858
    43
{
dvander@858
    44
	return SMINTERFACE_DBI_VERSION;
dvander@858
    45
}
dvander@858
    46
dvander@858
    47
const char *DBManager::GetInterfaceName()
dvander@858
    48
{
dvander@858
    49
	return SMINTERFACE_DBI_NAME;
dvander@666
    50
}
dvander@666
    51
dvander@666
    52
void DBManager::OnHandleDestroy(HandleType_t type, void *object)
dvander@666
    53
{
dvander@666
    54
	if (type == m_DriverType)
dvander@666
    55
	{
dvander@666
    56
		/* Ignore */
dvander@666
    57
		return;
dvander@666
    58
	}
dvander@666
    59
dvander@858
    60
	if (g_HandleSys.TypeCheck(type, m_DatabaseType))
dvander@666
    61
	{
dvander@666
    62
		IDatabase *pdb = (IDatabase *)object;
dvander@666
    63
		pdb->Close();
dvander@666
    64
	}
dvander@666
    65
}
dvander@666
    66
dvander@858
    67
bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength)
dvander@666
    68
{
dvander@666
    69
	const DatabaseInfo *pInfo = FindDatabaseConf(name);
dvander@666
    70
dvander@858
    71
	for (size_t i=0; i<m_drivers.size(); i++)
dvander@666
    72
	{
dvander@858
    73
		if (strcasecmp(pInfo->driver, m_drivers[i]->GetIdentifier()) == 0)
dvander@666
    74
		{
dvander@858
    75
			*pdr = m_drivers[i];
dvander@858
    76
			*pdb = m_drivers[i]->Connect(pInfo, persistent, error, maxlength);
dvander@858
    77
			return (*pdb == NULL);
dvander@666
    78
		}
dvander@666
    79
	}
dvander@666
    80
dvander@666
    81
	*pdr = NULL;
dvander@666
    82
	*pdb = NULL;
dvander@666
    83
dvander@666
    84
	return false;
dvander@666
    85
}
dvander@858
    86
dvander@858
    87
void DBManager::AddDriver(IDBDriver *pDriver)
dvander@858
    88
{
dvander@858
    89
	 m_drivers.push_back(pDriver);
dvander@858
    90
}
dvander@858
    91
dvander@858
    92
void DBManager::RemoveDriver(IDBDriver *pDriver)
dvander@858
    93
{
dvander@858
    94
	for (size_t i=0; i<m_drivers.size(); i++)
dvander@858
    95
	{
dvander@858
    96
		if (m_drivers[i] == pDriver)
dvander@858
    97
		{
dvander@858
    98
			m_drivers.erase(m_drivers.iterAt(i));
dvander@858
    99
			return;
dvander@858
   100
		}
dvander@858
   101
	}
dvander@858
   102
}
dvander@858
   103
dvander@858
   104
Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken)
dvander@858
   105
{
dvander@858
   106
	HandleType_t type = 0;
dvander@858
   107
dvander@858
   108
	if (dtype == DBHandle_Driver)
dvander@858
   109
	{
dvander@858
   110
		type = m_DriverType;
dvander@858
   111
	} else if (dtype == DBHandle_Database) {
dvander@858
   112
		type = m_DatabaseType;
dvander@858
   113
	} else {
dvander@858
   114
		return BAD_HANDLE;
dvander@858
   115
	}
dvander@858
   116
dvander@858
   117
	return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
dvander@858
   118
}
dvander@858
   119
dvander@858
   120
HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
dvander@858
   121
{
dvander@858
   122
	HandleType_t type = 0;
dvander@858
   123
dvander@858
   124
	if (dtype == DBHandle_Driver)
dvander@858
   125
	{
dvander@858
   126
		type = m_DriverType;
dvander@858
   127
	} else if (dtype == DBHandle_Database) {
dvander@858
   128
		type = m_DatabaseType;
dvander@858
   129
	} else {
dvander@858
   130
		return HandleError_Type;
dvander@858
   131
	}
dvander@858
   132
dvander@858
   133
	HandleSecurity sec(NULL, g_pCoreIdent);
dvander@858
   134
dvander@858
   135
	return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
dvander@858
   136
}
dvander@858
   137
dvander@858
   138
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
dvander@858
   139
{
dvander@858
   140
	HandleSecurity sec(token, g_pCoreIdent);
dvander@858
   141
	return g_HandleSys.FreeHandle(hndl, &sec);
dvander@858
   142
}
dvander@858
   143
dvander@858
   144
unsigned int DBManager::GetDriverCount()
dvander@858
   145
{
dvander@858
   146
	return (unsigned int)m_drivers.size();
dvander@858
   147
}
dvander@858
   148
dvander@858
   149
IDBDriver *DBManager::GetDriver(unsigned int index)
dvander@858
   150
{
dvander@858
   151
	if (index >= m_drivers.size())
dvander@858
   152
	{
dvander@858
   153
		return NULL;
dvander@858
   154
	}
dvander@858
   155
dvander@858
   156
	return m_drivers[index];
dvander@858
   157
}
dvander@858
   158
dvander@858
   159
const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
dvander@858
   160
{
dvander@858
   161
	/* :TODO: */
dvander@858
   162
	return NULL;
dvander@858
   163
}