3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
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
15 #ifndef _INCLUDE_DATABASE_MANAGER_H_
16 #define _INCLUDE_DATABASE_MANAGER_H_
18 #include <IDBDriver.h>
19 #include "sm_globals.h"
20 #include <sh_vector.h>
21 #include <sh_string.h>
23 #include <ITextParsers.h>
24 #include "sm_memtable.h"
25 #include <IThreader.h>
26 #include "sm_simple_prioqueue.h"
27 #include "PluginSys.h"
29 using namespace SourceHook;
33 ConfDbInfo() : name(-1), driver(-1), host(-1), user(-1), pass(-1),
34 database(-1), realDriver(NULL)
43 IDBDriver *realDriver;
47 class IDBThreadOperation
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;
60 public IHandleTypeDispatch,
61 public ITextListener_SMC,
63 public IThreadWorkerCallbacks,
64 public IPluginsListener
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);
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);
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);
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);
110 inline HandleType_t GetDatabaseType()
112 return m_DatabaseType;
115 void KillWorkerThread();
117 CVector<IDBDriver *> m_drivers;
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 */
128 List<ConfDbInfo> m_confs;
129 HandleType_t m_DriverType;
130 HandleType_t m_DatabaseType;
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;
139 extern DBManager g_DBMan;
141 #endif //_INCLUDE_DATABASE_MANAGER_H_