Parent Directory | Revision Log
Revision 1 - (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 : | register_srvcmd("sqlx_test_old1", "SqlxTest_Old1") | ||
16 : | register_srvcmd("sqlx_test_old2", "SqlxTest_Old2") | ||
17 : | register_srvcmd("sqlx_test_thread_end", "SqlxTest_ThreadEnd") | ||
18 : | register_srvcmd("sqlx_test_bad", "SqlxTest_Bad") | ||
19 : | |||
20 : | new configsDir[64] | ||
21 : | get_configsdir(configsDir, 63) | ||
22 : | |||
23 : | server_cmd("exec %s/sql.cfg", configsDir) | ||
24 : | server_exec() | ||
25 : | } | ||
26 : | |||
27 : | DoBasicInfo(affinities=0) | ||
28 : | { | ||
29 : | new type[12] | ||
30 : | new affinity[12] | ||
31 : | new wanted_type[12] | ||
32 : | |||
33 : | dbi_type(type, 11) | ||
34 : | |||
35 : | server_print("DBI type: %s", type) | ||
36 : | |||
37 : | if (!affinities) | ||
38 : | return | ||
39 : | |||
40 : | SQL_GetAffinity(affinity, 11); | ||
41 : | server_print("SQLX Affinity: %s", affinity) | ||
42 : | |||
43 : | get_cvar_string("amx_sql_type", wanted_type, 11) | ||
44 : | if (!equal(wanted_type, affinity)) | ||
45 : | { | ||
46 : | if (g_DbInfo) | ||
47 : | { | ||
48 : | SQL_FreeHandle(g_DbInfo) | ||
49 : | g_DbInfo = Empty_Handle | ||
50 : | } | ||
51 : | new res = SQL_SetAffinity(wanted_type) | ||
52 : | server_print("Setting affinity from %s to %s: %s", | ||
53 : | affinity, | ||
54 : | wanted_type, | ||
55 : | res ? "Success" : "Failed") | ||
56 : | SQL_GetAffinity(affinity, 11) | ||
57 : | plugin_cfg() | ||
58 : | server_print("Verification: %s", affinity) | ||
59 : | } | ||
60 : | } | ||
61 : | |||
62 : | public plugin_cfg() | ||
63 : | { | ||
64 : | new host[64] | ||
65 : | new user[64] | ||
66 : | new pass[64] | ||
67 : | new db[64] | ||
68 : | |||
69 : | get_cvar_string("amx_sql_host", host, 63) | ||
70 : | get_cvar_string("amx_sql_user", user, 63) | ||
71 : | get_cvar_string("amx_sql_pass", pass, 63) | ||
72 : | get_cvar_string("amx_sql_db", db, 63) | ||
73 : | |||
74 : | g_DbInfo = SQL_MakeDbTuple(host, user, pass, db) | ||
75 : | } | ||
76 : | |||
77 : | public SqlxTest_Bad() | ||
78 : | { | ||
79 : | new errnum, error[255] | ||
80 : | new Handle:tempinfo = SQL_MakeDbTuple("1.2.3.4", "asdf", "gasdf", "gaben", 2) | ||
81 : | new Handle:db = SQL_Connect(tempinfo, errnum, error, 254) | ||
82 : | |||
83 : | if (db == Empty_Handle) | ||
84 : | { | ||
85 : | server_print(" --> Errored out! %d, %s", errnum, error) | ||
86 : | } else { | ||
87 : | server_print(" --> Something is wrong here.") | ||
88 : | } | ||
89 : | |||
90 : | return PLUGIN_HANDLED | ||
91 : | } | ||
92 : | |||
93 : | /** | ||
94 : | * Note that this function works for both threaded and non-threaded queries. | ||
95 : | */ | ||
96 : | PrintQueryData(Handle:query) | ||
97 : | { | ||
98 : | new columns = SQL_NumColumns(query) | ||
99 : | new rows = SQL_NumResults(query) | ||
100 : | static querystring[2048] | ||
101 : | |||
102 : | SQL_GetQueryString(query, querystring, 2047) | ||
103 : | |||
104 : | server_print("Original query string: %s", querystring) | ||
105 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
106 : | |||
107 : | new num | ||
108 : | new row | ||
109 : | new str[32] | ||
110 : | new cols[2][32] | ||
111 : | SQL_FieldNumToName(query, 0, cols[0], 31) | ||
112 : | SQL_FieldNumToName(query, 1, cols[1], 31) | ||
113 : | while (SQL_MoreResults(query)) | ||
114 : | { | ||
115 : | num = SQL_ReadResult(query, 0) | ||
116 : | SQL_ReadResult(query, 1, str, 31) | ||
117 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
118 : | SQL_NextRow(query) | ||
119 : | row++ | ||
120 : | } | ||
121 : | } | ||
122 : | |||
123 : | /** | ||
124 : | * Handler for when a threaded query is resolved. | ||
125 : | */ | ||
126 : | public GetMyStuff(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime) | ||
127 : | { | ||
128 : | server_print(" --> Resolved query %d, took %f seconds", data[0], queuetime) | ||
129 : | if (failstate) | ||
130 : | { | ||
131 : | if (failstate == TQUERY_CONNECT_FAILED) | ||
132 : | { | ||
133 : | server_print(" --> Connection failed!") | ||
134 : | } else if (failstate == TQUERY_QUERY_FAILED) { | ||
135 : | server_print(" --> Query failed!") | ||
136 : | } | ||
137 : | server_print(" --> Error code: %d (Message: ^"%s^")", errnum, error) | ||
138 : | |||
139 : | new querystring[1024] | ||
140 : | SQL_GetQueryString(query, querystring, 1023) | ||
141 : | server_print(" --> Original query: %s", querystring) | ||
142 : | } else { | ||
143 : | PrintQueryData(query) | ||
144 : | } | ||
145 : | } | ||
146 : | |||
147 : | /** | ||
148 : | * Starts a threaded query. | ||
149 : | */ | ||
150 : | public SqlxTest_Thread() | ||
151 : | { | ||
152 : | new query[512] | ||
153 : | new data[1] | ||
154 : | |||
155 : | data[0] = g_QueryNum | ||
156 : | format(query, 511, "SELECT * FROM gaben") | ||
157 : | |||
158 : | DoBasicInfo(1) | ||
159 : | |||
160 : | server_print("Adding to %d queue at: %f", g_QueryNum, get_gametime()) | ||
161 : | SQL_ThreadQuery(g_DbInfo, "GetMyStuff", query, data, 1) | ||
162 : | |||
163 : | g_QueryNum++ | ||
164 : | } | ||
165 : | |||
166 : | /** | ||
167 : | * Does a normal query. | ||
168 : | */ | ||
169 : | public SqlxTest_Normal() | ||
170 : | { | ||
171 : | new errnum, error[255] | ||
172 : | |||
173 : | DoBasicInfo(1) | ||
174 : | |||
175 : | new Handle:db = SQL_Connect(g_DbInfo, errnum, error, 254) | ||
176 : | if (!db) | ||
177 : | { | ||
178 : | server_print("Query failure: [%d] %s", errnum, error) | ||
179 : | return | ||
180 : | } | ||
181 : | |||
182 : | new Handle:query = SQL_PrepareQuery(db, "SELECT * FROM gaben") | ||
183 : | if (!SQL_Execute(query)) | ||
184 : | { | ||
185 : | errnum = SQL_QueryError(query, error, 254) | ||
186 : | server_print("Query failure: [%d] %s", errnum, error) | ||
187 : | SQL_FreeHandle(query) | ||
188 : | SQL_FreeHandle(db) | ||
189 : | return | ||
190 : | } | ||
191 : | |||
192 : | PrintQueryData(query) | ||
193 : | |||
194 : | SQL_FreeHandle(query) | ||
195 : | SQL_FreeHandle(db) | ||
196 : | } | ||
197 : | |||
198 : | /** | ||
199 : | * Wrapper for an old-style connection. | ||
200 : | */ | ||
201 : | Sql:OldInitDatabase() | ||
202 : | { | ||
203 : | new host[64] | ||
204 : | new user[64] | ||
205 : | new pass[64] | ||
206 : | new db[64] | ||
207 : | |||
208 : | get_cvar_string("amx_sql_host", host, 63) | ||
209 : | get_cvar_string("amx_sql_user", user, 63) | ||
210 : | get_cvar_string("amx_sql_pass", pass, 63) | ||
211 : | get_cvar_string("amx_sql_db", db, 63) | ||
212 : | |||
213 : | new error[255] | ||
214 : | new Sql:sql = dbi_connect(host, user, pass, db, error, 254) | ||
215 : | if (sql < SQL_OK) | ||
216 : | { | ||
217 : | server_print("Connection failure: %s", error) | ||
218 : | return SQL_FAILED | ||
219 : | } | ||
220 : | |||
221 : | return sql | ||
222 : | } | ||
223 : | |||
224 : | /** | ||
225 : | * Tests index-based lookup | ||
226 : | */ | ||
227 : | public SqlxTest_Old1() | ||
228 : | { | ||
229 : | DoBasicInfo() | ||
230 : | new Sql:sql = OldInitDatabase() | ||
231 : | if (sql < SQL_OK) | ||
232 : | return | ||
233 : | |||
234 : | new Result:res = dbi_query(sql, "SELECT * FROM gaben") | ||
235 : | |||
236 : | if (res == RESULT_FAILED) | ||
237 : | { | ||
238 : | new error[255] | ||
239 : | new code = dbi_error(sql, error, 254) | ||
240 : | server_print("Result failed! [%d]: %s", code, error) | ||
241 : | } else if (res == RESULT_NONE) { | ||
242 : | server_print("No result set returned.") | ||
243 : | } else { | ||
244 : | new cols[2][32] | ||
245 : | new str[32] | ||
246 : | new row, num | ||
247 : | new rows = dbi_num_rows(res) | ||
248 : | new columns = dbi_num_fields(res) | ||
249 : | |||
250 : | dbi_field_name(res, 1, cols[0], 31) | ||
251 : | dbi_field_name(res, 2, cols[1], 31) | ||
252 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
253 : | while (dbi_nextrow(res) > 0) | ||
254 : | { | ||
255 : | num = dbi_field(res, 1) | ||
256 : | dbi_field(res, 2, str, 31) | ||
257 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
258 : | row++ | ||
259 : | } | ||
260 : | dbi_free_result(res) | ||
261 : | } | ||
262 : | |||
263 : | dbi_close(sql) | ||
264 : | } | ||
265 : | |||
266 : | |||
267 : | /** | ||
268 : | * Tests name-based lookup | ||
269 : | */ | ||
270 : | public SqlxTest_Old2() | ||
271 : | { | ||
272 : | DoBasicInfo() | ||
273 : | new Sql:sql = OldInitDatabase() | ||
274 : | if (sql < SQL_OK) | ||
275 : | return | ||
276 : | |||
277 : | new Result:res = dbi_query(sql, "SELECT * FROM gaben") | ||
278 : | |||
279 : | if (res == RESULT_FAILED) | ||
280 : | { | ||
281 : | new error[255] | ||
282 : | new code = dbi_error(sql, error, 254) | ||
283 : | server_print("Result failed! [%d]: %s", code, error) | ||
284 : | } else if (res == RESULT_NONE) { | ||
285 : | server_print("No result set returned.") | ||
286 : | } else { | ||
287 : | new cols[2][32] | ||
288 : | new str[32] | ||
289 : | new row, num | ||
290 : | new rows = dbi_num_rows(res) | ||
291 : | new columns = dbi_num_fields(res) | ||
292 : | |||
293 : | dbi_field_name(res, 1, cols[0], 31) | ||
294 : | dbi_field_name(res, 2, cols[1], 31) | ||
295 : | server_print("Query columns: %d rows: %d", columns, rows) | ||
296 : | while (dbi_nextrow(res) > 0) | ||
297 : | { | ||
298 : | num = dbi_result(res, cols[0]) | ||
299 : | dbi_result(res, cols[1], str, 31) | ||
300 : | server_print("[%d]: %s=%d, %s=%s", row, cols[0], num, cols[1], str) | ||
301 : | row++ | ||
302 : | } | ||
303 : | dbi_free_result(res) | ||
304 : | } | ||
305 : | |||
306 : | dbi_close(sql) | ||
307 : | } | ||
308 : | |||
309 : | public SqlxTest_ThreadEnd() | ||
310 : | { | ||
311 : | if (read_argc() < 2) | ||
312 : | { | ||
313 : | server_print("Requires mapname!") | ||
314 : | } else { | ||
315 : | new mapname[64] | ||
316 : | |||
317 : | read_argv(1, mapname, 63) | ||
318 : | if (!is_map_valid(mapname)) | ||
319 : | { | ||
320 : | server_print("Invalid map: %s", mapname) | ||
321 : | } else { | ||
322 : | g_TestEnd = true | ||
323 : | server_cmd("changelevel %s", mapname) | ||
324 : | } | ||
325 : | } | ||
326 : | |||
327 : | return PLUGIN_HANDLED | ||
328 : | } | ||
329 : | |||
330 : | |||
331 : | public plugin_end() | ||
332 : | { | ||
333 : | if (g_TestEnd) | ||
334 : | { | ||
335 : | SqlxTest_Thread() | ||
336 : | } else { | ||
337 : | SQL_FreeHandle(g_DbInfo) | ||
338 : | } | ||
339 : | } |
Contact | ViewVC Help |
Powered by ViewVC 1.0.4 |