dvander@667: /** dvander@667: * vim: set ts=4 : dvander@667: * =============================================================== dvander@667: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@667: * =============================================================== dvander@667: * dvander@667: * This file is not open source and may not be copied without explicit dvander@667: * written permission of AlliedModders LLC. This file may not be redistributed dvander@667: * in whole or significant part. dvander@667: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@667: * dvander@667: * Version: $Id$ dvander@667: */ dvander@667: dvander@666: #ifndef _INCLUDE_DATABASE_MANAGER_H_ dvander@666: #define _INCLUDE_DATABASE_MANAGER_H_ dvander@666: dvander@666: #include dvander@666: #include "sm_globals.h" dvander@666: #include dvander@868: #include dvander@868: #include dvander@868: #include dvander@868: #include "sm_memtable.h" dvander@1096: #include dvander@1096: #include "sm_simple_prioqueue.h" dvander@1096: #include "PluginSys.h" dvander@666: dvander@666: using namespace SourceHook; dvander@666: dvander@868: struct ConfDbInfo dvander@868: { dvander@868: ConfDbInfo() : name(-1), driver(-1), host(-1), user(-1), pass(-1), dvander@868: database(-1), realDriver(NULL) dvander@868: { dvander@868: } dvander@868: int name; dvander@868: int driver; dvander@868: int host; dvander@868: int user; dvander@868: int pass; dvander@868: int database; dvander@868: IDBDriver *realDriver; dvander@868: DatabaseInfo info; dvander@868: }; dvander@868: dvander@1096: class IDBThreadOperation dvander@1096: { dvander@1096: public: dvander@1096: virtual IDBDriver *GetDriver() =0; dvander@1096: virtual CPlugin *GetPlugin() =0; dvander@1096: virtual void RunThreadPart() =0; dvander@1096: virtual void RunThinkPart() =0; dvander@1096: virtual void CancelThinkPart() =0; dvander@1096: }; dvander@1096: dvander@666: class DBManager : dvander@666: public IDBManager, dvander@666: public SMGlobalClass, dvander@868: public IHandleTypeDispatch, dvander@1096: public ITextListener_SMC, dvander@1096: public IThread, dvander@1096: public IThreadWorkerCallbacks, dvander@1096: public IPluginsListener dvander@666: { dvander@858: public: dvander@868: DBManager(); dvander@868: public: dvander@666: const char *GetInterfaceName(); dvander@666: unsigned int GetInterfaceVersion(); dvander@666: public: //SMGlobalClass dvander@666: void OnSourceModAllInitialized(); dvander@868: void OnSourceModLevelChange(const char *mapName); dvander@858: void OnSourceModShutdown(); dvander@666: public: //IHandleTypeDispatch dvander@666: void OnHandleDestroy(HandleType_t type, void *object); dvander@666: public: //IDBManager dvander@858: void AddDriver(IDBDriver *pDrivera); dvander@666: void RemoveDriver(IDBDriver *pDriver); dvander@666: const DatabaseInfo *FindDatabaseConf(const char *name); dvander@858: bool Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength); dvander@666: unsigned int GetDriverCount(); dvander@858: IDBDriver *GetDriver(unsigned int index); dvander@858: Handle_t CreateHandle(DBHandleType type, void *ptr, IdentityToken_t *pToken); dvander@858: HandleError ReadHandle(Handle_t hndl, DBHandleType type, void **ptr); dvander@858: HandleError ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token); dvander@868: public: //ITextListener_SMC dvander@868: void ReadSMC_ParseStart(); dvander@868: SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes); dvander@868: SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes); dvander@868: SMCParseResult ReadSMC_LeavingSection(); dvander@868: void ReadSMC_ParseEnd(bool halted, bool failed); dvander@1096: public: //IThread dvander@1096: void RunThread(IThreadHandle *pThread); dvander@1096: void OnTerminate(IThreadHandle *pThread, bool cancel); dvander@1096: public: //IThreadWorkerCallbacks dvander@1096: void OnWorkerStart(IThreadWorker *pWorker); dvander@1096: void OnWorkerStop(IThreadWorker *pWorker); dvander@1096: public: //IPluginsListener dvander@1096: void OnPluginUnloaded(IPlugin *plugin); dvander@868: public: dvander@868: ConfDbInfo *GetDatabaseConf(const char *name); dvander@868: IDBDriver *FindOrLoadDriver(const char *name); dvander@868: IDBDriver *GetDefaultDriver(); dvander@1096: const char *GetDefaultDriverName(); dvander@1096: bool AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio); dvander@1096: void LockConfig(); dvander@1096: void UnlockConfig(); dvander@1096: void RunFrame(); dvander@1096: inline HandleType_t GetDatabaseType() dvander@1096: { dvander@1096: return m_DatabaseType; dvander@1096: } dvander@1096: private: dvander@1096: void KillWorkerThread(); dvander@666: private: dvander@858: CVector m_drivers; dvander@1096: dvander@1096: /* Threading stuff */ dvander@1096: PrioQueue m_OpQueue; dvander@1096: Queue m_ThinkQueue; dvander@1096: CVector m_drSafety; /* which drivers are safe? */ dvander@1096: IThreadWorker *m_pWorker; /* Worker thread object */ dvander@1096: IMutex *m_pConfigLock; /* Configuration lock */ dvander@1096: IMutex *m_pQueueLock; /* Queue safety lock */ dvander@1096: IMutex *m_pThinkLock; /* Think-queue lock */ dvander@1096: dvander@868: List m_confs; dvander@666: HandleType_t m_DriverType; dvander@666: HandleType_t m_DatabaseType; dvander@868: String m_DefDriver; dvander@868: BaseStringTable m_StrTab; dvander@868: char m_Filename[PLATFORM_MAX_PATH]; dvander@868: unsigned int m_ParseLevel; dvander@868: unsigned int m_ParseState; dvander@868: IDBDriver *m_pDefault; dvander@666: }; dvander@666: dvander@666: extern DBManager g_DBMan; dvander@666: dvander@666: #endif //_INCLUDE_DATABASE_MANAGER_H_