core/Database.cpp
changeset 3140 3f461eb8edf2
parent 3139 2c16c25d437a
child 3872 4c93f74cae51
     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;