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