core/Database.h
author Phong Dang <teame06@gmail.com>
Wed Aug 01 07:29:40 2007 +0000 (2007-08-01)
changeset 1241 2e8046793bc9
parent 1231 17badaf66ce4
child 1330 ab94316bb52b
permissions -rw-r--r--
Added check to make sure player are alive to perform sm_slap, sm_burn, sm_slay.
dvander@667
     1
/**
dvander@667
     2
 * vim: set ts=4 :
dvander@1231
     3
 * ================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1231
     6
 * ================================================================
dvander@667
     7
 *
dvander@1231
     8
 * This program is free software; you can redistribute it and/or 
dvander@1231
     9
 * modify it under the terms of the GNU General Public License, 
dvander@1231
    10
 * version 3.0, as published by the Free Software Foundation.
dvander@1231
    11
 * 
dvander@1231
    12
 * This program is distributed in the hope that it will be useful,
dvander@1231
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@1231
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@1231
    15
 * GNU General Public License for more details.
dvander@1231
    16
 *
dvander@1231
    17
 * You should have received a copy of the GNU General Public License
dvander@1231
    18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
dvander@1231
    20
 * As a special exception, AlliedModders LLC gives you permission to 
dvander@1231
    21
 * link the code of this program (as well as its derivative works) to 
dvander@1231
    22
 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
dvander@1231
    23
 * Game MODs that run on software by the Valve Corporation.  You must 
dvander@1231
    24
 * obey the GNU General Public License in all respects for all other 
dvander@1231
    25
 * code used. Additionally, AlliedModders LLC grants this exception 
dvander@1231
    26
 * to all derivative works. AlliedModders LLC defines further 
dvander@1231
    27
 * exceptions, found in LICENSE.txt (as of this writing, version 
dvander@1231
    28
 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
dvander@667
    29
 *
dvander@667
    30
 * Version: $Id$
dvander@667
    31
 */
dvander@667
    32
dvander@666
    33
#ifndef _INCLUDE_DATABASE_MANAGER_H_
dvander@666
    34
#define _INCLUDE_DATABASE_MANAGER_H_
dvander@666
    35
dvander@666
    36
#include <IDBDriver.h>
dvander@666
    37
#include "sm_globals.h"
dvander@666
    38
#include <sh_vector.h>
dvander@868
    39
#include <sh_string.h>
dvander@868
    40
#include <sh_list.h>
dvander@868
    41
#include <ITextParsers.h>
dvander@868
    42
#include "sm_memtable.h"
dvander@1096
    43
#include <IThreader.h>
dvander@1096
    44
#include "sm_simple_prioqueue.h"
dvander@1096
    45
#include "PluginSys.h"
dvander@666
    46
dvander@666
    47
using namespace SourceHook;
dvander@666
    48
dvander@868
    49
struct ConfDbInfo
dvander@868
    50
{
dvander@868
    51
	ConfDbInfo() : name(-1), driver(-1), host(-1), user(-1), pass(-1), 
dvander@868
    52
		database(-1), realDriver(NULL)
dvander@868
    53
	{
dvander@868
    54
	}
dvander@868
    55
	int name;
dvander@868
    56
	int driver;
dvander@868
    57
	int host;
dvander@868
    58
	int user;
dvander@868
    59
	int pass;
dvander@868
    60
	int database;
dvander@868
    61
	IDBDriver *realDriver;
dvander@868
    62
	DatabaseInfo info;
dvander@868
    63
};
dvander@868
    64
dvander@666
    65
class DBManager : 
dvander@666
    66
	public IDBManager,
dvander@666
    67
	public SMGlobalClass,
dvander@868
    68
	public IHandleTypeDispatch,
dvander@1096
    69
	public ITextListener_SMC,
dvander@1096
    70
	public IThread,
dvander@1096
    71
	public IThreadWorkerCallbacks,
dvander@1096
    72
	public IPluginsListener
dvander@666
    73
{
dvander@858
    74
public:
dvander@868
    75
	DBManager();
dvander@868
    76
public:
dvander@666
    77
	const char *GetInterfaceName();
dvander@666
    78
	unsigned int GetInterfaceVersion();
dvander@666
    79
public: //SMGlobalClass
dvander@666
    80
	void OnSourceModAllInitialized();
dvander@868
    81
	void OnSourceModLevelChange(const char *mapName);
dvander@1157
    82
	void OnSourceModIdentityDropped(IdentityToken_t *pToken);
dvander@858
    83
	void OnSourceModShutdown();
dvander@666
    84
public: //IHandleTypeDispatch
dvander@666
    85
	void OnHandleDestroy(HandleType_t type, void *object);
dvander@666
    86
public: //IDBManager
dvander@858
    87
	void AddDriver(IDBDriver *pDrivera);
dvander@666
    88
	void RemoveDriver(IDBDriver *pDriver);
dvander@666
    89
	const DatabaseInfo *FindDatabaseConf(const char *name);
dvander@858
    90
	bool Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength);
dvander@666
    91
	unsigned int GetDriverCount();
dvander@858
    92
	IDBDriver *GetDriver(unsigned int index);
dvander@858
    93
	Handle_t CreateHandle(DBHandleType type, void *ptr, IdentityToken_t *pToken);
dvander@858
    94
	HandleError ReadHandle(Handle_t hndl, DBHandleType type, void **ptr);
dvander@858
    95
	HandleError ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token);
dvander@868
    96
public: //ITextListener_SMC
dvander@868
    97
	void ReadSMC_ParseStart();
dvander@868
    98
	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
dvander@868
    99
	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
dvander@868
   100
	SMCParseResult ReadSMC_LeavingSection();
dvander@868
   101
	void ReadSMC_ParseEnd(bool halted, bool failed);
dvander@1096
   102
public: //IThread
dvander@1096
   103
	void RunThread(IThreadHandle *pThread);
dvander@1096
   104
	void OnTerminate(IThreadHandle *pThread, bool cancel);
dvander@1096
   105
public: //IThreadWorkerCallbacks
dvander@1096
   106
	void OnWorkerStart(IThreadWorker *pWorker);
dvander@1096
   107
	void OnWorkerStop(IThreadWorker *pWorker);
dvander@1096
   108
public: //IPluginsListener
dvander@1096
   109
	void OnPluginUnloaded(IPlugin *plugin);
dvander@868
   110
public:
dvander@868
   111
	ConfDbInfo *GetDatabaseConf(const char *name);
dvander@868
   112
	IDBDriver *FindOrLoadDriver(const char *name);
dvander@868
   113
	IDBDriver *GetDefaultDriver();
dvander@1096
   114
	const char *GetDefaultDriverName();
dvander@1096
   115
	bool AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio);
dvander@1096
   116
	void LockConfig();
dvander@1096
   117
	void UnlockConfig();
dvander@1096
   118
	void RunFrame();
dvander@1096
   119
	inline HandleType_t GetDatabaseType()
dvander@1096
   120
	{
dvander@1096
   121
		return m_DatabaseType;
dvander@1096
   122
	}
dvander@1096
   123
private:
dvander@1096
   124
	void KillWorkerThread();
dvander@666
   125
private:
dvander@858
   126
	CVector<IDBDriver *> m_drivers;
dvander@1096
   127
dvander@1096
   128
	/* Threading stuff */
dvander@1096
   129
	PrioQueue<IDBThreadOperation *> m_OpQueue;
dvander@1096
   130
	Queue<IDBThreadOperation *> m_ThinkQueue;
dvander@1096
   131
	CVector<bool> m_drSafety;			/* which drivers are safe? */
dvander@1096
   132
	IThreadWorker *m_pWorker;			/* Worker thread object */
dvander@1096
   133
	IMutex *m_pConfigLock;				/* Configuration lock */
dvander@1096
   134
	IMutex *m_pQueueLock;				/* Queue safety lock */
dvander@1096
   135
	IMutex *m_pThinkLock;				/* Think-queue lock */
dvander@1096
   136
dvander@868
   137
	List<ConfDbInfo> m_confs;
dvander@666
   138
	HandleType_t m_DriverType;
dvander@666
   139
	HandleType_t m_DatabaseType;
dvander@868
   140
	String m_DefDriver;
dvander@868
   141
	BaseStringTable m_StrTab;
dvander@868
   142
	char m_Filename[PLATFORM_MAX_PATH];
dvander@868
   143
	unsigned int m_ParseLevel;
dvander@868
   144
	unsigned int m_ParseState;
dvander@868
   145
	IDBDriver *m_pDefault;
dvander@666
   146
};
dvander@666
   147
dvander@666
   148
extern DBManager g_DBMan;
dvander@666
   149
dvander@666
   150
#endif //_INCLUDE_DATABASE_MANAGER_H_