1.1 --- a/core/Database.cpp Sat Oct 16 03:52:36 2010 -0700
1.2 +++ b/core/Database.cpp Sat Oct 16 22:27:34 2010 -0700
1.3 @@ -104,6 +104,7 @@
1.4 m_pQueueLock->DestroyThis();
1.5 g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
1.6 g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
1.7 + ClearConfigs();
1.8 }
1.9
1.10 unsigned int DBManager::GetInterfaceVersion()
1.11 @@ -133,12 +134,20 @@
1.12
1.13 void DBManager::ReadSMC_ParseStart()
1.14 {
1.15 - m_confs.clear();
1.16 + ClearConfigs();
1.17 m_ParseLevel = 0;
1.18 m_ParseState = DBPARSE_LEVEL_NONE;
1.19 m_DefDriver.clear();
1.20 }
1.21
1.22 +void DBManager::ClearConfigs()
1.23 +{
1.24 + List<ConfDbInfo *>::iterator iter;
1.25 + for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
1.26 + delete (*iter);
1.27 + m_confs.clear();
1.28 +}
1.29 +
1.30 ConfDbInfo s_CurInfo;
1.31 SMCResult DBManager::ReadSMC_NewSection(const SMCStates *states, const char *name)
1.32 {
1.33 @@ -205,13 +214,6 @@
1.34 return SMCResult_Continue;
1.35 }
1.36
1.37 -#define ASSIGN_VAR(var) \
1.38 - if (s_CurInfo.var == "") { \
1.39 - s_CurInfo.info.var = ""; \
1.40 - } else { \
1.41 - s_CurInfo.info.var = s_CurInfo.var.c_str(); \
1.42 - }
1.43 -
1.44 SMCResult DBManager::ReadSMC_LeavingSection(const SMCStates *states)
1.45 {
1.46 if (m_ParseLevel)
1.47 @@ -222,17 +224,26 @@
1.48
1.49 if (m_ParseState == DBPARSE_LEVEL_DATABASE)
1.50 {
1.51 - /* Set all of the info members to either a blank string
1.52 - * or the string pointer from the string table.
1.53 - */
1.54 - ASSIGN_VAR(driver);
1.55 - ASSIGN_VAR(database);
1.56 - ASSIGN_VAR(host);
1.57 - ASSIGN_VAR(user);
1.58 - ASSIGN_VAR(pass);
1.59 + ConfDbInfo *cdb = new ConfDbInfo();
1.60 +
1.61 + cdb->name = s_CurInfo.name;
1.62 + cdb->driver = s_CurInfo.driver;
1.63 + cdb->host = s_CurInfo.host;
1.64 + cdb->user = s_CurInfo.user;
1.65 + cdb->pass = s_CurInfo.pass;
1.66 + cdb->database = s_CurInfo.database;
1.67 + cdb->realDriver = s_CurInfo.realDriver;
1.68 + cdb->info.maxTimeout = s_CurInfo.info.maxTimeout;
1.69 + cdb->info.port = s_CurInfo.info.port;
1.70 +
1.71 + cdb->info.driver = cdb->driver.c_str();
1.72 + cdb->info.database = cdb->database.c_str();
1.73 + cdb->info.host = cdb->host.c_str();
1.74 + cdb->info.user = cdb->user.c_str();
1.75 + cdb->info.pass = cdb->pass.c_str();
1.76
1.77 /* Save it.. */
1.78 - m_confs.push_back(s_CurInfo);
1.79 + m_confs.push_back(cdb);
1.80
1.81 /* Go up one level */
1.82 m_ParseState = DBPARSE_LEVEL_MAIN;
1.83 @@ -243,7 +254,6 @@
1.84
1.85 return SMCResult_Continue;
1.86 }
1.87 -#undef ASSIGN_VAR
1.88
1.89 void DBManager::ReadSMC_ParseEnd(bool halted, bool failed)
1.90 {
1.91 @@ -332,10 +342,10 @@
1.92 }
1.93
1.94 /* Make sure NOTHING references this! */
1.95 - List<ConfDbInfo>::iterator iter;
1.96 + List<ConfDbInfo *>::iterator iter;
1.97 for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
1.98 {
1.99 - ConfDbInfo &db = (*iter);
1.100 + ConfDbInfo &db = *(*iter);
1.101 if (db.realDriver == pDriver)
1.102 {
1.103 db.realDriver = NULL;
1.104 @@ -447,11 +457,11 @@
1.105
1.106 ConfDbInfo *DBManager::GetDatabaseConf(const char *name)
1.107 {
1.108 - List<ConfDbInfo>::iterator iter;
1.109 + List<ConfDbInfo *>::iterator iter;
1.110
1.111 for (iter=m_confs.begin(); iter!=m_confs.end(); iter++)
1.112 {
1.113 - ConfDbInfo &conf = (*iter);
1.114 + ConfDbInfo &conf = *(*iter);
1.115 if (conf.name == name)
1.116 {
1.117 return &conf;