|
dvander@667
|
1 |
/** |
|
dvander@667
|
2 |
* vim: set ts=4 : |
|
dvander@667
|
3 |
* =============================================================== |
|
dvander@667
|
4 |
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. |
|
dvander@667
|
5 |
* =============================================================== |
|
dvander@667
|
6 |
* |
|
dvander@667
|
7 |
* This file is not open source and may not be copied without explicit |
|
dvander@667
|
8 |
* written permission of AlliedModders LLC. This file may not be redistributed |
|
dvander@667
|
9 |
* in whole or significant part. |
|
dvander@667
|
10 |
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php |
|
dvander@667
|
11 |
* |
|
dvander@667
|
12 |
* Version: $Id$ |
|
dvander@667
|
13 |
*/ |
|
dvander@667
|
14 |
|
|
dvander@666
|
15 |
#include "Database.h" |
|
dvander@666
|
16 |
#include "HandleSys.h" |
|
dvander@862
|
17 |
#include "ShareSys.h" |
|
dvander@666
|
18 |
#include "sourcemod.h" |
|
dvander@868
|
19 |
#include "sm_stringutil.h" |
|
dvander@868
|
20 |
#include "TextParsers.h" |
|
dvander@868
|
21 |
#include "Logger.h" |
|
dvander@868
|
22 |
#include "ExtensionSys.h" |
|
dvander@868
|
23 |
#include <stdlib.h> |
|
dvander@868
|
24 |
|
|
dvander@868
|
25 |
#define DBPARSE_LEVEL_NONE 0 |
|
dvander@868
|
26 |
#define DBPARSE_LEVEL_MAIN 1 |
|
dvander@868
|
27 |
#define DBPARSE_LEVEL_DATABASE 2 |
|
dvander@666
|
28 |
|
|
dvander@666
|
29 |
DBManager g_DBMan; |
|
dvander@666
|
30 |
|
|
dvander@868
|
31 |
DBManager::DBManager() |
|
dvander@868
|
32 |
: m_StrTab(512), m_ParseLevel(0), m_ParseState(0), m_pDefault(NULL) |
|
dvander@868
|
33 |
{ |
|
dvander@868
|
34 |
} |
|
dvander@868
|
35 |
|
|
dvander@666
|
36 |
void DBManager::OnSourceModAllInitialized() |
|
dvander@666
|
37 |
{ |
|
dvander@666
|
38 |
HandleAccess sec; |
|
dvander@666
|
39 |
|
|
dvander@666
|
40 |
g_HandleSys.InitAccessDefaults(NULL, &sec); |
|
dvander@666
|
41 |
sec.access[HandleAccess_Delete] |= HANDLE_RESTRICT_IDENTITY; |
|
dvander@666
|
42 |
sec.access[HandleAccess_Clone] |= HANDLE_RESTRICT_IDENTITY; |
|
dvander@666
|
43 |
|
|
dvander@666
|
44 |
m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL); |
|
dvander@666
|
45 |
m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL); |
|
dvander@862
|
46 |
|
|
dvander@862
|
47 |
g_ShareSys.AddInterface(NULL, this); |
|
dvander@868
|
48 |
|
|
dvander@868
|
49 |
g_SourceMod.BuildPath(Path_SM, m_Filename, sizeof(m_Filename), "configs/databases.cfg"); |
|
dvander@868
|
50 |
} |
|
dvander@868
|
51 |
|
|
dvander@868
|
52 |
void DBManager::OnSourceModLevelChange(const char *mapName) |
|
dvander@868
|
53 |
{ |
|
dvander@868
|
54 |
SMCParseError err; |
|
dvander@868
|
55 |
unsigned int line = 0; |
|
dvander@868
|
56 |
if ((err = g_TextParser.ParseFile_SMC(m_Filename, this, &line, NULL)) != SMCParse_Okay) |
|
dvander@868
|
57 |
{ |
|
dvander@868
|
58 |
g_Logger.LogError("[SM] Detected parse error(s) in file \"%s\"", m_Filename); |
|
dvander@868
|
59 |
if (err != SMCParse_Custom) |
|
dvander@868
|
60 |
{ |
|
dvander@868
|
61 |
const char *txt = g_TextParser.GetSMCErrorString(err); |
|
dvander@868
|
62 |
g_Logger.LogError("[SM] Line %d: %s", line, txt); |
|
dvander@868
|
63 |
} |
|
dvander@868
|
64 |
} |
|
dvander@858
|
65 |
} |
|
dvander@858
|
66 |
|
|
dvander@858
|
67 |
void DBManager::OnSourceModShutdown() |
|
dvander@858
|
68 |
{ |
|
dvander@858
|
69 |
g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent); |
|
dvander@858
|
70 |
g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent); |
|
dvander@858
|
71 |
} |
|
dvander@858
|
72 |
|
|
dvander@858
|
73 |
unsigned int DBManager::GetInterfaceVersion() |
|
dvander@858
|
74 |
{ |
|
dvander@858
|
75 |
return SMINTERFACE_DBI_VERSION; |
|
dvander@858
|
76 |
} |
|
dvander@858
|
77 |
|
|
dvander@858
|
78 |
const char *DBManager::GetInterfaceName() |
|
dvander@858
|
79 |
{ |
|
dvander@858
|
80 |
return SMINTERFACE_DBI_NAME; |
|
dvander@666
|
81 |
} |
|
dvander@666
|
82 |
|
|
dvander@666
|
83 |
void DBManager::OnHandleDestroy(HandleType_t type, void *object) |
|
dvander@666
|
84 |
{ |
|
dvander@666
|
85 |
if (type == m_DriverType) |
|
dvander@666
|
86 |
{ |
|
dvander@666
|
87 |
/* Ignore */ |
|
dvander@666
|
88 |
return; |
|
dvander@666
|
89 |
} |
|
dvander@666
|
90 |
|
|
dvander@858
|
91 |
if (g_HandleSys.TypeCheck(type, m_DatabaseType)) |
|
dvander@666
|
92 |
{ |
|
dvander@666
|
93 |
IDatabase *pdb = (IDatabase *)object; |
|
dvander@666
|
94 |
pdb->Close(); |
|
dvander@666
|
95 |
} |
|
dvander@666
|
96 |
} |
|
dvander@666
|
97 |
|
|
dvander@868
|
98 |
void DBManager::ReadSMC_ParseStart() |
|
dvander@666
|
99 |
{ |
|
dvander@868
|
100 |
m_confs.clear(); |
|
dvander@868
|
101 |
m_ParseLevel = 0; |
|
dvander@868
|
102 |
m_ParseState = DBPARSE_LEVEL_NONE; |
|
dvander@868
|
103 |
m_StrTab.Reset(); |
|
dvander@868
|
104 |
m_DefDriver.clear(); |
|
dvander@868
|
105 |
} |
|
dvander@666
|
106 |
|
|
dvander@868
|
107 |
ConfDbInfo s_CurInfo; |
|
dvander@868
|
108 |
SMCParseResult DBManager::ReadSMC_NewSection(const char *name, bool opt_quotes) |
|
dvander@868
|
109 |
{ |
|
dvander@868
|
110 |
if (m_ParseLevel) |
|
dvander@868
|
111 |
{ |
|
dvander@868
|
112 |
m_ParseLevel++; |
|
dvander@868
|
113 |
return SMCParse_Continue; |
|
dvander@868
|
114 |
} |
|
dvander@868
|
115 |
|
|
dvander@868
|
116 |
if (m_ParseState == DBPARSE_LEVEL_NONE) |
|
dvander@666
|
117 |
{ |
|
dvander@868
|
118 |
if (strcmp(name, "Databases") == 0) |
|
dvander@666
|
119 |
{ |
|
dvander@868
|
120 |
m_ParseState = DBPARSE_LEVEL_MAIN; |
|
dvander@868
|
121 |
} else { |
|
dvander@868
|
122 |
m_ParseLevel++; |
|
dvander@868
|
123 |
} |
|
dvander@868
|
124 |
} else if (m_ParseState == DBPARSE_LEVEL_MAIN) { |
|
dvander@868
|
125 |
s_CurInfo = ConfDbInfo(); |
|
dvander@869
|
126 |
s_CurInfo.name = m_StrTab.AddString(name); |
|
dvander@868
|
127 |
m_ParseState = DBPARSE_LEVEL_DATABASE; |
|
dvander@868
|
128 |
} else if (m_ParseState == DBPARSE_LEVEL_DATABASE) { |
|
dvander@868
|
129 |
m_ParseLevel++; |
|
dvander@868
|
130 |
} |
|
dvander@868
|
131 |
|
|
dvander@868
|
132 |
return SMCParse_Continue; |
|
dvander@868
|
133 |
} |
|
dvander@868
|
134 |
|
|
dvander@868
|
135 |
SMCParseResult DBManager::ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes) |
|
dvander@868
|
136 |
{ |
|
dvander@868
|
137 |
if (m_ParseLevel) |
|
dvander@868
|
138 |
{ |
|
dvander@868
|
139 |
return SMCParse_Continue; |
|
dvander@868
|
140 |
} |
|
dvander@868
|
141 |
|
|
dvander@868
|
142 |
if (m_ParseState == DBPARSE_LEVEL_MAIN) |
|
dvander@868
|
143 |
{ |
|
dvander@868
|
144 |
if (strcmp(key, "driver_default") == 0) |
|
dvander@868
|
145 |
{ |
|
dvander@868
|
146 |
m_DefDriver.assign(value); |
|
dvander@868
|
147 |
} |
|
dvander@868
|
148 |
} else if (m_ParseState == DBPARSE_LEVEL_DATABASE) { |
|
dvander@868
|
149 |
if (strcmp(key, "driver") == 0) |
|
dvander@868
|
150 |
{ |
|
dvander@868
|
151 |
if (strcmp(value, "default") != 0) |
|
dvander@868
|
152 |
{ |
|
dvander@868
|
153 |
s_CurInfo.driver = m_StrTab.AddString(value); |
|
dvander@868
|
154 |
} |
|
dvander@868
|
155 |
} else if (strcmp(key, "database") == 0) { |
|
dvander@868
|
156 |
s_CurInfo.database = m_StrTab.AddString(value); |
|
dvander@868
|
157 |
} else if (strcmp(key, "host") == 0) { |
|
dvander@868
|
158 |
s_CurInfo.host = m_StrTab.AddString(value); |
|
dvander@868
|
159 |
} else if (strcmp(key, "user") == 0) { |
|
dvander@868
|
160 |
s_CurInfo.user = m_StrTab.AddString(value); |
|
dvander@868
|
161 |
} else if (strcmp(key, "pass") == 0) { |
|
dvander@868
|
162 |
s_CurInfo.pass = m_StrTab.AddString(value); |
|
dvander@868
|
163 |
} else if (strcmp(key, "timeout") == 0) { |
|
dvander@868
|
164 |
s_CurInfo.info.maxTimeout = atoi(value); |
|
dvander@868
|
165 |
} else if (strcmp(key, "port") == 0) { |
|
dvander@868
|
166 |
s_CurInfo.info.port = atoi(value); |
|
dvander@666
|
167 |
} |
|
dvander@666
|
168 |
} |
|
dvander@666
|
169 |
|
|
dvander@868
|
170 |
return SMCParse_Continue; |
|
dvander@868
|
171 |
} |
|
dvander@868
|
172 |
|
|
dvander@868
|
173 |
#define ASSIGN_VAR(var) \ |
|
dvander@868
|
174 |
if (s_CurInfo.var == -1) { \ |
|
dvander@868
|
175 |
s_CurInfo.info.var = ""; \ |
|
dvander@868
|
176 |
} else { \ |
|
dvander@868
|
177 |
s_CurInfo.info.var = m_StrTab.GetString(s_CurInfo.var); \ |
|
dvander@868
|
178 |
} |
|
dvander@868
|
179 |
|
|
dvander@868
|
180 |
SMCParseResult DBManager::ReadSMC_LeavingSection() |
|
dvander@868
|
181 |
{ |
|
dvander@868
|
182 |
if (m_ParseLevel) |
|
dvander@868
|
183 |
{ |
|
dvander@868
|
184 |
m_ParseLevel--; |
|
dvander@868
|
185 |
return SMCParse_Continue; |
|
dvander@868
|
186 |
} |
|
dvander@868
|
187 |
|
|
dvander@868
|
188 |
if (m_ParseState == DBPARSE_LEVEL_DATABASE) |
|
dvander@868
|
189 |
{ |
|
dvander@868
|
190 |
/* Set all of the info members to either a blank string |
|
dvander@868
|
191 |
* or the string pointer from the string table. |
|
dvander@868
|
192 |
*/ |
|
dvander@868
|
193 |
ASSIGN_VAR(driver); |
|
dvander@868
|
194 |
ASSIGN_VAR(database); |
|
dvander@868
|
195 |
ASSIGN_VAR(host); |
|
dvander@868
|
196 |
ASSIGN_VAR(user); |
|
dvander@868
|
197 |
ASSIGN_VAR(pass); |
|
dvander@868
|
198 |
|
|
dvander@868
|
199 |
/* Save it.. */ |
|
dvander@868
|
200 |
m_confs.push_back(s_CurInfo); |
|
dvander@868
|
201 |
|
|
dvander@868
|
202 |
/* Go up one level */ |
|
dvander@868
|
203 |
m_ParseState = DBPARSE_LEVEL_MAIN; |
|
dvander@868
|
204 |
} else if (m_ParseState == DBPARSE_LEVEL_MAIN) { |
|
dvander@868
|
205 |
m_ParseState = DBPARSE_LEVEL_NONE; |
|
dvander@868
|
206 |
return SMCParse_Halt; |
|
dvander@868
|
207 |
} |
|
dvander@868
|
208 |
|
|
dvander@868
|
209 |
return SMCParse_Continue; |
|
dvander@868
|
210 |
} |
|
dvander@868
|
211 |
#undef ASSIGN_VAR |
|
dvander@868
|
212 |
|
|
dvander@868
|
213 |
void DBManager::ReadSMC_ParseEnd(bool halted, bool failed) |
|
dvander@868
|
214 |
{ |
|
dvander@868
|
215 |
} |
|
dvander@868
|
216 |
|
|
dvander@868
|
217 |
bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength) |
|
dvander@868
|
218 |
{ |
|
dvander@868
|
219 |
ConfDbInfo *pInfo = GetDatabaseConf(name); |
|
dvander@868
|
220 |
|
|
dvander@868
|
221 |
if (!pInfo) |
|
dvander@868
|
222 |
{ |
|
dvander@868
|
223 |
if (pdr) |
|
dvander@868
|
224 |
{ |
|
dvander@868
|
225 |
*pdr = NULL; |
|
dvander@868
|
226 |
} |
|
dvander@868
|
227 |
*pdb = NULL; |
|
dvander@868
|
228 |
UTIL_Format(error, maxlength, "Configuration \"%s\" not found", name); |
|
dvander@868
|
229 |
return false; |
|
dvander@868
|
230 |
} |
|
dvander@868
|
231 |
|
|
dvander@869
|
232 |
const char *dname = pInfo->info.driver; |
|
dvander@868
|
233 |
if (!pInfo->realDriver) |
|
dvander@868
|
234 |
{ |
|
dvander@868
|
235 |
/* Try to assign a real driver pointer */ |
|
dvander@868
|
236 |
if (pInfo->info.driver[0] == '\0') |
|
dvander@868
|
237 |
{ |
|
dvander@868
|
238 |
if (!m_pDefault && m_DefDriver.size() > 0) |
|
dvander@868
|
239 |
{ |
|
dvander@868
|
240 |
m_pDefault = FindOrLoadDriver(m_DefDriver.c_str()); |
|
dvander@868
|
241 |
} |
|
dvander@869
|
242 |
dname = m_DefDriver.size() ? m_DefDriver.c_str() : "default"; |
|
dvander@868
|
243 |
pInfo->realDriver = m_pDefault; |
|
dvander@868
|
244 |
} else { |
|
dvander@868
|
245 |
pInfo->realDriver = FindOrLoadDriver(pInfo->info.driver); |
|
dvander@868
|
246 |
} |
|
dvander@868
|
247 |
} |
|
dvander@868
|
248 |
|
|
dvander@868
|
249 |
if (pInfo->realDriver) |
|
dvander@868
|
250 |
{ |
|
dvander@868
|
251 |
if (pdr) |
|
dvander@868
|
252 |
{ |
|
dvander@868
|
253 |
*pdr = pInfo->realDriver; |
|
dvander@868
|
254 |
} |
|
dvander@868
|
255 |
*pdb = pInfo->realDriver->Connect(&pInfo->info, persistent, error, maxlength); |
|
dvander@868
|
256 |
return (*pdb != NULL); |
|
dvander@868
|
257 |
} |
|
dvander@868
|
258 |
|
|
dvander@868
|
259 |
if (pdr) |
|
dvander@868
|
260 |
{ |
|
dvander@868
|
261 |
*pdr = NULL; |
|
dvander@868
|
262 |
} |
|
dvander@666
|
263 |
*pdb = NULL; |
|
dvander@666
|
264 |
|
|
dvander@869
|
265 |
UTIL_Format(error, maxlength, "Driver \"%s\" not found", dname); |
|
dvander@868
|
266 |
|
|
dvander@666
|
267 |
return false; |
|
dvander@666
|
268 |
} |
|
dvander@858
|
269 |
|
|
dvander@858
|
270 |
void DBManager::AddDriver(IDBDriver *pDriver) |
|
dvander@858
|
271 |
{ |
|
dvander@858
|
272 |
m_drivers.push_back(pDriver); |
|
dvander@858
|
273 |
} |
|
dvander@858
|
274 |
|
|
dvander@858
|
275 |
void DBManager::RemoveDriver(IDBDriver *pDriver) |
|
dvander@858
|
276 |
{ |
|
dvander@858
|
277 |
for (size_t i=0; i<m_drivers.size(); i++) |
|
dvander@858
|
278 |
{ |
|
dvander@858
|
279 |
if (m_drivers[i] == pDriver) |
|
dvander@858
|
280 |
{ |
|
dvander@858
|
281 |
m_drivers.erase(m_drivers.iterAt(i)); |
|
dvander@858
|
282 |
return; |
|
dvander@858
|
283 |
} |
|
dvander@858
|
284 |
} |
|
dvander@868
|
285 |
|
|
dvander@868
|
286 |
/* Make sure NOTHING references this! */ |
|
dvander@868
|
287 |
List<ConfDbInfo>::iterator iter; |
|
dvander@868
|
288 |
for (iter=m_confs.begin(); iter!=m_confs.end(); iter++) |
|
dvander@868
|
289 |
{ |
|
dvander@868
|
290 |
ConfDbInfo &db = (*iter); |
|
dvander@868
|
291 |
if (db.realDriver == pDriver) |
|
dvander@868
|
292 |
{ |
|
dvander@868
|
293 |
db.realDriver = NULL; |
|
dvander@868
|
294 |
} |
|
dvander@868
|
295 |
} |
|
dvander@868
|
296 |
} |
|
dvander@868
|
297 |
|
|
dvander@868
|
298 |
IDBDriver *DBManager::GetDefaultDriver() |
|
dvander@868
|
299 |
{ |
|
dvander@868
|
300 |
if (!m_pDefault && m_DefDriver.size() > 0) |
|
dvander@868
|
301 |
{ |
|
dvander@868
|
302 |
m_pDefault = FindOrLoadDriver(m_DefDriver.c_str()); |
|
dvander@868
|
303 |
} |
|
dvander@868
|
304 |
|
|
dvander@868
|
305 |
return m_pDefault; |
|
dvander@858
|
306 |
} |
|
dvander@858
|
307 |
|
|
dvander@858
|
308 |
Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken) |
|
dvander@858
|
309 |
{ |
|
dvander@858
|
310 |
HandleType_t type = 0; |
|
dvander@858
|
311 |
|
|
dvander@858
|
312 |
if (dtype == DBHandle_Driver) |
|
dvander@858
|
313 |
{ |
|
dvander@858
|
314 |
type = m_DriverType; |
|
dvander@858
|
315 |
} else if (dtype == DBHandle_Database) { |
|
dvander@858
|
316 |
type = m_DatabaseType; |
|
dvander@858
|
317 |
} else { |
|
dvander@858
|
318 |
return BAD_HANDLE; |
|
dvander@858
|
319 |
} |
|
dvander@858
|
320 |
|
|
dvander@858
|
321 |
return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL); |
|
dvander@858
|
322 |
} |
|
dvander@858
|
323 |
|
|
dvander@858
|
324 |
HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr) |
|
dvander@858
|
325 |
{ |
|
dvander@858
|
326 |
HandleType_t type = 0; |
|
dvander@858
|
327 |
|
|
dvander@858
|
328 |
if (dtype == DBHandle_Driver) |
|
dvander@858
|
329 |
{ |
|
dvander@858
|
330 |
type = m_DriverType; |
|
dvander@858
|
331 |
} else if (dtype == DBHandle_Database) { |
|
dvander@858
|
332 |
type = m_DatabaseType; |
|
dvander@858
|
333 |
} else { |
|
dvander@858
|
334 |
return HandleError_Type; |
|
dvander@858
|
335 |
} |
|
dvander@858
|
336 |
|
|
dvander@858
|
337 |
HandleSecurity sec(NULL, g_pCoreIdent); |
|
dvander@858
|
338 |
|
|
dvander@869
|
339 |
return g_HandleSys.ReadHandle(hndl, type, &sec, ptr); |
|
dvander@858
|
340 |
} |
|
dvander@858
|
341 |
|
|
dvander@858
|
342 |
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token) |
|
dvander@858
|
343 |
{ |
|
dvander@858
|
344 |
HandleSecurity sec(token, g_pCoreIdent); |
|
dvander@858
|
345 |
return g_HandleSys.FreeHandle(hndl, &sec); |
|
dvander@858
|
346 |
} |
|
dvander@858
|
347 |
|
|
dvander@858
|
348 |
unsigned int DBManager::GetDriverCount() |
|
dvander@858
|
349 |
{ |
|
dvander@858
|
350 |
return (unsigned int)m_drivers.size(); |
|
dvander@858
|
351 |
} |
|
dvander@858
|
352 |
|
|
dvander@858
|
353 |
IDBDriver *DBManager::GetDriver(unsigned int index) |
|
dvander@858
|
354 |
{ |
|
dvander@858
|
355 |
if (index >= m_drivers.size()) |
|
dvander@858
|
356 |
{ |
|
dvander@858
|
357 |
return NULL; |
|
dvander@858
|
358 |
} |
|
dvander@858
|
359 |
|
|
dvander@858
|
360 |
return m_drivers[index]; |
|
dvander@858
|
361 |
} |
|
dvander@858
|
362 |
|
|
dvander@858
|
363 |
const DatabaseInfo *DBManager::FindDatabaseConf(const char *name) |
|
dvander@858
|
364 |
{ |
|
dvander@868
|
365 |
ConfDbInfo *info = GetDatabaseConf(name); |
|
dvander@868
|
366 |
if (!info) |
|
dvander@868
|
367 |
{ |
|
dvander@868
|
368 |
return NULL; |
|
dvander@868
|
369 |
} |
|
dvander@868
|
370 |
|
|
dvander@868
|
371 |
return &info->info; |
|
dvander@868
|
372 |
} |
|
dvander@868
|
373 |
|
|
dvander@868
|
374 |
ConfDbInfo *DBManager::GetDatabaseConf(const char *name) |
|
dvander@868
|
375 |
{ |
|
dvander@868
|
376 |
List<ConfDbInfo>::iterator iter; |
|
dvander@868
|
377 |
|
|
dvander@868
|
378 |
for (iter=m_confs.begin(); iter!=m_confs.end(); iter++) |
|
dvander@868
|
379 |
{ |
|
dvander@868
|
380 |
ConfDbInfo &conf = (*iter); |
|
dvander@868
|
381 |
if (strcmp(m_StrTab.GetString(conf.name), name) == 0) |
|
dvander@868
|
382 |
{ |
|
dvander@868
|
383 |
return &conf; |
|
dvander@868
|
384 |
} |
|
dvander@868
|
385 |
} |
|
dvander@868
|
386 |
|
|
dvander@858
|
387 |
return NULL; |
|
dvander@858
|
388 |
} |
|
dvander@868
|
389 |
|
|
dvander@868
|
390 |
IDBDriver *DBManager::FindOrLoadDriver(const char *name) |
|
dvander@868
|
391 |
{ |
|
dvander@868
|
392 |
size_t last_size = m_drivers.size(); |
|
dvander@868
|
393 |
for (size_t i=0; i<last_size; i++) |
|
dvander@868
|
394 |
{ |
|
dvander@868
|
395 |
if (strcmp(m_drivers[i]->GetIdentifier(), name) == 0) |
|
dvander@868
|
396 |
{ |
|
dvander@868
|
397 |
return m_drivers[i]; |
|
dvander@868
|
398 |
} |
|
dvander@868
|
399 |
} |
|
dvander@868
|
400 |
|
|
dvander@868
|
401 |
char filename[PLATFORM_MAX_PATH]; |
|
dvander@869
|
402 |
UTIL_Format(filename, sizeof(filename), "dbi.%s.ext", name); |
|
dvander@868
|
403 |
|
|
dvander@868
|
404 |
IExtension *pExt = g_Extensions.LoadAutoExtension(filename); |
|
dvander@868
|
405 |
if (!pExt || !pExt->IsLoaded() || m_drivers.size() <= last_size) |
|
dvander@868
|
406 |
{ |
|
dvander@868
|
407 |
return NULL; |
|
dvander@868
|
408 |
} |
|
dvander@868
|
409 |
|
|
dvander@868
|
410 |
/* last_size is now gauranteed to be a valid index. |
|
dvander@868
|
411 |
* The identifier must match the name. |
|
dvander@868
|
412 |
*/ |
|
dvander@868
|
413 |
if (strcmp(m_drivers[last_size]->GetIdentifier(), name) == 0) |
|
dvander@868
|
414 |
{ |
|
dvander@868
|
415 |
return m_drivers[last_size]; |
|
dvander@868
|
416 |
} |
|
dvander@868
|
417 |
|
|
dvander@868
|
418 |
return NULL; |
|
dvander@868
|
419 |
} |