dvander@667: /** dvander@667: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1231: * SourceMod ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@667: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. dvander@1231: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@1231: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1231: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . 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@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@1157: void OnSourceModIdentityDropped(IdentityToken_t *pToken); 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@2134: void AddDependency(IExtension *myself, IDBDriver *driver); dvander@868: public: //ITextListener_SMC dvander@868: void ReadSMC_ParseStart(); dvander@1656: SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); dvander@1656: SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); dvander@1656: SMCResult ReadSMC_LeavingSection(const SMCStates *states); 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_