Move DBManager and DB natives from core to logic (bug 5953, r=fyren).

--HG--
rename : core/Database.cpp => core/logic/Database.cpp
rename : core/Database.h => core/logic/Database.h
rename : core/sm_simple_prioqueue.h => core/logic/sm_simple_prioqueue.h
rename : core/smn_database.cpp => core/logic/smn_database.cpp
rename : core/sm_queue.h => public/sm_queue.h
This commit is contained in:
Nicholas Hastings 2013-10-09 08:43:08 -04:00
parent 9027d15211
commit 1d1b5d1c6d
10 changed files with 77 additions and 61 deletions

View File

@ -86,13 +86,11 @@ for i in SM.sdkInfo:
'smn_halflife.cpp', 'smn_halflife.cpp',
'smn_console.cpp', 'smn_console.cpp',
'UserMessages.cpp', 'UserMessages.cpp',
'Database.cpp',
'MenuManager.cpp', 'MenuManager.cpp',
'smn_core.cpp', 'smn_core.cpp',
'smn_hudtext.cpp', 'smn_hudtext.cpp',
'smn_usermsgs.cpp', 'smn_usermsgs.cpp',
'MenuStyle_Base.cpp', 'MenuStyle_Base.cpp',
'smn_database.cpp',
'smn_keyvalues.cpp', 'smn_keyvalues.cpp',
'smn_vector.cpp', 'smn_vector.cpp',
'EventManager.cpp', 'EventManager.cpp',

View File

@ -30,7 +30,6 @@
*/ */
#include "frame_hooks.h" #include "frame_hooks.h"
#include "TimerSys.h" #include "TimerSys.h"
#include "Database.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include "MenuStyle_Valve.h" #include "MenuStyle_Valve.h"
#include "MenuStyle_Radio.h" #include "MenuStyle_Radio.h"
@ -96,7 +95,6 @@ void RunFrameHooks(bool simulating)
} }
/* Frame based hooks */ /* Frame based hooks */
g_DBMan.RunFrame();
g_HL2.ProcessFakeCliCmdQueue(); g_HL2.ProcessFakeCliCmdQueue();
g_HL2.ProcessDelayedKicks(); g_HL2.ProcessDelayedKicks();

View File

@ -60,7 +60,9 @@ files = [
'NativeOwner.cpp', 'NativeOwner.cpp',
'NativeInvoker.cpp', 'NativeInvoker.cpp',
'ExtensionSys.cpp', 'ExtensionSys.cpp',
'DebugReporter.cpp' 'DebugReporter.cpp',
'Database.cpp',
'smn_database.cpp',
] ]
if AMBuild.target['platform'] == 'windows': if AMBuild.target['platform'] == 'windows':
files.append('thread/WinThreads.cpp') files.append('thread/WinThreads.cpp')

View File

@ -30,12 +30,12 @@
*/ */
#include "Database.h" #include "Database.h"
#include "sourcemod.h" #include "ISourceMod.h"
#include "sm_stringutil.h" #include "HandleSys.h"
#include "Logger.h" #include "ExtensionSys.h"
#include "PluginSys.h"
#include <stdlib.h> #include <stdlib.h>
#include <IThreader.h> #include <IThreader.h>
#include "logic_bridge.h"
#define DBPARSE_LEVEL_NONE 0 #define DBPARSE_LEVEL_NONE 0
#define DBPARSE_LEVEL_MAIN 1 #define DBPARSE_LEVEL_MAIN 1
@ -52,22 +52,29 @@ DBManager::DBManager()
{ {
} }
static void FrameHook(bool simulating)
{
g_DBMan.RunFrame();
}
void DBManager::OnSourceModAllInitialized() void DBManager::OnSourceModAllInitialized()
{ {
HandleAccess sec; HandleAccess sec;
handlesys->InitAccessDefaults(NULL, &sec); g_HandleSys.InitAccessDefaults(NULL, &sec);
sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY; sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY;
sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY; sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY;
m_DriverType = handlesys->CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL); m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
m_DatabaseType = handlesys->CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL); m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
sharesys->AddInterface(NULL, this); g_ShareSys.AddInterface(NULL, this);
g_SourceMod.BuildPath(Path_SM, m_Filename, sizeof(m_Filename), "configs/databases.cfg"); g_pSM->BuildPath(Path_SM, m_Filename, sizeof(m_Filename), "configs/databases.cfg");
scripts->AddPluginsListener(this); g_PluginSys.AddPluginsListener(this);
g_pSM->AddGameFrameHook(&FrameHook);
} }
void DBManager::OnSourceModLevelChange(const char *mapName) void DBManager::OnSourceModLevelChange(const char *mapName)
@ -82,21 +89,22 @@ void DBManager::OnSourceModLevelChange(const char *mapName)
ke::AutoLock lock(&m_ConfigLock); ke::AutoLock lock(&m_ConfigLock);
if ((err = textparsers->ParseFile_SMC(m_Filename, this, &states)) != SMCError_Okay) if ((err = textparsers->ParseFile_SMC(m_Filename, this, &states)) != SMCError_Okay)
{ {
g_Logger.LogError("[SM] Detected parse error(s) in file \"%s\"", m_Filename); smcore.LogError("[SM] Detected parse error(s) in file \"%s\"", m_Filename);
if (err != SMCError_Custom) if (err != SMCError_Custom)
{ {
const char *txt = textparsers->GetSMCErrorString(err); const char *txt = textparsers->GetSMCErrorString(err);
g_Logger.LogError("[SM] Line %d: %s", states.line, txt); smcore.LogError("[SM] Line %d: %s", states.line, txt);
} }
} }
} }
void DBManager::OnSourceModShutdown() void DBManager::OnSourceModShutdown()
{ {
g_pSM->RemoveGameFrameHook(&FrameHook);
KillWorkerThread(); KillWorkerThread();
scripts->RemovePluginsListener(this); g_PluginSys.RemovePluginsListener(this);
handlesys->RemoveType(m_DatabaseType, g_pCoreIdent); g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
handlesys->RemoveType(m_DriverType, g_pCoreIdent); g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
ClearConfigs(); ClearConfigs();
} }
@ -118,7 +126,7 @@ void DBManager::OnHandleDestroy(HandleType_t type, void *object)
return; return;
} }
if (handlesys->TypeCheck(type, m_DatabaseType)) if (g_HandleSys.TypeCheck(type, m_DatabaseType))
{ {
IDatabase *pdb = (IDatabase *)object; IDatabase *pdb = (IDatabase *)object;
pdb->Close(); pdb->Close();
@ -263,7 +271,7 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
*pdr = NULL; *pdr = NULL;
} }
*pdb = NULL; *pdb = NULL;
UTIL_Format(error, maxlength, "Configuration \"%s\" not found", name); g_pSM->Format(error, maxlength, "Configuration \"%s\" not found", name);
return false; return false;
} }
@ -300,7 +308,7 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
} }
*pdb = NULL; *pdb = NULL;
UTIL_Format(error, maxlength, "Driver \"%s\" not found", dname); g_pSM->Format(error, maxlength, "Driver \"%s\" not found", dname);
return false; return false;
} }
@ -395,7 +403,7 @@ Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t
return BAD_HANDLE; return BAD_HANDLE;
} }
return handlesys->CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL); return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
} }
HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr) HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
@ -413,13 +421,13 @@ HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
HandleSecurity sec(NULL, g_pCoreIdent); HandleSecurity sec(NULL, g_pCoreIdent);
return handlesys->ReadHandle(hndl, type, &sec, ptr); return g_HandleSys.ReadHandle(hndl, type, &sec, ptr);
} }
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token) HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
{ {
HandleSecurity sec(token, g_pCoreIdent); HandleSecurity sec(token, g_pCoreIdent);
return handlesys->FreeHandle(hndl, &sec); return g_HandleSys.FreeHandle(hndl, &sec);
} }
unsigned int DBManager::GetDriverCount() unsigned int DBManager::GetDriverCount()
@ -476,9 +484,9 @@ IDBDriver *DBManager::FindOrLoadDriver(const char *name)
} }
char filename[PLATFORM_MAX_PATH]; char filename[PLATFORM_MAX_PATH];
UTIL_Format(filename, sizeof(filename), "dbi.%s.ext", name); g_pSM->Format(filename, sizeof(filename), "dbi.%s.ext", name);
IExtension *pExt = extsys->LoadAutoExtension(filename); IExtension *pExt = g_Extensions.LoadAutoExtension(filename);
if (!pExt || !pExt->IsLoaded() || m_drivers.size() <= last_size) if (!pExt || !pExt->IsLoaded() || m_drivers.size() <= last_size)
{ {
return NULL; return NULL;
@ -527,7 +535,7 @@ bool DBManager::AddToThreadQueue(IDBThreadOperation *op, PrioQueueLevel prio)
{ {
if (!s_OneTimeThreaderErrorMsg) if (!s_OneTimeThreaderErrorMsg)
{ {
g_Logger.LogError("[SM] Unable to create db threader (error unknown)"); smcore.LogError("[SM] Unable to create db threader (error unknown)");
s_OneTimeThreaderErrorMsg = true; s_OneTimeThreaderErrorMsg = true;
} }
m_Worker = NULL; m_Worker = NULL;
@ -720,6 +728,6 @@ const char *DBManager::GetDefaultDriverName()
void DBManager::AddDependency(IExtension *myself, IDBDriver *driver) void DBManager::AddDependency(IExtension *myself, IDBDriver *driver)
{ {
extsys->AddRawDependency(myself, driver->GetIdentity(), driver); g_Extensions.AddRawDependency(myself, driver->GetIdentity(), driver);
} }

View File

@ -33,7 +33,7 @@
#define _INCLUDE_DATABASE_MANAGER_H_ #define _INCLUDE_DATABASE_MANAGER_H_
#include <IDBDriver.h> #include <IDBDriver.h>
#include "sm_globals.h" #include "common_logic.h"
#include <sh_vector.h> #include <sh_vector.h>
#include <sh_string.h> #include <sh_string.h>
#include <sh_list.h> #include <sh_list.h>

View File

@ -36,6 +36,7 @@
#include <IHandleSys.h> #include <IHandleSys.h>
#include <IShareSys.h> #include <IShareSys.h>
#include <IPluginSys.h> #include <IPluginSys.h>
#include <IDBDriver.h>
#include <sh_string.h> #include <sh_string.h>
#include <sp_vm_api.h> #include <sp_vm_api.h>
#include <sh_vector.h> #include <sh_vector.h>
@ -97,6 +98,7 @@ namespace SourceMod
class IVEngineServer; class IVEngineServer;
class IFileSystem; class IFileSystem;
class ConVar; class ConVar;
class KeyValues;
class SMGlobalClass; class SMGlobalClass;
namespace SourceMod namespace SourceMod
@ -264,6 +266,7 @@ struct sm_core_t
void (*DoGlobalPluginLoads)(); void (*DoGlobalPluginLoads)();
bool (*AreConfigsExecuted)(); bool (*AreConfigsExecuted)();
void (*ExecuteConfigs)(IPluginContext *ctx); void (*ExecuteConfigs)(IPluginContext *ctx);
DatabaseInfo (*GetDBInfoFromKeyValues)(KeyValues *);
const char *gamesuffix; const char *gamesuffix;
/* Data */ /* Data */
ServerGlobals *serverGlobals; ServerGlobals *serverGlobals;

View File

@ -29,12 +29,11 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "sm_globals.h" #include "common_logic.h"
#include "Database.h" #include "Database.h"
#include "sm_stringutil.h" #include "ExtensionSys.h"
#include "logic_bridge.h" #include "stringutil.h"
#include "KeyValues.h" #include "ISourceMod.h"
#include "sourcemod.h"
HandleType_t hStmtType; HandleType_t hStmtType;
@ -202,7 +201,7 @@ public:
m_pQuery = m_pDatabase->DoQuery(m_Query.c_str()); m_pQuery = m_pDatabase->DoQuery(m_Query.c_str());
if (!m_pQuery) if (!m_pQuery)
{ {
UTIL_Format(error, sizeof(error), "%s", m_pDatabase->GetError()); g_pSM->Format(error, sizeof(error), "%s", m_pDatabase->GetError());
} }
m_pDatabase->UnlockFromFullAtomicOperation(); m_pDatabase->UnlockFromFullAtomicOperation();
} }
@ -235,7 +234,7 @@ public:
{ {
m_pQuery = NULL; m_pQuery = NULL;
} else { } else {
UTIL_Format(error, sizeof(error), "Could not alloc handle"); g_pSM->Format(error, sizeof(error), "Could not alloc handle");
delete c; delete c;
} }
} }
@ -293,7 +292,7 @@ public:
const DatabaseInfo *pInfo = g_DBMan.FindDatabaseConf(dbname); const DatabaseInfo *pInfo = g_DBMan.FindDatabaseConf(dbname);
if (!pInfo) if (!pInfo)
{ {
UTIL_Format(error, sizeof(error), "Could not find database config \"%s\"", dbname); g_pSM->Format(error, sizeof(error), "Could not find database config \"%s\"", dbname);
} else { } else {
m_pDatabase = m_pDriver->Connect(pInfo, false, error, sizeof(error)); m_pDatabase = m_pDriver->Connect(pInfo, false, error, sizeof(error));
} }
@ -321,7 +320,7 @@ public:
== BAD_HANDLE) == BAD_HANDLE)
{ {
m_pDatabase->Close(); m_pDatabase->Close();
UTIL_Format(error, sizeof(error), "Unable to allocate Handle"); g_pSM->Format(error, sizeof(error), "Unable to allocate Handle");
} }
} }
@ -369,10 +368,10 @@ static cell_t SQL_Connect(IPluginContext *pContext, const cell_t *params)
} }
/* HACK! Add us to the dependency list */ /* HACK! Add us to the dependency list */
IExtension *pExt = extsys->GetExtensionFromIdent(driver->GetIdentity()); IExtension *pExt = g_Extensions.GetExtensionFromIdent(driver->GetIdentity());
if (pExt) if (pExt)
{ {
extsys->BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext())); g_Extensions.BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext()));
} }
return hndl; return hndl;
@ -402,18 +401,18 @@ static cell_t SQL_TConnect(IPluginContext *pContext, const cell_t *params)
} }
if (!driver) if (!driver)
{ {
UTIL_Format(error, g_pSM->Format(error,
sizeof(error), sizeof(error),
"Could not find driver \"%s\"", "Could not find driver \"%s\"",
pInfo->driver[0] == '\0' ? g_DBMan.GetDefaultDriverName() : pInfo->driver); pInfo->driver[0] == '\0' ? g_DBMan.GetDefaultDriverName() : pInfo->driver);
} else if (!driver->IsThreadSafe()) { } else if (!driver->IsThreadSafe()) {
UTIL_Format(error, g_pSM->Format(error,
sizeof(error), sizeof(error),
"Driver \"%s\" is not thread safe!", "Driver \"%s\" is not thread safe!",
driver->GetIdentifier()); driver->GetIdentifier());
} }
} else { } else {
UTIL_Format(error, sizeof(error), "Could not find database conf \"%s\"", conf); g_pSM->Format(error, sizeof(error), "Could not find database conf \"%s\"", conf);
} }
if (!pInfo || !driver) if (!pInfo || !driver)
@ -427,10 +426,10 @@ static cell_t SQL_TConnect(IPluginContext *pContext, const cell_t *params)
} }
/* HACK! Add us to the dependency list */ /* HACK! Add us to the dependency list */
IExtension *pExt = extsys->GetExtensionFromIdent(driver->GetIdentity()); IExtension *pExt = g_Extensions.GetExtensionFromIdent(driver->GetIdentity());
if (pExt) if (pExt)
{ {
extsys->BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext())); g_Extensions.BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext()));
} }
/* Finally, add to the thread if we can */ /* Finally, add to the thread if we can */
@ -498,10 +497,10 @@ static cell_t SQL_ConnectEx(IPluginContext *pContext, const cell_t *params)
} }
/* HACK! Add us to the dependency list */ /* HACK! Add us to the dependency list */
IExtension *pExt = extsys->GetExtensionFromIdent(driver->GetIdentity()); IExtension *pExt = g_Extensions.GetExtensionFromIdent(driver->GetIdentity());
if (pExt) if (pExt)
{ {
extsys->BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext())); g_Extensions.BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext()));
} }
return hndl; return hndl;
@ -1342,7 +1341,7 @@ static cell_t SQL_ConnectCustom(IPluginContext *pContext, const cell_t *params)
KeyValues *kv; KeyValues *kv;
HandleError err; HandleError err;
kv = g_SourceMod.ReadKeyValuesHandle(params[1], &err, false); kv = g_pSM->ReadKeyValuesHandle(params[1], &err, false);
if (kv == NULL) if (kv == NULL)
{ {
return pContext->ThrowNativeError("Invalid KeyValues handle %x (error: %d)", return pContext->ThrowNativeError("Invalid KeyValues handle %x (error: %d)",
@ -1350,14 +1349,7 @@ static cell_t SQL_ConnectCustom(IPluginContext *pContext, const cell_t *params)
err); err);
} }
DatabaseInfo info; DatabaseInfo info = smcore.GetDBInfoFromKeyValues(kv);
info.database = kv->GetString("database", "");
info.driver = kv->GetString("driver", "default");
info.host = kv->GetString("host", "");
info.maxTimeout = kv->GetInt("timeout", 0);
info.pass = kv->GetString("pass", "");
info.port = kv->GetInt("port", 0);
info.user = kv->GetString("user", "");
IDBDriver *driver; IDBDriver *driver;
if (info.driver[0] == '\0' || strcmp(info.driver, "default") == 0) if (info.driver[0] == '\0' || strcmp(info.driver, "default") == 0)
@ -1373,7 +1365,7 @@ static cell_t SQL_ConnectCustom(IPluginContext *pContext, const cell_t *params)
{ {
char buffer[255]; char buffer[255];
UTIL_Format(buffer, sizeof(buffer), "Could not find driver \"%s\"", info.driver); g_pSM->Format(buffer, sizeof(buffer), "Could not find driver \"%s\"", info.driver);
pContext->StringToLocalUTF8(params[2], params[3], buffer, NULL); pContext->StringToLocalUTF8(params[2], params[3], buffer, NULL);
return BAD_HANDLE; return BAD_HANDLE;
@ -1398,10 +1390,10 @@ static cell_t SQL_ConnectCustom(IPluginContext *pContext, const cell_t *params)
} }
/* HACK! Add us to the dependency list */ /* HACK! Add us to the dependency list */
IExtension *pExt = extsys->GetExtensionFromIdent(driver->GetIdentity()); IExtension *pExt = g_Extensions.GetExtensionFromIdent(driver->GetIdentity());
if (pExt) if (pExt)
{ {
extsys->BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext())); g_Extensions.BindChildPlugin(pExt, scripts->FindPluginByContext(pContext->GetContext()));
} }
return hndl; return hndl;

View File

@ -46,6 +46,7 @@
#include "AdminCache.h" #include "AdminCache.h"
#include "HalfLife2.h" #include "HalfLife2.h"
#include "CoreConfig.h" #include "CoreConfig.h"
#include "IDBDriver.h"
#if SOURCE_ENGINE == SE_DOTA #if SOURCE_ENGINE == SE_DOTA
#include "convar_sm_dota.h" #include "convar_sm_dota.h"
#elif SOURCE_ENGINE >= SE_ALIENSWARM #elif SOURCE_ENGINE >= SE_ALIENSWARM
@ -261,6 +262,19 @@ static bool is_map_running()
return g_SourceMod.IsMapRunning(); return g_SourceMod.IsMapRunning();
} }
static DatabaseInfo keyvalues_to_dbinfo(KeyValues *kv)
{
DatabaseInfo info;
info.database = kv->GetString("database", "");
info.driver = kv->GetString("driver", "default");
info.host = kv->GetString("host", "");
info.maxTimeout = kv->GetInt("timeout", 0);
info.pass = kv->GetString("pass", "");
info.port = kv->GetInt("port", 0);
info.user = kv->GetString("user", "");
return info;
}
int read_cmd_argc(const CCommand &args) int read_cmd_argc(const CCommand &args)
{ {
return args.ArgC(); return args.ArgC();
@ -394,6 +408,7 @@ static sm_core_t core_bridge =
do_global_plugin_loads, do_global_plugin_loads,
SM_AreConfigsExecuted, SM_AreConfigsExecuted,
SM_ExecuteForPlugin, SM_ExecuteForPlugin,
keyvalues_to_dbinfo,
GAMEFIX, GAMEFIX,
&serverGlobals &serverGlobals
}; };