dvander@667: /**
dvander@667: * vim: set ts=4 :
ds@1330: * =============================================================================
dvander@1231: * SourceMod
dvander@1231: * Copyright (C) 2004-2007 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@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_