/** * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod * Copyright (C) 2004-2018 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, version 3.0, as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . * * As a special exception, AlliedModders LLC gives you permission to link the * code of this program (as well as its derivative works) to "Half-Life 2," the * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software * by the Valve Corporation. You must obey the GNU General Public License in * all respects for all other code used. Additionally, AlliedModders LLC grants * this exception to all derivative works. AlliedModders LLC defines further * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), * or . * * Version: $Id$ */ #ifndef _INCLUDE_DATABASE_CONF_BUILDER_H_ #define _INCLUDE_DATABASE_CONF_BUILDER_H_ #include #include #include "common_logic.h" #include #include #include class ConfDbInfo : public ke::RefcountedThreadsafe { public: ConfDbInfo() : realDriver(NULL) { } ke::AString name; ke::AString driver; ke::AString host; ke::AString user; ke::AString pass; ke::AString database; IDBDriver *realDriver; DatabaseInfo info; }; class ConfDbInfoList : public ke::Vector { /* Allow internal usage of ConfDbInfoList */ friend class DBManager; friend class DatabaseConfBuilder; private: ke::AString& GetDefaultDriver() { return m_DefDriver; } ConfDbInfo *GetDatabaseConf(const char *name) { for (size_t i = 0; i < this->length(); i++) { ConfDbInfo *current = this->at(i); /* If we run into the default configuration, then we'll save it * for the next call to GetDefaultConfiguration */ if (strcmp(current->name.chars(), "default") == 0) { m_DefaultConfig = current; } if (strcmp(current->name.chars(), name) == 0) { return current; } } return nullptr; } ConfDbInfo *GetDefaultConfiguration() { return m_DefaultConfig; } void SetDefaultDriver(const char *input) { m_DefDriver = ke::AString(input); } void ReleaseMembers() { for (size_t i = 0; i < this->length(); i++) { ConfDbInfo *current = this->at(i); current->Release(); } } private: ConfDbInfo *m_DefaultConfig; ke::AString m_DefDriver; }; class DatabaseConfBuilder : public ITextListener_SMC { public: DatabaseConfBuilder(); ~DatabaseConfBuilder(); void StartParse(); void SetPath(char* path); ConfDbInfoList *GetConfigList(); public: //ITextListener_SMC void ReadSMC_ParseStart(); SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); SMCResult ReadSMC_LeavingSection(const SMCStates *states); void ReadSMC_ParseEnd(bool halted, bool failed); private: unsigned int m_ParseLevel; unsigned int m_ParseState; ConfDbInfo *m_ParseCurrent; ConfDbInfoList *m_ParseList; private: ke::AString m_Filename; ConfDbInfoList *m_InfoList; }; #endif //_INCLUDE_DATABASE_CONF_BUILDER_H_