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