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 +