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