core/Database.h
author David Anderson <dvander@alliedmods.net>
Thu Jul 19 03:22:10 2007 +0000 (2007-07-19)
changeset 1134 68e8b8d386ff
parent 1096 8e11b2ebdc22
child 1157 61c7092246c6
permissions -rw-r--r--
fixed another translator cache issue
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
#ifndef _INCLUDE_DATABASE_MANAGER_H_
dvander@666
    16
#define _INCLUDE_DATABASE_MANAGER_H_
dvander@666
    17
dvander@666
    18
#include <IDBDriver.h>
dvander@666
    19
#include "sm_globals.h"
dvander@666
    20
#include <sh_vector.h>
dvander@868
    21
#include <sh_string.h>
dvander@868
    22
#include <sh_list.h>
dvander@868
    23
#include <ITextParsers.h>
dvander@868
    24
#include "sm_memtable.h"
dvander@1096
    25
#include <IThreader.h>
dvander@1096
    26
#include "sm_simple_prioqueue.h"
dvander@1096
    27
#include "PluginSys.h"
dvander@666
    28
dvander@666
    29
using namespace SourceHook;
dvander@666
    30
dvander@868
    31
struct ConfDbInfo
dvander@868
    32
{
dvander@868
    33
	ConfDbInfo() : name(-1), driver(-1), host(-1), user(-1), pass(-1), 
dvander@868
    34
		database(-1), realDriver(NULL)
dvander@868
    35
	{
dvander@868
    36
	}
dvander@868
    37
	int name;
dvander@868
    38
	int driver;
dvander@868
    39
	int host;
dvander@868
    40
	int user;
dvander@868
    41
	int pass;
dvander@868
    42
	int database;
dvander@868
    43
	IDBDriver *realDriver;
dvander@868
    44
	DatabaseInfo info;
dvander@868
    45
};
dvander@868
    46
dvander@1096
    47
class IDBThreadOperation
dvander@1096
    48
{
dvander@1096
    49
public:
dvander@1096
    50
	virtual IDBDriver *GetDriver() =0;
dvander@1096
    51
	virtual CPlugin *GetPlugin() =0;
dvander@1096
    52
	virtual void RunThreadPart() =0;
dvander@1096
    53
	virtual void RunThinkPart() =0;
dvander@1096
    54
	virtual void CancelThinkPart() =0;
dvander@1096
    55
};
dvander@1096
    56
dvander@666
    57
class DBManager : 
dvander@666
    58
	public IDBManager,
dvander@666
    59
	public SMGlobalClass,
dvander@868
    60
	public IHandleTypeDispatch,
dvander@1096
    61
	public ITextListener_SMC,
dvander@1096
    62
	public IThread,
dvander@1096
    63
	public IThreadWorkerCallbacks,
dvander@1096
    64
	public IPluginsListener
dvander@666
    65
{
dvander@858
    66
public:
dvander@868
    67
	DBManager();
dvander@868
    68
public:
dvander@666
    69
	const char *GetInterfaceName();
dvander@666
    70
	unsigned int GetInterfaceVersion();
dvander@666
    71
public: //SMGlobalClass
dvander@666
    72
	void OnSourceModAllInitialized();
dvander@868
    73
	void OnSourceModLevelChange(const char *mapName);
dvander@858
    74
	void OnSourceModShutdown();
dvander@666
    75
public: //IHandleTypeDispatch
dvander@666
    76
	void OnHandleDestroy(HandleType_t type, void *object);
dvander@666
    77
public: //IDBManager
dvander@858
    78
	void AddDriver(IDBDriver *pDrivera);
dvander@666
    79
	void RemoveDriver(IDBDriver *pDriver);
dvander@666
    80
	const DatabaseInfo *FindDatabaseConf(const char *name);
dvander@858
    81
	bool Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength);
dvander@666
    82
	unsigned int GetDriverCount();
dvander@858
    83
	IDBDriver *GetDriver(unsigned int index);
dvander@858
    84
	Handle_t CreateHandle(DBHandleType type, void *ptr, IdentityToken_t *pToken);
dvander@858
    85
	HandleError ReadHandle(Handle_t hndl, DBHandleType type, void **ptr);
dvander@858
    86
	HandleError ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token);
dvander@868
    87
public: //ITextListener_SMC
dvander@868
    88
	void ReadSMC_ParseStart();
dvander@868
    89
	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
dvander@868
    90
	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
dvander@868
    91
	SMCParseResult ReadSMC_LeavingSection();
dvander@868
    92
	void ReadSMC_ParseEnd(bool halted, bool failed);
dvander@1096
    93
public: //IThread
dvander@1096
    94
	void RunThread(IThreadHandle *pThread);
dvander@1096
    95
	void OnTerminate(IThreadHandle *pThread, bool cancel);
dvander@1096
    96
public: //IThreadWorkerCallbacks
dvander@1096
    97
	void OnWorkerStart(IThreadWorker *pWorker);
dvander@1096
    98
	void OnWorkerStop(IThreadWorker *pWorker);
dvander@1096
    99
public: //IPluginsListener
dvander@1096
   100
	void OnPluginUnloaded(IPlugin *plugin);
dvander@868
   101
public:
dvander@868
   102
	ConfDbInfo *GetDatabaseConf(const char *name);
dvander@868
   103
	IDBDriver *FindOrLoadDriver(const char *name);
dvander@868
   104
	IDBDriver *GetDefaultDriver();
dvander@1096
   105
	const char *GetDefaultDriverName();
dvander@1096
   106
	bool AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio);
dvander@1096
   107
	void LockConfig();
dvander@1096
   108
	void UnlockConfig();
dvander@1096
   109
	void RunFrame();
dvander@1096
   110
	inline HandleType_t GetDatabaseType()
dvander@1096
   111
	{
dvander@1096
   112
		return m_DatabaseType;
dvander@1096
   113
	}
dvander@1096
   114
private:
dvander@1096
   115
	void KillWorkerThread();
dvander@666
   116
private:
dvander@858
   117
	CVector<IDBDriver *> m_drivers;
dvander@1096
   118
dvander@1096
   119
	/* Threading stuff */
dvander@1096
   120
	PrioQueue<IDBThreadOperation *> m_OpQueue;
dvander@1096
   121
	Queue<IDBThreadOperation *> m_ThinkQueue;
dvander@1096
   122
	CVector<bool> m_drSafety;			/* which drivers are safe? */
dvander@1096
   123
	IThreadWorker *m_pWorker;			/* Worker thread object */
dvander@1096
   124
	IMutex *m_pConfigLock;				/* Configuration lock */
dvander@1096
   125
	IMutex *m_pQueueLock;				/* Queue safety lock */
dvander@1096
   126
	IMutex *m_pThinkLock;				/* Think-queue lock */
dvander@1096
   127
dvander@868
   128
	List<ConfDbInfo> m_confs;
dvander@666
   129
	HandleType_t m_DriverType;
dvander@666
   130
	HandleType_t m_DatabaseType;
dvander@868
   131
	String m_DefDriver;
dvander@868
   132
	BaseStringTable m_StrTab;
dvander@868
   133
	char m_Filename[PLATFORM_MAX_PATH];
dvander@868
   134
	unsigned int m_ParseLevel;
dvander@868
   135
	unsigned int m_ParseState;
dvander@868
   136
	IDBDriver *m_pDefault;
dvander@666
   137
};
dvander@666
   138
dvander@666
   139
extern DBManager g_DBMan;
dvander@666
   140
dvander@666
   141
#endif //_INCLUDE_DATABASE_MANAGER_H_