Parent Directory | Revision Log
Revision 17 - (view) (download)
1 : | ian | 1 | #include <amxmodx> |
2 : | #include <amxmisc> | ||
3 : | #include <dbi> | ||
4 : | #include <sqlx> | ||
5 : | |||
6 : | new Handle:g_DbInfo | ||
7 : | new g_QueryNum | ||
8 : | new bool:g_TestEnd = false | ||
9 : | |||
10 : | public plugin_init() | ||
11 : | { | ||
12 : | register_plugin("SQLX Test", "1.0", "BAILOPAN") | ||
13 : | register_srvcmd("sqlx_test_normal", "SqlxTest_Normal") | ||
14 : | register_srvcmd("sqlx_test_thread", "SqlxTest_Thread") | ||
15 : | ian | 17 | register_srvcmd("sqlx_test_proc", "SqlxTest_Proc") |
16 : | ian | 1 | register_srvcmd("sqlx_test_old1", "SqlxTest_Old1") |
17 : | register_srvcmd("sqlx_test_old2", "SqlxTest_Old2") | ||
18 : | register_srvcmd("sqlx_test_thread_end", "SqlxTest_ThreadEnd") | ||
19 : | register_srvcmd("sqlx_test_bad", "SqlxTest_Bad") | ||
20 : | ian | 17 | register_srvcmd("sqlx_test_quote", "SqlxTest_Quote") |
21 : | register_srvcmd("sqlx_test_affinity", "SqlxTest_Affinity") | ||
22 : | ian | 1 | |
23 : | new configsDir[64] | ||
24 : | get_configsdir(configsDir, 63) | ||
25 : | |||
26 : | server_cmd("exec %s/sql.cfg", configsDir) | ||
27 : | ian | 17 | |
28 : | set_task(2.0, "start_map") | ||
29 : | ian | 1 | } |
30 : | |||
31 : | DoBasicInfo(affinities=0) | ||
32 : | { | ||
33 : | new type[12] | ||
34 : | new affinity[12] | ||
35 : | new wanted_type[12] | ||
36 : | |||
37 : | dbi_type(type, 11) | ||
38 : | |||
39 : | server_print("DBI type: %s", type) | ||
40 : | |||
41 : | if (!affinities) | ||
42 : | return | ||
43 : | |||
44 : | SQL_GetAffinity(affinity, 11); | ||
45 : | server_print("SQLX Affinity: %s", affinity) | ||
46 : | |||
47 : | get_cvar_string("amx_sql_type", wanted_type, 11) | ||
48 : | if (!equal(wanted_type, affinity)) | ||
49 : | { | ||
50 : | if (g_DbInfo) | ||
51 : | { | ||
52 : | SQL_FreeHandle(g_DbInfo) | ||
53 : | g_DbInfo = Empty_Handle | ||
54 : | } | ||
55 : | new res = SQL_SetAffinity(wanted_type) | ||
56 : | server_print("Setting affinity from %s to %s: %s", | ||
57 : | affinity, | ||
58 : | wanted_type, | ||
59 : | res ? "Success" : "Failed") | ||
60 : | SQL_GetAffinity(affinity, 11) | ||
61 : | ian | 17 | start_map() |
62 : | ian | 1 | server_print("Verification: %s", affinity) |
63 : | } | ||
64 : | } | ||
65 : | |||
66 : | ian | 17 | public start_map() |
67 : | ian | 1 | { |
68 : | new host[64] | ||
69 : | new user[64] | ||
70 : | new pass[64] | ||
71 : | new db[64] | ||
72 : | |||
73 : | get_cvar_string("amx_sql_host", host, 63) | ||
74 : | get_cvar_string("amx_sql_user", user, 63) | ||
75 : | get_cvar_string("amx_sql_pass", pass, 63) | ||
76 : | get_cvar_string("amx_sql_db", db, 63) | ||
77 : | |||
78 : | g_DbInfo = SQL_MakeDbTuple(host, user, pass, db) | ||
79 : | } | ||
80 : | |||
81 : | public SqlxTest_Bad() | ||
82 : | { | ||
83 : | new errnum, error[255] | ||
84 : | new Handle:tempinfo = SQL_MakeDbTuple("1.2.3.4", "asdf", "gasdf", "gaben", 2) | ||
85 : | new Handle:db = SQL_Connect(tempinfo, errnum, error, 254) | ||
86 : | |||
87 : | if (db == Empty_Handle) | ||
88 : | { | ||
89 : | server_print(" --> Errored out! %d, %s", errnum, error) | ||
90 : | } else { | ||
91 : | server_print(" --> Something is wrong here.") | ||
92 : | } | ||
93 : | |||
94 : | return PLUGIN_HANDLED | ||
95 : | } | ||
96 : | |||
97 : | /** | ||
98 : | * Note that this function works for both threaded and non-threaded queries. | ||
99 : | */ | ||
100 : | PrintQueryData(Handle:query) | ||
101 : | { | ||
102 : | new columns = SQL_NumColumns(query) | ||
103 : | new rows = SQL_NumResults(query) | ||
104 : | static querystring[2048] | ||
105 : | |||
106 : | SQL_GetQueryString(query, querystring, 2047) | ||
107 : | |||
108 : | server_print("Original query string: %s", querystring) | ||
109 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
110 : | |||
111 : | new num | ||
112 : | new row | ||
113 : | new str[32] | ||
114 : | new cols[2][32] | ||
115 : | SQL_FieldNumToName(query, 0, cols[0], 31) | ||
116 : | SQL_FieldNumToName(query, 1, cols[1], 31) | ||
117 : | while (SQL_MoreResults(query)) | ||
118 : | { | ||
119 : | num = SQL_ReadResult(query, 0) | ||
120 : | SQL_ReadResult(query, 1, str, 31) | ||
121 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
122 : | SQL_NextRow(query) | ||
123 : | row++ | ||
124 : | } | ||
125 : | } | ||
126 : | |||
127 : | /** | ||
128 : | * Handler for when a threaded query is resolved. | ||
129 : | */ | ||
130 : | public GetMyStuff(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime) | ||
131 : | { | ||
132 : | server_print(" --> Resolved query %d, took %f seconds", data[0], queuetime) | ||
133 : | if (failstate) | ||
134 : | { | ||
135 : | if (failstate == TQUERY_CONNECT_FAILED) | ||
136 : | { | ||
137 : | server_print(" --> Connection failed!") | ||
138 : | } else if (failstate == TQUERY_QUERY_FAILED) { | ||
139 : | server_print(" --> Query failed!") | ||
140 : | } | ||
141 : | server_print(" --> Error code: %d (Message: ^"%s^")", errnum, error) | ||
142 : | |||
143 : | new querystring[1024] | ||
144 : | SQL_GetQueryString(query, querystring, 1023) | ||
145 : | server_print(" --> Original query: %s", querystring) | ||
146 : | } else { | ||
147 : | PrintQueryData(query) | ||
148 : | } | ||
149 : | } | ||
150 : | |||
151 : | ian | 17 | public SqlxTest_Affinity() |
152 : | { | ||
153 : | server_print("[Access Manager] try SetAffinity to sqlite"); | ||
154 : | SQL_SetAffinity("sqlite"); | ||
155 : | server_print("[Access Manager] try SetAffinity to mysql"); | ||
156 : | SQL_SetAffinity("mysql"); | ||
157 : | server_print("[Access Manager] try SetAffinity to sqlite again"); | ||
158 : | SQL_SetAffinity("sqlite"); | ||
159 : | } | ||
160 : | |||
161 : | ian | 1 | /** |
162 : | * Starts a threaded query. | ||
163 : | */ | ||
164 : | public SqlxTest_Thread() | ||
165 : | { | ||
166 : | new query[512] | ||
167 : | new data[1] | ||
168 : | |||
169 : | data[0] = g_QueryNum | ||
170 : | format(query, 511, "SELECT * FROM gaben") | ||
171 : | |||
172 : | DoBasicInfo(1) | ||
173 : | |||
174 : | server_print("Adding to %d queue at: %f", g_QueryNum, get_gametime()) | ||
175 : | SQL_ThreadQuery(g_DbInfo, "GetMyStuff", query, data, 1) | ||
176 : | |||
177 : | g_QueryNum++ | ||
178 : | } | ||
179 : | |||
180 : | /** | ||
181 : | ian | 17 | * Tests string quoting |
182 : | */ | ||
183 : | public SqlxTest_Quote() | ||
184 : | { | ||
185 : | DoBasicInfo(1) | ||
186 : | |||
187 : | new errno, error[255] | ||
188 : | |||
189 : | new Handle:db = SQL_Connect(g_DbInfo, errno, error, sizeof(error)-1) | ||
190 : | if (!db) | ||
191 : | { | ||
192 : | server_print("Query failure: [%d] %s", errno, error) | ||
193 : | return | ||
194 : | } | ||
195 : | |||
196 : | new buffer[500], num | ||
197 : | num = SQL_QuoteString(db, buffer, sizeof(buffer)-1, "Hi y'all! C\lam") | ||
198 : | |||
199 : | server_print("num: %d str: %s", num, buffer) | ||
200 : | |||
201 : | SQL_FreeHandle(db) | ||
202 : | } | ||
203 : | |||
204 : | public SqlxTest_Proc() | ||
205 : | { | ||
206 : | new errnum, error[255] | ||
207 : | |||
208 : | DoBasicInfo(1) | ||
209 : | |||
210 : | new Handle:db = SQL_Connect(g_DbInfo, errnum, error, 254) | ||
211 : | if (!db) | ||
212 : | { | ||
213 : | server_print("Query failure: [%d] %s", errnum, error) | ||
214 : | return | ||
215 : | } | ||
216 : | |||
217 : | new Handle:query = SQL_PrepareQuery(db, "CALL ExampleProc()") | ||
218 : | if (!SQL_Execute(query)) | ||
219 : | { | ||
220 : | errnum = SQL_QueryError(query, error, 254) | ||
221 : | server_print("Query failure: [%d] %s", errnum, error) | ||
222 : | SQL_FreeHandle(query) | ||
223 : | SQL_FreeHandle(db) | ||
224 : | return | ||
225 : | } | ||
226 : | |||
227 : | PrintQueryData(query) | ||
228 : | |||
229 : | server_print("Next result: %d", SQL_NextResultSet(query)); | ||
230 : | |||
231 : | PrintQueryData(query) | ||
232 : | |||
233 : | SQL_FreeHandle(query) | ||
234 : | SQL_FreeHandle(db) | ||
235 : | } | ||
236 : | |||
237 : | /** | ||
238 : | ian | 1 | * Does a normal query. |
239 : | */ | ||
240 : | public SqlxTest_Normal() | ||
241 : | { | ||
242 : | new errnum, error[255] | ||
243 : | |||
244 : | DoBasicInfo(1) | ||
245 : | |||
246 : | new Handle:db = SQL_Connect(g_DbInfo, errnum, error, 254) | ||
247 : | if (!db) | ||
248 : | { | ||
249 : | server_print("Query failure: [%d] %s", errnum, error) | ||
250 : | return | ||
251 : | } | ||
252 : | |||
253 : | new Handle:query = SQL_PrepareQuery(db, "SELECT * FROM gaben") | ||
254 : | if (!SQL_Execute(query)) | ||
255 : | { | ||
256 : | errnum = SQL_QueryError(query, error, 254) | ||
257 : | server_print("Query failure: [%d] %s", errnum, error) | ||
258 : | SQL_FreeHandle(query) | ||
259 : | SQL_FreeHandle(db) | ||
260 : | return | ||
261 : | } | ||
262 : | |||
263 : | PrintQueryData(query) | ||
264 : | |||
265 : | ian | 17 | server_print("Next result: %d", SQL_NextResultSet(query)); |
266 : | |||
267 : | ian | 1 | SQL_FreeHandle(query) |
268 : | SQL_FreeHandle(db) | ||
269 : | } | ||
270 : | |||
271 : | /** | ||
272 : | * Wrapper for an old-style connection. | ||
273 : | */ | ||
274 : | Sql:OldInitDatabase() | ||
275 : | { | ||
276 : | new host[64] | ||
277 : | new user[64] | ||
278 : | new pass[64] | ||
279 : | new db[64] | ||
280 : | |||
281 : | get_cvar_string("amx_sql_host", host, 63) | ||
282 : | get_cvar_string("amx_sql_user", user, 63) | ||
283 : | get_cvar_string("amx_sql_pass", pass, 63) | ||
284 : | get_cvar_string("amx_sql_db", db, 63) | ||
285 : | |||
286 : | new error[255] | ||
287 : | new Sql:sql = dbi_connect(host, user, pass, db, error, 254) | ||
288 : | if (sql < SQL_OK) | ||
289 : | { | ||
290 : | server_print("Connection failure: %s", error) | ||
291 : | return SQL_FAILED | ||
292 : | } | ||
293 : | |||
294 : | return sql | ||
295 : | } | ||
296 : | |||
297 : | /** | ||
298 : | * Tests index-based lookup | ||
299 : | */ | ||
300 : | public SqlxTest_Old1() | ||
301 : | { | ||
302 : | DoBasicInfo() | ||
303 : | new Sql:sql = OldInitDatabase() | ||
304 : | if (sql < SQL_OK) | ||
305 : | return | ||
306 : | |||
307 : | new Result:res = dbi_query(sql, "SELECT * FROM gaben") | ||
308 : | |||
309 : | if (res == RESULT_FAILED) | ||
310 : | { | ||
311 : | new error[255] | ||
312 : | new code = dbi_error(sql, error, 254) | ||
313 : | server_print("Result failed! [%d]: %s", code, error) | ||
314 : | } else if (res == RESULT_NONE) { | ||
315 : | server_print("No result set returned.") | ||
316 : | } else { | ||
317 : | new cols[2][32] | ||
318 : | new str[32] | ||
319 : | new row, num | ||
320 : | new rows = dbi_num_rows(res) | ||
321 : | new columns = dbi_num_fields(res) | ||
322 : | |||
323 : | dbi_field_name(res, 1, cols[0], 31) | ||
324 : | dbi_field_name(res, 2, cols[1], 31) | ||
325 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
326 : | while (dbi_nextrow(res) > 0) | ||
327 : | { | ||
328 : | num = dbi_field(res, 1) | ||
329 : | dbi_field(res, 2, str, 31) | ||
330 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
331 : | row++ | ||
332 : | } | ||
333 : | dbi_free_result(res) | ||
334 : | } | ||
335 : | |||
336 : | dbi_close(sql) | ||
337 : | } | ||
338 : | |||
339 : | |||
340 : | /** | ||
341 : | * Tests name-based lookup | ||
342 : | */ | ||
343 : | public SqlxTest_Old2() | ||
344 : | { | ||
345 : | DoBasicInfo() | ||
346 : | new Sql:sql = OldInitDatabase() | ||
347 : | if (sql < SQL_OK) | ||
348 : | return | ||
349 : | |||
350 : | new Result:res = dbi_query(sql, "SELECT * FROM gaben") | ||
351 : | |||
352 : | if (res == RESULT_FAILED) | ||
353 : | { | ||
354 : | new error[255] | ||
355 : | new code = dbi_error(sql, error, 254) | ||
356 : | server_print("Result failed! [%d]: %s", code, error) | ||
357 : | } else if (res == RESULT_NONE) { | ||
358 : | server_print("No result set returned.") | ||
359 : | } else { | ||
360 : | new cols[2][32] | ||
361 : | new str[32] | ||
362 : | new row, num | ||
363 : | new rows = dbi_num_rows(res) | ||
364 : | new columns = dbi_num_fields(res) | ||
365 : | |||
366 : | dbi_field_name(res, 1, cols[0], 31) | ||
367 : | dbi_field_name(res, 2, cols[1], 31) | ||
368 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
369 : | while (dbi_nextrow(res) > 0) | ||
370 : | { | ||
371 : | num = dbi_result(res, cols[0]) | ||
372 : | dbi_result(res, cols[1], str, 31) | ||
373 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
374 : | row++ | ||
375 : | } | ||
376 : | dbi_free_result(res) | ||
377 : | } | ||
378 : | |||
379 : | dbi_close(sql) | ||
380 : | } | ||
381 : | |||
382 : | public SqlxTest_ThreadEnd() | ||
383 : | { | ||
384 : | if (read_argc() < 2) | ||
385 : | { | ||
386 : | server_print("Requires mapname!") | ||
387 : | } else { | ||
388 : | new mapname[64] | ||
389 : | |||
390 : | read_argv(1, mapname, 63) | ||
391 : | if (!is_map_valid(mapname)) | ||
392 : | { | ||
393 : | server_print("Invalid map: %s", mapname) | ||
394 : | } else { | ||
395 : | g_TestEnd = true | ||
396 : | server_cmd("changelevel %s", mapname) | ||
397 : | } | ||
398 : | } | ||
399 : | |||
400 : | return PLUGIN_HANDLED | ||
401 : | } | ||
402 : | |||
403 : | |||
404 : | public plugin_end() | ||
405 : | { | ||
406 : | if (g_TestEnd) | ||
407 : | { | ||
408 : | SqlxTest_Thread() | ||
409 : | } else { | ||
410 : | SQL_FreeHandle(g_DbInfo) | ||
411 : | } | ||
412 : | } |
Contact | ViewVC Help |
Powered by ViewVC 1.0.4 |