extensions/clientprefs/query.cpp
changeset 2373 01dd8a057823
parent 2364 d0625900d257
child 2380 422da6951d47
     1.1 --- a/extensions/clientprefs/query.cpp	Sun Oct 19 22:57:28 2008 -0700
     1.2 +++ b/extensions/clientprefs/query.cpp	Mon Oct 20 03:40:46 2008 -0500
     1.3 @@ -41,32 +41,29 @@
     1.4  		return;
     1.5  	}
     1.6  
     1.7 -	if (m_pQuery)
     1.8 +	switch (m_type)
     1.9  	{
    1.10 -		switch (m_type)
    1.11 +		case Query_InsertCookie:
    1.12  		{
    1.13 -			case Query_InsertCookie:
    1.14 -			{
    1.15 -				g_CookieManager.InsertCookieCallback(m_pCookie, m_insertId);
    1.16 -				break;
    1.17 -			}
    1.18 +			g_CookieManager.InsertCookieCallback(m_pCookie, m_insertId);
    1.19 +			break;
    1.20 +		}
    1.21  
    1.22 -			case Query_SelectData:
    1.23 -			{
    1.24 -				g_CookieManager.ClientConnectCallback(m_client, m_pQuery);
    1.25 -				break;
    1.26 -			}
    1.27 +		case Query_SelectData:
    1.28 +		{
    1.29 +			g_CookieManager.ClientConnectCallback(m_client, m_pResult);
    1.30 +			break;
    1.31 +		}
    1.32  
    1.33 -			case Query_SelectId:
    1.34 -			{
    1.35 -				g_CookieManager.SelectIdCallback(m_pCookie, m_pQuery);
    1.36 -				break;
    1.37 -			}
    1.38 +		case Query_SelectId:
    1.39 +		{
    1.40 +			g_CookieManager.SelectIdCallback(m_pCookie, m_pResult);
    1.41 +			break;
    1.42 +		}
    1.43  
    1.44 -			default:
    1.45 -			{
    1.46 -				break;
    1.47 -			}
    1.48 +		default:
    1.49 +		{
    1.50 +			break;
    1.51  		}
    1.52  	}
    1.53  }
    1.54 @@ -81,19 +78,18 @@
    1.55  	{
    1.56  		assert(m_database != NULL);
    1.57  
    1.58 +		/* I don't think this is needed anymore... keeping for now. */
    1.59  		m_database->LockForFullAtomicOperation();
    1.60  
    1.61  		if (!BindParamsAndRun())
    1.62  		{
    1.63  			g_pSM->LogError(myself, 
    1.64  							"Failed SQL Query, Error: \"%s\" (Query id %i - client %i)", 
    1.65 -							m_pQuery ? m_pQuery->GetError() : "NULL QUERY",
    1.66 +							m_database->GetError(),
    1.67  							m_type, 
    1.68  							m_client);
    1.69  		}
    1.70  
    1.71 -		m_insertId = m_database->GetInsertID();
    1.72 -
    1.73  		m_database->UnlockFromFullAtomicOperation();
    1.74  	}
    1.75  }
    1.76 @@ -104,6 +100,7 @@
    1.77  
    1.78  	return m_database->GetDriver();
    1.79  }
    1.80 +
    1.81  IdentityToken_t *TQueryOp::GetOwner()
    1.82  {
    1.83  	return myself->GetIdentity();
    1.84 @@ -111,6 +108,10 @@
    1.85  
    1.86  void TQueryOp::Destroy()
    1.87  {
    1.88 +	if (m_pResult != NULL)
    1.89 +	{
    1.90 +		m_pResult->Destroy();
    1.91 +	}
    1.92  	delete this;
    1.93  }
    1.94  
    1.95 @@ -118,19 +119,21 @@
    1.96  {
    1.97  	m_type = type;
    1.98  	m_client = client;
    1.99 -	m_pQuery = NULL;
   1.100  	m_database = NULL;
   1.101 +	m_insertId = -1;
   1.102 +	m_pResult = NULL;
   1.103  }
   1.104  
   1.105  TQueryOp::TQueryOp(enum querytype type, Cookie *cookie)
   1.106  {
   1.107  	m_type = type;
   1.108  	m_pCookie = cookie;
   1.109 -	m_pQuery = NULL;
   1.110  	m_database = NULL;
   1.111 +	m_insertId = -1;
   1.112 +	m_pResult = NULL;
   1.113  }
   1.114  
   1.115 -void TQueryOp::SetDatabase( IDatabase *db )
   1.116 +void TQueryOp::SetDatabase(IDatabase *db)
   1.117  {
   1.118  	m_database = db;
   1.119  	m_database->IncReferenceCount();
   1.120 @@ -138,55 +141,148 @@
   1.121  
   1.122  bool TQueryOp::BindParamsAndRun()
   1.123  {
   1.124 -	assert(m_pQuery != NULL);
   1.125 -
   1.126 -	/* :TODO: remove this check. */
   1.127 -	if (m_pQuery == NULL)
   1.128 -	{
   1.129 -		g_pSM->LogError(myself, "Attempted to run with a NULL Query (type %d)", m_type);
   1.130 -		return false;
   1.131 -	}
   1.132 +	size_t ignore;
   1.133 +	char query[2048];
   1.134  
   1.135  	switch (m_type)
   1.136  	{
   1.137  		case Query_InsertCookie:
   1.138  		{
   1.139 -			m_pQuery->BindParamString(0, m_params.cookie->name, false);
   1.140 -			m_pQuery->BindParamString(1, m_params.cookie->description, false);
   1.141 -			m_pQuery->BindParamInt(2, m_params.cookie->access);
   1.142 +			char safe_name[MAX_NAME_LENGTH*2 + 1];
   1.143 +			char safe_desc[MAX_DESC_LENGTH*2 + 1];
   1.144 +			
   1.145 +			m_database->QuoteString(m_params.cookie->name, 
   1.146 +				safe_name, 
   1.147 +				sizeof(safe_name),
   1.148 +				&ignore);
   1.149 +			m_database->QuoteString(m_params.cookie->description,
   1.150 +				safe_desc,
   1.151 +				sizeof(safe_desc),
   1.152 +				&ignore);
   1.153  
   1.154 -			break;
   1.155 +			if (g_DriverType == Driver_MySQL)
   1.156 +			{
   1.157 +				UTIL_Format(query,
   1.158 +					sizeof(query),
   1.159 +					"INSERT IGNORE INTO sm_cookies (name, description, access) \
   1.160 +					 VALUES (\"%s\", \"%s\", %d)",
   1.161 +					safe_name,
   1.162 +					safe_desc,
   1.163 +					m_params.cookie->access);
   1.164 +			}
   1.165 +			else if (g_DriverType == Driver_SQLite)
   1.166 +			{
   1.167 +				UTIL_Format(query,
   1.168 +					sizeof(query),
   1.169 +					"INSERT OR IGNORE INTO sm_cookies (name, description, access) \
   1.170 +					 VALUES (\"%s\", \"%s\", %d)",
   1.171 +					 safe_name,
   1.172 +					 safe_desc,
   1.173 +					 m_params.cookie->access);
   1.174 +			}
   1.175 +
   1.176 +			if (!m_database->DoSimpleQuery(query))
   1.177 +			{
   1.178 +				return false;
   1.179 +			}
   1.180 +
   1.181 +			m_insertId = m_database->GetInsertID();
   1.182 +
   1.183 +			return true;
   1.184  		}
   1.185  
   1.186  		case Query_SelectData:
   1.187  		{
   1.188 -			m_pQuery->BindParamString(0, m_params.steamId, false);
   1.189 +			char safe_str[128];
   1.190 +
   1.191 +			m_database->QuoteString(m_params.steamId, safe_str, sizeof(safe_str), &ignore);
   1.192  
   1.193 -			break;
   1.194 +			UTIL_Format(query,
   1.195 +				sizeof(query),
   1.196 +				"SELECT sm_cookies.name, sm_cookie_cache.value, sm_cookies.description, \
   1.197 +						sm_cookies.access 	\
   1.198 +				FROM sm_cookies				\
   1.199 +				JOIN sm_cookie_cache		\
   1.200 +				ON sm_cookies.id = sm_cookie_cache.cookie_id \
   1.201 +				WHERE player = \"%s\"",
   1.202 +				safe_str);
   1.203 +
   1.204 +			m_pResult = m_database->DoQuery(query);
   1.205 +
   1.206 +			return (m_pResult != NULL);
   1.207  		}
   1.208  
   1.209  		case Query_InsertData:
   1.210  		{
   1.211 -			m_pQuery->BindParamString(0, m_params.steamId, false);
   1.212 -			m_pQuery->BindParamInt(1, m_params.cookieId);
   1.213 -			m_pQuery->BindParamString(2, m_params.data->value, false);
   1.214 -			m_pQuery->BindParamInt(3, (unsigned int)time(NULL), false);
   1.215 +			time_t t = time(NULL);
   1.216 +			char safe_id[128];
   1.217 +			char safe_val[MAX_VALUE_LENGTH*2 + 1];
   1.218 +
   1.219 +			m_database->QuoteString(m_params.steamId,
   1.220 +				safe_id,
   1.221 +				sizeof(safe_id),
   1.222 +				&ignore);
   1.223 +			m_database->QuoteString(m_params.data->value,
   1.224 +				safe_val,
   1.225 +				sizeof(safe_val),
   1.226 +				&ignore);
   1.227  
   1.228 -			if (driver == DRIVER_MYSQL)
   1.229 +			if (g_DriverType == Driver_MySQL)
   1.230  			{
   1.231 -				m_pQuery->BindParamString(4, m_params.data->value, false);
   1.232 -				m_pQuery->BindParamInt(5, (unsigned int)time(NULL), false);
   1.233 +				UTIL_Format(query, 
   1.234 +					sizeof(query),
   1.235 +					"INSERT INTO sm_cookie_cache (player, cookie_id, value, timestamp) 	\
   1.236 +					 VALUES (\"%s\", %d, \"%s\", %d)									\
   1.237 +					 ON DUPLICATE KEY UPDATE											\
   1.238 +					 value = \"%s\", timestamp = %d",
   1.239 +					safe_id,
   1.240 +					m_params.cookieId,
   1.241 +					safe_val,
   1.242 +					(unsigned int)t,
   1.243 +					safe_val,
   1.244 +					(unsigned int)t);
   1.245 +			}
   1.246 +			else if (g_DriverType == Driver_SQLite)
   1.247 +			{
   1.248 +				UTIL_Format(query,
   1.249 +					sizeof(query),
   1.250 +					"INSERT OR REPLACE INTO sm_cookie_cache						\
   1.251 +					 (player, cookie_id, value, timestamp)						\
   1.252 +					 VALUES (\"%s\", %d, \"%s\", %d)",
   1.253 +					safe_id,
   1.254 +					m_params.cookieId,
   1.255 +					safe_val,
   1.256 +					(unsigned int)t);
   1.257  			}
   1.258  
   1.259 -			break;
   1.260 +			if (!m_database->DoSimpleQuery(query))
   1.261 +			{
   1.262 +				return false;
   1.263 +			}
   1.264 +
   1.265 +			m_insertId = m_database->GetInsertID();
   1.266 +
   1.267 +			return true;
   1.268  		}
   1.269  
   1.270  		case Query_SelectId:
   1.271  		{
   1.272 +			char safe_name[MAX_NAME_LENGTH*2 + 1];
   1.273 +
   1.274  			/* the steamId var was actually used to store the name of the cookie - Save duplicating vars */
   1.275 -			m_pQuery->BindParamString(0, m_params.steamId, false);
   1.276 +			m_database->QuoteString(m_params.steamId, 
   1.277 +				safe_name,
   1.278 +				sizeof(safe_name),
   1.279 +				&ignore);
   1.280  
   1.281 -			break;
   1.282 +			UTIL_Format(query, 
   1.283 +				sizeof(query),
   1.284 +				"SELECT id FROM sm_cookies WHERE name = \"%s\"",
   1.285 +				safe_name);
   1.286 +
   1.287 +			m_pResult = m_database->DoQuery(query);
   1.288 +
   1.289 +			return (m_pResult != NULL);
   1.290  		}
   1.291  
   1.292  		default:
   1.293 @@ -196,42 +292,9 @@
   1.294  			
   1.295  	}
   1.296  
   1.297 -	return m_pQuery->Execute();
   1.298 -}
   1.299 -
   1.300 -void TQueryOp::SetPreparedQuery()
   1.301 -{
   1.302 -	switch (m_type)
   1.303 -	{
   1.304 -		case Query_InsertCookie:
   1.305 -		{
   1.306 -			m_pQuery = g_ClientPrefs.InsertCookieQuery;
   1.307 -			break;
   1.308 -		}
   1.309 +	assert(false);
   1.310  
   1.311 -		case Query_SelectData:
   1.312 -		{
   1.313 -			m_pQuery = g_ClientPrefs.SelectDataQuery;
   1.314 -			break;
   1.315 -		}
   1.316 -
   1.317 -		case Query_InsertData:
   1.318 -		{
   1.319 -			m_pQuery = g_ClientPrefs.InsertDataQuery;
   1.320 -			break;
   1.321 -		}
   1.322 -
   1.323 -		case Query_SelectId:
   1.324 -		{
   1.325 -			m_pQuery = g_ClientPrefs.SelectIdQuery;
   1.326 -			break;
   1.327 -		}
   1.328 -
   1.329 -		default:
   1.330 -		{
   1.331 -			break;
   1.332 -		}
   1.333 -	}
   1.334 +	return false;
   1.335  }
   1.336  
   1.337  ParamData::~ParamData()
   1.338 @@ -266,3 +329,4 @@
   1.339  	steamId[0] = '\0';
   1.340  	cookieId = 0;
   1.341  }
   1.342 +