extensions/clientprefs/query.cpp
author Peace-Maker <januk@freenet.de>
Sat May 10 05:42:33 2014 -0700 (2014-05-10)
changeset 4354 7011587e0021
parent 4039 e8b8d660b50c
permissions -rw-r--r--
Remove LogMessageEx definition from logging.inc (bug 5897, r=kyles).
pred@2009
     1
/**
pred@2009
     2
 * vim: set ts=4 :
pred@2009
     3
 * =============================================================================
pred@2009
     4
 * SourceMod Client Preferences Extension
pred@2009
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
pred@2009
     6
 * =============================================================================
pred@2009
     7
 *
pred@2009
     8
 * This program is free software; you can redistribute it and/or modify it under
pred@2009
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
pred@2009
    10
 * Free Software Foundation.
pred@2009
    11
 * 
pred@2009
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
pred@2009
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
pred@2009
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
pred@2009
    15
 * details.
pred@2009
    16
 *
pred@2009
    17
 * You should have received a copy of the GNU General Public License along with
pred@2009
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
pred@2009
    19
 *
pred@2009
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
pred@2009
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
pred@2009
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
pred@2009
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
pred@2009
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
pred@2009
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
pred@2009
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
pred@2009
    27
 * or <http://www.sourcemod.net/license.php>.
pred@2009
    28
 *
pred@2009
    29
 * Version: $Id$
pred@2009
    30
 */
pred@2009
    31
pred@2009
    32
#include "query.h"
pred@2009
    33
pred@2009
    34
pred@2009
    35
void TQueryOp::RunThinkPart()
pred@2009
    36
{
pred@2009
    37
	//handler for threaded sql queries
dvander@2373
    38
	switch (m_type)
pred@2009
    39
	{
dvander@2373
    40
		case Query_InsertCookie:
pred@2009
    41
		{
dvander@2373
    42
			g_CookieManager.InsertCookieCallback(m_pCookie, m_insertId);
dvander@2373
    43
			break;
dvander@2373
    44
		}
pred@2207
    45
dvander@2373
    46
		case Query_SelectData:
dvander@2373
    47
		{
pred@2592
    48
			g_CookieManager.ClientConnectCallback(m_serial, m_pResult);
dvander@2373
    49
			break;
dvander@2373
    50
		}
pred@2207
    51
dvander@2373
    52
		case Query_SelectId:
dvander@2373
    53
		{
dvander@2373
    54
			g_CookieManager.SelectIdCallback(m_pCookie, m_pResult);
dvander@2373
    55
			break;
dvander@2373
    56
		}
pred@2207
    57
kyle@3804
    58
		case Query_Connect:
kyle@3804
    59
		{
kyle@3804
    60
			return;
kyle@3804
    61
		}
kyle@3804
    62
		
dvander@2373
    63
		default:
dvander@2373
    64
		{
dvander@2373
    65
			break;
pred@2009
    66
		}
pred@2009
    67
	}
pred@2009
    68
}
pred@2009
    69
pred@2009
    70
void TQueryOp::RunThreadPart()
pred@2009
    71
{
pred@2207
    72
	if (m_type == Query_Connect)
pred@2207
    73
	{
pred@2207
    74
		g_ClientPrefs.DatabaseConnect();
kyle@3804
    75
		return;
pred@2207
    76
	}
kyle@3804
    77
	
kyle@3804
    78
	assert(m_database != NULL);
kyle@3804
    79
	/* I don't think this is needed anymore... keeping for now. */
kyle@3804
    80
	m_database->LockForFullAtomicOperation();
pred@2207
    81
		if (!BindParamsAndRun())
kyle@3804
    82
	{
kyle@3804
    83
		g_pSM->LogError(myself, 
kyle@3804
    84
						"Failed SQL Query, Error: \"%s\" (Query id %i - serial %i)", 
kyle@3804
    85
						m_database->GetError(),
kyle@3804
    86
						m_type, 
kyle@3804
    87
						m_serial);
kyle@3804
    88
	}
pred@2009
    89
kyle@3804
    90
	m_database->UnlockFromFullAtomicOperation();
pred@2009
    91
}
pred@2009
    92
pred@2009
    93
IDBDriver *TQueryOp::GetDriver()
pred@2009
    94
{
pred@2207
    95
	return m_database->GetDriver();
pred@2009
    96
}
dvander@2373
    97
pred@2009
    98
IdentityToken_t *TQueryOp::GetOwner()
pred@2009
    99
{
pred@2009
   100
	return myself->GetIdentity();
pred@2009
   101
}
pred@2220
   102
pred@2009
   103
void TQueryOp::Destroy()
pred@2009
   104
{
dvander@2373
   105
	if (m_pResult != NULL)
dvander@2373
   106
	{
dvander@2373
   107
		m_pResult->Destroy();
dvander@2373
   108
	}
pred@2009
   109
	delete this;
pred@2009
   110
}
pred@2009
   111
pred@2592
   112
TQueryOp::TQueryOp(enum querytype type, int serial)
pred@2009
   113
{
pred@2009
   114
	m_type = type;
pred@2592
   115
	m_serial = serial;
pred@2207
   116
	m_database = NULL;
dvander@2373
   117
	m_insertId = -1;
dvander@2373
   118
	m_pResult = NULL;
pred@2207
   119
}
pred@2009
   120
pred@2207
   121
TQueryOp::TQueryOp(enum querytype type, Cookie *cookie)
pred@2207
   122
{
pred@2207
   123
	m_type = type;
pred@2207
   124
	m_pCookie = cookie;
pred@2207
   125
	m_database = NULL;
dvander@2373
   126
	m_insertId = -1;
dvander@2373
   127
	m_pResult = NULL;
kyle@3804
   128
	m_serial = 0;
pred@2207
   129
}
pred@2207
   130
dvander@2373
   131
void TQueryOp::SetDatabase(IDatabase *db)
pred@2207
   132
{
pred@2207
   133
	m_database = db;
pred@2009
   134
}
pred@2009
   135
pred@2207
   136
bool TQueryOp::BindParamsAndRun()
pred@2207
   137
{
dvander@2373
   138
	size_t ignore;
dvander@2373
   139
	char query[2048];
pred@2207
   140
pred@2207
   141
	switch (m_type)
pred@2207
   142
	{
pred@2207
   143
		case Query_InsertCookie:
pred@2207
   144
		{
dvander@2373
   145
			char safe_name[MAX_NAME_LENGTH*2 + 1];
dvander@2373
   146
			char safe_desc[MAX_DESC_LENGTH*2 + 1];
dvander@2373
   147
			
dvander@2373
   148
			m_database->QuoteString(m_params.cookie->name, 
dvander@2373
   149
				safe_name, 
dvander@2373
   150
				sizeof(safe_name),
dvander@2373
   151
				&ignore);
dvander@2373
   152
			m_database->QuoteString(m_params.cookie->description,
dvander@2373
   153
				safe_desc,
dvander@2373
   154
				sizeof(safe_desc),
dvander@2373
   155
				&ignore);
pred@2207
   156
dvander@2373
   157
			if (g_DriverType == Driver_MySQL)
dvander@2373
   158
			{
kyle@3804
   159
				g_pSM->Format(query,
dvander@2373
   160
					sizeof(query),
dvander@2373
   161
					"INSERT IGNORE INTO sm_cookies (name, description, access) \
dvander@2373
   162
					 VALUES (\"%s\", \"%s\", %d)",
dvander@2373
   163
					safe_name,
dvander@2373
   164
					safe_desc,
dvander@2373
   165
					m_params.cookie->access);
dvander@2373
   166
			}
dvander@2373
   167
			else if (g_DriverType == Driver_SQLite)
dvander@2373
   168
			{
kyle@3804
   169
				g_pSM->Format(query,
dvander@2373
   170
					sizeof(query),
dvander@2373
   171
					"INSERT OR IGNORE INTO sm_cookies (name, description, access) \
dvander@2767
   172
					 VALUES ('%s', '%s', %d)",
dvander@2373
   173
					 safe_name,
dvander@2373
   174
					 safe_desc,
dvander@2373
   175
					 m_params.cookie->access);
dvander@2373
   176
			}
dvander@2373
   177
dvander@2373
   178
			if (!m_database->DoSimpleQuery(query))
dvander@2373
   179
			{
dvander@2373
   180
				return false;
dvander@2373
   181
			}
dvander@2373
   182
dvander@2373
   183
			m_insertId = m_database->GetInsertID();
dvander@2373
   184
dvander@2373
   185
			return true;
pred@2207
   186
		}
pred@2207
   187
pred@2207
   188
		case Query_SelectData:
pred@2207
   189
		{
dvander@2373
   190
			char safe_str[128];
dvander@2373
   191
dvander@2373
   192
			m_database->QuoteString(m_params.steamId, safe_str, sizeof(safe_str), &ignore);
pred@2207
   193
kyle@3804
   194
			g_pSM->Format(query,
dvander@2373
   195
				sizeof(query),
dvander@2373
   196
				"SELECT sm_cookies.name, sm_cookie_cache.value, sm_cookies.description, \
pred@2668
   197
						sm_cookies.access, sm_cookie_cache.timestamp 	\
dvander@2373
   198
				FROM sm_cookies				\
dvander@2373
   199
				JOIN sm_cookie_cache		\
dvander@2373
   200
				ON sm_cookies.id = sm_cookie_cache.cookie_id \
dvander@2767
   201
				WHERE player = '%s'",
dvander@2373
   202
				safe_str);
dvander@2373
   203
dvander@2373
   204
			m_pResult = m_database->DoQuery(query);
dvander@2373
   205
dvander@2373
   206
			return (m_pResult != NULL);
pred@2207
   207
		}
pred@2207
   208
pred@2207
   209
		case Query_InsertData:
pred@2207
   210
		{
dvander@2373
   211
			char safe_id[128];
dvander@2373
   212
			char safe_val[MAX_VALUE_LENGTH*2 + 1];
dvander@2373
   213
dvander@2373
   214
			m_database->QuoteString(m_params.steamId,
dvander@2373
   215
				safe_id,
dvander@2373
   216
				sizeof(safe_id),
dvander@2373
   217
				&ignore);
dvander@2373
   218
			m_database->QuoteString(m_params.data->value,
dvander@2373
   219
				safe_val,
dvander@2373
   220
				sizeof(safe_val),
dvander@2373
   221
				&ignore);
pred@2207
   222
dvander@2373
   223
			if (g_DriverType == Driver_MySQL)
pred@2207
   224
			{
kyle@3804
   225
				g_pSM->Format(query, 
dvander@2373
   226
					sizeof(query),
dvander@2373
   227
					"INSERT INTO sm_cookie_cache (player, cookie_id, value, timestamp) 	\
dvander@2373
   228
					 VALUES (\"%s\", %d, \"%s\", %d)									\
dvander@2373
   229
					 ON DUPLICATE KEY UPDATE											\
dvander@2373
   230
					 value = \"%s\", timestamp = %d",
dvander@2373
   231
					safe_id,
dvander@2373
   232
					m_params.cookieId,
dvander@2373
   233
					safe_val,
pred@2668
   234
					(unsigned int)m_params.data->timestamp,
dvander@2373
   235
					safe_val,
pred@2668
   236
					(unsigned int)m_params.data->timestamp);
dvander@2373
   237
			}
dvander@2373
   238
			else if (g_DriverType == Driver_SQLite)
dvander@2373
   239
			{
kyle@3804
   240
				g_pSM->Format(query,
dvander@2373
   241
					sizeof(query),
dvander@2373
   242
					"INSERT OR REPLACE INTO sm_cookie_cache						\
dvander@2373
   243
					 (player, cookie_id, value, timestamp)						\
dvander@2767
   244
					 VALUES ('%s', %d, '%s', %d)",
dvander@2373
   245
					safe_id,
dvander@2373
   246
					m_params.cookieId,
dvander@2373
   247
					safe_val,
pred@2668
   248
					(unsigned int)m_params.data->timestamp);
pred@2207
   249
			}
pred@2207
   250
dvander@2373
   251
			if (!m_database->DoSimpleQuery(query))
dvander@2373
   252
			{
dvander@2373
   253
				return false;
dvander@2373
   254
			}
dvander@2373
   255
dvander@2373
   256
			m_insertId = m_database->GetInsertID();
dvander@2373
   257
dvander@2373
   258
			return true;
pred@2207
   259
		}
pred@2207
   260
pred@2207
   261
		case Query_SelectId:
pred@2207
   262
		{
dvander@2373
   263
			char safe_name[MAX_NAME_LENGTH*2 + 1];
dvander@2373
   264
pred@2207
   265
			/* the steamId var was actually used to store the name of the cookie - Save duplicating vars */
dvander@2373
   266
			m_database->QuoteString(m_params.steamId, 
dvander@2373
   267
				safe_name,
dvander@2373
   268
				sizeof(safe_name),
dvander@2373
   269
				&ignore);
pred@2207
   270
kyle@3804
   271
			g_pSM->Format(query, 
dvander@2373
   272
				sizeof(query),
dvander@2767
   273
				"SELECT id FROM sm_cookies WHERE name = '%s'",
dvander@2373
   274
				safe_name);
dvander@2373
   275
dvander@2373
   276
			m_pResult = m_database->DoQuery(query);
dvander@2373
   277
dvander@2373
   278
			return (m_pResult != NULL);
pred@2207
   279
		}
pred@2207
   280
pred@2207
   281
		default:
pred@2207
   282
		{
pred@2207
   283
			break;
pred@2207
   284
		}
pred@2207
   285
			
pred@2207
   286
	}
pred@2207
   287
dvander@2373
   288
	assert(false);
pred@2207
   289
dvander@2373
   290
	return false;
pred@2207
   291
}
pred@2009
   292
kyle@3804
   293
querytype TQueryOp::PullQueryType()
kyle@3804
   294
{
kyle@3804
   295
	return m_type;
kyle@3804
   296
}
kyle@3804
   297
kyle@3804
   298
int TQueryOp::PullQuerySerial()
kyle@3804
   299
{
kyle@3804
   300
	return m_serial;
kyle@3804
   301
}
kyle@3804
   302
pred@2207
   303
ParamData::~ParamData()
pred@2207
   304
{
pred@2207
   305
	if (data)
pred@2207
   306
	{
pred@2207
   307
		/* Data is only ever passed in a client disconnect query and always needs to be deleted */
pred@2207
   308
		delete data;
pred@2207
   309
		data = NULL;
pred@2207
   310
	}
pred@2207
   311
}
pred@2207
   312
pred@2207
   313
ParamData::ParamData()
pred@2207
   314
{
pred@2207
   315
	cookie = NULL;
pred@2207
   316
	data = NULL;
pred@2207
   317
	steamId[0] = '\0';
pred@2207
   318
	cookieId = 0;
pred@2208
   319
}
dvander@2373
   320