1 // Copyright (c) 1999-2018 David Muse
2 // See the file COPYING for more information.
3 
4 #include "../../config.h"
5 #include <sqlrelay/sqlrclientwrapper.h>
6 #include <string.h>
7 #include <stdlib.h>
8 
9 #include <stdio.h>
10 
11 sqlrcon	con;
12 sqlrcur	cur;
13 sqlrcon	secondcon;
14 sqlrcur	secondcur;
15 
checkSuccessString(const char * value,const char * success)16 void checkSuccessString(const char *value, const char *success) {
17 
18 	if (!success) {
19 		if (!value) {
20 			printf("success ");
21 			return;
22 		} else {
23 			printf("\"%s\"!=\"%s\"",value,success);
24 			printf("failure ");
25 			sqlrcur_free(cur);
26 			sqlrcon_free(con);
27 			exit(1);
28 		}
29 	}
30 
31 	if (!strcmp(value,success)) {
32 		printf("success ");
33 	} else {
34 		printf("\"%s\"!=\"%s\"",value,success);
35 		printf("failure ");
36 		sqlrcur_free(cur);
37 		sqlrcon_free(con);
38 		exit(1);
39 	}
40 }
41 
checkSuccessInt(int value,int success)42 void checkSuccessInt(int value, int success) {
43 
44 	if (value==success) {
45 		printf("success ");
46 	} else {
47 		printf("\"%d\"!=\"%d\"",value,success);
48 		printf("failure ");
49 		sqlrcur_free(cur);
50 		sqlrcon_free(con);
51 		exit(1);
52 	}
53 }
54 
main(int argc,char ** argv)55 int	main(int argc, char **argv) {
56 
57 	const char	*subvars[4]={"var1","var2","var3",NULL};
58 	const char	*subvalstrings[3]={"hi","hello","bye"};
59 	int64_t		subvallongs[3]={1,2,3};
60 	double		subvaldoubles[3]={10.55,10.556,10.5556};
61 	uint32_t	precs[3]={4,5,6};
62 	uint32_t	scales[3]={2,3,4};
63 	const char * const *cols;
64 	const char * const *fields;
65 	uint16_t	port;
66 	const char	*socket;
67 	uint16_t	id;
68 	char		*filename;
69 	uint32_t	*fieldlens;
70 
71 	// instantiation
72 	con=sqlrcon_alloc("sqlrelay",9000,
73 				"/tmp/test.socket","test","test",0,1);
74 	cur=sqlrcur_alloc(con);
75 
76 	// get database type
77 	printf("IDENTIFY: \n");
78 	checkSuccessString(sqlrcon_identify(con),"sqlite");
79 	printf("\n");
80 
81 	// ping
82 	printf("PING: \n");
83 	checkSuccessInt(sqlrcon_ping(con),1);
84 	printf("\n");
85 
86 	// drop existing table
87 	sqlrcur_sendQuery(cur,"begin transaction");
88 	sqlrcur_sendQuery(cur,"drop table testtable");
89 	sqlrcon_commit(con);
90 
91 	// create a new table
92 	printf("CREATE TEMPTABLE: \n");
93 	sqlrcur_sendQuery(cur,"begin transaction");
94 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable (testint int, testfloat float, testchar char(40), testvarchar varchar(40))"),1);
95 	sqlrcon_commit(con);
96 	printf("\n");
97 
98 	printf("INSERT: \n");
99 	sqlrcur_sendQuery(cur,"begin transaction");
100 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (1,1.1,'testchar1','testvarchar1')"),1);
101 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (2,2.2,'testchar2','testvarchar2')"),1);
102 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (3,3.3,'testchar3','testvarchar3')"),1);
103 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (4,4.4,'testchar4','testvarchar4')"),1);
104 	printf("\n");
105 
106 	printf("AFFECTED ROWS: \n");
107 	checkSuccessInt(sqlrcur_affectedRows(cur),0);
108 	printf("\n");
109 
110 	printf("BIND BY NAME: \n");
111 	sqlrcur_prepareQuery(cur,"insert into testtable values (:var1,:var2,:var3,:var4)");
112 	checkSuccessInt(sqlrcur_countBindVariables(cur),4);
113 	sqlrcur_inputBindLong(cur,"var1",5);
114 	sqlrcur_inputBindDouble(cur,"var2",5.5,4,1);
115 	sqlrcur_inputBindString(cur,"var3","testchar5");
116 	sqlrcur_inputBindString(cur,"var4","testvarchar5");
117 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
118 	sqlrcur_clearBinds(cur);
119 	sqlrcur_inputBindLong(cur,"var1",6);
120 	sqlrcur_inputBindDouble(cur,"var2",6.6,4,1);
121 	sqlrcur_inputBindString(cur,"var3","testchar6");
122 	sqlrcur_inputBindString(cur,"var4","testvarchar6");
123 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
124 	sqlrcur_clearBinds(cur);
125 	sqlrcur_inputBindLong(cur,"var1",7);
126 	sqlrcur_inputBindDouble(cur,"var2",7.7,4,1);
127 	sqlrcur_inputBindString(cur,"var3","testchar7");
128 	sqlrcur_inputBindString(cur,"var4","testvarchar7");
129 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
130 	printf("\n");
131 
132 	printf("BIND BY NAME WITH VALIDATION: \n");
133 	sqlrcur_clearBinds(cur);
134 	sqlrcur_inputBindLong(cur,"var1",8);
135 	sqlrcur_inputBindDouble(cur,"var2",8.8,4,1);
136 	sqlrcur_inputBindString(cur,"var3","testchar8");
137 	sqlrcur_inputBindString(cur,"var4","testvarchar8");
138 	sqlrcur_validateBinds(cur);
139 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
140 	printf("\n");
141 
142 	printf("SELECT: \n");
143 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
144 	printf("\n");
145 
146 	printf("COLUMN COUNT: \n");
147 	checkSuccessInt(sqlrcur_colCount(cur),4);
148 	printf("\n");
149 
150 	printf("COLUMN NAMES: \n");
151 	checkSuccessString(sqlrcur_getColumnName(cur,0),"testint");
152 	checkSuccessString(sqlrcur_getColumnName(cur,1),"testfloat");
153 	checkSuccessString(sqlrcur_getColumnName(cur,2),"testchar");
154 	checkSuccessString(sqlrcur_getColumnName(cur,3),"testvarchar");
155 	cols=sqlrcur_getColumnNames(cur);
156 	checkSuccessString(cols[0],"testint");
157 	checkSuccessString(cols[1],"testfloat");
158 	checkSuccessString(cols[2],"testchar");
159 	checkSuccessString(cols[3],"testvarchar");
160 	printf("\n");
161 
162 	printf("COLUMN TYPES: \n");
163 	#ifdef HAVE_SQLITE3_STMT
164 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,0),"INTEGER");
165 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testint"),"INTEGER");
166 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,1),"FLOAT");
167 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testfloat"),"FLOAT");
168 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,2),"STRING");
169 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testchar"),"STRING");
170 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,3),"STRING");
171 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testvarchar"),"STRING");
172 	#else
173 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,0),"UNKNOWN");
174 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testint"),"UNKNOWN");
175 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,1),"UNKNOWN");
176 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testfloat"),"UNKNOWN");
177 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,2),"UNKNOWN");
178 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testchar"),"UNKNOWN");
179 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,3),"UNKNOWN");
180 	checkSuccessString(sqlrcur_getColumnTypeByName(cur,"testvarchar"),"UNKNOWN");
181 	#endif
182 	printf("\n");
183 
184 	printf("COLUMN LENGTH: \n");
185 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,0),0);
186 	checkSuccessInt(sqlrcur_getColumnLengthByName(cur,"testint"),0);
187 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,1),0);
188 	checkSuccessInt(sqlrcur_getColumnLengthByName(cur,"testfloat"),0);
189 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,2),0);
190 	checkSuccessInt(sqlrcur_getColumnLengthByName(cur,"testchar"),0);
191 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,3),0);
192 	checkSuccessInt(sqlrcur_getColumnLengthByName(cur,"testvarchar"),0);
193 	printf("\n");
194 
195 	printf("LONGEST COLUMN: \n");
196 	checkSuccessInt(sqlrcur_getLongestByIndex(cur,0),1);
197 	checkSuccessInt(sqlrcur_getLongestByName(cur,"testint"),1);
198 	checkSuccessInt(sqlrcur_getLongestByIndex(cur,1),3);
199 	checkSuccessInt(sqlrcur_getLongestByName(cur,"testfloat"),3);
200 	checkSuccessInt(sqlrcur_getLongestByIndex(cur,2),9);
201 	checkSuccessInt(sqlrcur_getLongestByName(cur,"testchar"),9);
202 	checkSuccessInt(sqlrcur_getLongestByIndex(cur,3),12);
203 	checkSuccessInt(sqlrcur_getLongestByName(cur,"testvarchar"),12);
204 	printf("\n");
205 
206 	printf("ROW COUNT: \n");
207 	checkSuccessInt(sqlrcur_rowCount(cur),8);
208 	printf("\n");
209 
210 	printf("TOTAL ROWS: \n");
211 	#ifdef HAVE_SQLITE3_STMT
212 	checkSuccessInt(sqlrcur_totalRows(cur),0);
213 	#else
214 	checkSuccessInt(sqlrcur_totalRows(cur),8);
215 	#endif
216 	printf("\n");
217 
218 	printf("FIRST ROW INDEX: \n");
219 	checkSuccessInt(sqlrcur_firstRowIndex(cur),0);
220 	printf("\n");
221 
222 	printf("END OF RESULT SET: \n");
223 	checkSuccessInt(sqlrcur_endOfResultSet(cur),1);
224 	printf("\n");
225 
226 	printf("FIELDS BY INDEX: \n");
227 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
228 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"1.1");
229 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"testchar1");
230 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,3),"testvarchar1");
231 	printf("\n");
232 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
233 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,1),"8.8");
234 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,2),"testchar8");
235 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,3),"testvarchar8");
236 	printf("\n");
237 
238 	printf("FIELD LENGTHS BY INDEX: \n");
239 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,0,0),1);
240 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,0,1),3);
241 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,0,2),9);
242 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,0,3),12);
243 	printf("\n");
244 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,7,0),1);
245 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,7,1),3);
246 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,7,2),9);
247 	checkSuccessInt(sqlrcur_getFieldLengthByIndex(cur,7,3),12);
248 	printf("\n");
249 
250 	printf("FIELDS BY NAME: \n");
251 	checkSuccessString(sqlrcur_getFieldByName(cur,0,"testint"),"1");
252 	checkSuccessString(sqlrcur_getFieldByName(cur,0,"testfloat"),"1.1");
253 	checkSuccessString(sqlrcur_getFieldByName(cur,0,"testchar"),"testchar1");
254 	checkSuccessString(sqlrcur_getFieldByName(cur,0,"testvarchar"),"testvarchar1");
255 	printf("\n");
256 	checkSuccessString(sqlrcur_getFieldByName(cur,7,"testint"),"8");
257 	checkSuccessString(sqlrcur_getFieldByName(cur,7,"testfloat"),"8.8");
258 	checkSuccessString(sqlrcur_getFieldByName(cur,7,"testchar"),"testchar8");
259 	checkSuccessString(sqlrcur_getFieldByName(cur,7,"testvarchar"),"testvarchar8");
260 	printf("\n");
261 
262 	printf("FIELD LENGTHS BY NAME: \n");
263 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,0,"testint"),1);
264 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,0,"testfloat"),3);
265 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,0,"testchar"),9);
266 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,0,"testvarchar"),12);
267 	printf("\n");
268 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,7,"testint"),1);
269 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,7,"testfloat"),3);
270 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,7,"testchar"),9);
271 	checkSuccessInt(sqlrcur_getFieldLengthByName(cur,7,"testvarchar"),12);
272 	printf("\n");
273 
274 	printf("FIELDS BY ARRAY: \n");
275 	fields=sqlrcur_getRow(cur,0);
276 	checkSuccessString(fields[0],"1");
277 	checkSuccessString(fields[1],"1.1");
278 	checkSuccessString(fields[2],"testchar1");
279 	checkSuccessString(fields[3],"testvarchar1");
280 	printf("\n");
281 
282 	printf("FIELD LENGTHS BY ARRAY: \n");
283 	fieldlens=sqlrcur_getRowLengths(cur,0);
284 	checkSuccessInt(fieldlens[0],1);
285 	checkSuccessInt(fieldlens[1],3);
286 	checkSuccessInt(fieldlens[2],9);
287 	checkSuccessInt(fieldlens[3],12);
288 	printf("\n");
289 
290 	printf("INDIVIDUAL SUBSTITUTIONS: \n");
291 	sqlrcur_sendQuery(cur,"drop table testtable1");
292 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable1 (col1 int, col2 char, col3 float)"),1);
293 	sqlrcur_prepareQuery(cur,"insert into testtable1 values ($(var1),'$(var2)',$(var3))");
294 	sqlrcur_subLong(cur,"var1",1);
295 	sqlrcur_subString(cur,"var2","hello");
296 	sqlrcur_subDouble(cur,"var3",10.5556,6,4);
297 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
298 	printf("\n");
299 
300 	printf("FIELDS: \n");
301 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
302 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
303 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"hello");
304 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"10.5556");
305 	checkSuccessInt(sqlrcur_sendQuery(cur,"delete from testtable1"),1);
306 	printf("\n");
307 
308 	printf("ARRAY SUBSTITUTIONS: \n");
309 	sqlrcur_prepareQuery(cur,"insert into testtable1 values ('$(var1)','$(var2)','$(var3)')");
310 	sqlrcur_subStrings(cur,subvars,subvalstrings);
311 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
312 	printf("\n");
313 
314 	printf("FIELDS: \n");
315 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
316 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"hi");
317 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"hello");
318 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"bye");
319 	checkSuccessInt(sqlrcur_sendQuery(cur,"delete from testtable1"),1);
320 	printf("\n");
321 
322 
323 	printf("ARRAY SUBSTITUTIONS: \n");
324 	sqlrcur_prepareQuery(cur,"insert into testtable1 values ($(var1),'$(var2)',$(var3))");
325 	sqlrcur_subLongs(cur,subvars,subvallongs);
326 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
327 	printf("\n");
328 
329 	printf("FIELDS: \n");
330 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
331 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
332 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"2");
333 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"3.0");
334 	checkSuccessInt(sqlrcur_sendQuery(cur,"delete from testtable1"),1);
335 	printf("\n");
336 
337 
338 	printf("ARRAY SUBSTITUTIONS: \n");
339 	sqlrcur_prepareQuery(cur,"insert into testtable1 values ($(var1),'$(var2)',$(var3))");
340 	sqlrcur_subDoubles(cur,subvars,subvaldoubles,precs,scales);
341 	checkSuccessInt(sqlrcur_executeQuery(cur),1);
342 	printf("\n");
343 
344 	printf("FIELDS: \n");
345 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
346 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"10.55");
347 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"10.556");
348 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"10.5556");
349 	checkSuccessInt(sqlrcur_sendQuery(cur,"delete from testtable1"),1);
350 	printf("\n");
351 
352 
353 	printf("NULLS as Nulls: \n");
354 	sqlrcur_getNullsAsNulls(cur);
355 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable1 values (1,NULL,NULL)"),1);
356 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
357 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
358 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),NULL);
359 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),NULL);
360 	sqlrcur_getNullsAsEmptyStrings(cur);
361 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable1"),1);
362 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
363 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,1),"");
364 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,2),"");
365 	sqlrcur_getNullsAsNulls(cur);
366 	printf("\n");
367 
368 	printf("RESULT SET BUFFER SIZE: \n");
369 	checkSuccessInt(sqlrcur_getResultSetBufferSize(cur),0);
370 	sqlrcur_setResultSetBufferSize(cur,2);
371 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
372 	checkSuccessInt(sqlrcur_getResultSetBufferSize(cur),2);
373 	printf("\n");
374 	checkSuccessInt(sqlrcur_firstRowIndex(cur),0);
375 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
376 	checkSuccessInt(sqlrcur_rowCount(cur),2);
377 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
378 	checkSuccessString(sqlrcur_getFieldByIndex(cur,1,0),"2");
379 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
380 	printf("\n");
381 	checkSuccessInt(sqlrcur_firstRowIndex(cur),2);
382 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
383 	checkSuccessInt(sqlrcur_rowCount(cur),4);
384 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),"7");
385 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
386 	printf("\n");
387 	checkSuccessInt(sqlrcur_firstRowIndex(cur),6);
388 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
389 	checkSuccessInt(sqlrcur_rowCount(cur),8);
390 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
391 	printf("\n");
392 	checkSuccessInt(sqlrcur_firstRowIndex(cur),8);
393 	checkSuccessInt(sqlrcur_endOfResultSet(cur),1);
394 	checkSuccessInt(sqlrcur_rowCount(cur),8);
395 	printf("\n");
396 
397 	printf("DONT GET COLUMN INFO: \n");
398 	sqlrcur_dontGetColumnInfo(cur);
399 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
400 	checkSuccessString(sqlrcur_getColumnName(cur,0),NULL);
401 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,0),0);
402 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,0),NULL);
403 	sqlrcur_getColumnInfo(cur);
404 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
405 	checkSuccessString(sqlrcur_getColumnName(cur,0),"testint");
406 	checkSuccessInt(sqlrcur_getColumnLengthByIndex(cur,0),0);
407 	#ifdef HAVE_SQLITE3_STMT
408 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,0),"INTEGER");
409 	#else
410 	checkSuccessString(sqlrcur_getColumnTypeByIndex(cur,0),"UNKNOWN");
411 	#endif
412 	printf("\n");
413 
414 	printf("SUSPENDED SESSION: \n");
415 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
416 	sqlrcur_suspendResultSet(cur);
417 	checkSuccessInt(sqlrcon_suspendSession(con),1);
418 	port=sqlrcon_getConnectionPort(con);
419 	socket=strdup(sqlrcon_getConnectionSocket(con));
420 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
421 	printf("\n");
422 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
423 	checkSuccessString(sqlrcur_getFieldByIndex(cur,1,0),"2");
424 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
425 	checkSuccessString(sqlrcur_getFieldByIndex(cur,3,0),"4");
426 	checkSuccessString(sqlrcur_getFieldByIndex(cur,4,0),"5");
427 	checkSuccessString(sqlrcur_getFieldByIndex(cur,5,0),"6");
428 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),"7");
429 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
430 	printf("\n");
431 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
432 	sqlrcur_suspendResultSet(cur);
433 	checkSuccessInt(sqlrcon_suspendSession(con),1);
434 	port=sqlrcon_getConnectionPort(con);
435 	socket=strdup(sqlrcon_getConnectionSocket(con));
436 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
437 	printf("\n");
438 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
439 	checkSuccessString(sqlrcur_getFieldByIndex(cur,1,0),"2");
440 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
441 	checkSuccessString(sqlrcur_getFieldByIndex(cur,3,0),"4");
442 	checkSuccessString(sqlrcur_getFieldByIndex(cur,4,0),"5");
443 	checkSuccessString(sqlrcur_getFieldByIndex(cur,5,0),"6");
444 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),"7");
445 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
446 	printf("\n");
447 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
448 	sqlrcur_suspendResultSet(cur);
449 	checkSuccessInt(sqlrcon_suspendSession(con),1);
450 	port=sqlrcon_getConnectionPort(con);
451 	socket=strdup(sqlrcon_getConnectionSocket(con));
452 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
453 	printf("\n");
454 	checkSuccessString(sqlrcur_getFieldByIndex(cur,0,0),"1");
455 	checkSuccessString(sqlrcur_getFieldByIndex(cur,1,0),"2");
456 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
457 	checkSuccessString(sqlrcur_getFieldByIndex(cur,3,0),"4");
458 	checkSuccessString(sqlrcur_getFieldByIndex(cur,4,0),"5");
459 	checkSuccessString(sqlrcur_getFieldByIndex(cur,5,0),"6");
460 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),"7");
461 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
462 	printf("\n");
463 
464 	printf("SUSPENDED RESULT SET: \n");
465 	sqlrcur_setResultSetBufferSize(cur,2);
466 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
467 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
468 	id=sqlrcur_getResultSetId(cur);
469 	sqlrcur_suspendResultSet(cur);
470 	checkSuccessInt(sqlrcon_suspendSession(con),1);
471 	port=sqlrcon_getConnectionPort(con);
472 	socket=strdup(sqlrcon_getConnectionSocket(con));
473 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
474 	checkSuccessInt(sqlrcur_resumeResultSet(cur,id),1);
475 	printf("\n");
476 	checkSuccessInt(sqlrcur_firstRowIndex(cur),4);
477 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
478 	checkSuccessInt(sqlrcur_rowCount(cur),6);
479 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
480 	printf("\n");
481 	checkSuccessInt(sqlrcur_firstRowIndex(cur),6);
482 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
483 	checkSuccessInt(sqlrcur_rowCount(cur),8);
484 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
485 	printf("\n");
486 	checkSuccessInt(sqlrcur_firstRowIndex(cur),8);
487 	checkSuccessInt(sqlrcur_endOfResultSet(cur),1);
488 	checkSuccessInt(sqlrcur_rowCount(cur),8);
489 	sqlrcur_setResultSetBufferSize(cur,0);
490 	printf("\n");
491 
492 	printf("CACHED RESULT SET: \n");
493 	sqlrcur_cacheToFile(cur,"cachefile1");
494 	sqlrcur_setCacheTtl(cur,200);
495 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
496 	filename=strdup(sqlrcur_getCacheFileName(cur));
497 	checkSuccessString(filename,"cachefile1");
498 	sqlrcur_cacheOff(cur);
499 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,filename),1);
500 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
501 	free(filename);
502 	printf("\n");
503 
504 	printf("COLUMN COUNT FOR CACHED RESULT SET: \n");
505 	checkSuccessInt(sqlrcur_colCount(cur),4);
506 	printf("\n");
507 
508 	printf("COLUMN NAMES FOR CACHED RESULT SET: \n");
509 	checkSuccessString(sqlrcur_getColumnName(cur,0),"testint");
510 	checkSuccessString(sqlrcur_getColumnName(cur,1),"testfloat");
511 	checkSuccessString(sqlrcur_getColumnName(cur,2),"testchar");
512 	checkSuccessString(sqlrcur_getColumnName(cur,3),"testvarchar");
513 	cols=sqlrcur_getColumnNames(cur);
514 	checkSuccessString(cols[0],"testint");
515 	checkSuccessString(cols[1],"testfloat");
516 	checkSuccessString(cols[2],"testchar");
517 	checkSuccessString(cols[3],"testvarchar");
518 	printf("\n");
519 
520 	printf("CACHED RESULT SET WITH RESULT SET BUFFER SIZE: \n");
521 	sqlrcur_setResultSetBufferSize(cur,2);
522 	sqlrcur_cacheToFile(cur,"cachefile1");
523 	sqlrcur_setCacheTtl(cur,200);
524 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
525 	filename=strdup(sqlrcur_getCacheFileName(cur));
526 	checkSuccessString(filename,"cachefile1");
527 	sqlrcur_cacheOff(cur);
528 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,filename),1);
529 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
530 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
531 	sqlrcur_setResultSetBufferSize(cur,0);
532 	free(filename);
533 	printf("\n");
534 
535 	printf("FROM ONE CACHE FILE TO ANOTHER: \n");
536 	sqlrcur_cacheToFile(cur,"cachefile2");
537 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,"cachefile1"),1);
538 	sqlrcur_cacheOff(cur);
539 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,"cachefile2"),1);
540 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
541 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
542 	printf("\n");
543 
544 	printf("FROM ONE CACHE FILE TO ANOTHER WITH RESULT SET BUFFER SIZE: \n");
545 	sqlrcur_setResultSetBufferSize(cur,2);
546 	sqlrcur_cacheToFile(cur,"cachefile2");
547 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,"cachefile1"),1);
548 	sqlrcur_cacheOff(cur);
549 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,"cachefile2"),1);
550 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
551 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
552 	sqlrcur_setResultSetBufferSize(cur,0);
553 	printf("\n");
554 
555 	printf("CACHED RESULT SET WITH SUSPEND AND RESULT SET BUFFER SIZE: \n");
556 	sqlrcur_setResultSetBufferSize(cur,2);
557 	sqlrcur_cacheToFile(cur,"cachefile1");
558 	sqlrcur_setCacheTtl(cur,200);
559 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
560 	checkSuccessString(sqlrcur_getFieldByIndex(cur,2,0),"3");
561 	filename=strdup(sqlrcur_getCacheFileName(cur));
562 	checkSuccessString(filename,"cachefile1");
563 	id=sqlrcur_getResultSetId(cur);
564 	sqlrcur_suspendResultSet(cur);
565 	checkSuccessInt(sqlrcon_suspendSession(con),1);
566 	port=sqlrcon_getConnectionPort(con);
567 	socket=strdup(sqlrcon_getConnectionSocket(con));
568 	printf("\n");
569 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
570 	checkSuccessInt(sqlrcur_resumeCachedResultSet(cur,id,filename),1);
571 	printf("\n");
572 	checkSuccessInt(sqlrcur_firstRowIndex(cur),4);
573 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
574 	checkSuccessInt(sqlrcur_rowCount(cur),6);
575 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
576 	printf("\n");
577 	checkSuccessInt(sqlrcur_firstRowIndex(cur),6);
578 	checkSuccessInt(sqlrcur_endOfResultSet(cur),0);
579 	checkSuccessInt(sqlrcur_rowCount(cur),8);
580 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
581 	printf("\n");
582 	checkSuccessInt(sqlrcur_firstRowIndex(cur),8);
583 	checkSuccessInt(sqlrcur_endOfResultSet(cur),1);
584 	checkSuccessInt(sqlrcur_rowCount(cur),8);
585 	sqlrcur_cacheOff(cur);
586 	printf("\n");
587 	checkSuccessInt(sqlrcur_openCachedResultSet(cur,filename),1);
588 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
589 	checkSuccessString(sqlrcur_getFieldByIndex(cur,8,0),NULL);
590 	sqlrcur_setResultSetBufferSize(cur,0);
591 	free(filename);
592 	printf("\n");
593 
594 	printf("COMMIT AND ROLLBACK: \n");
595 	secondcon=sqlrcon_alloc("sqlrelay",9000,
596 				"/tmp/test.socket","test","test",0,1);
597 	secondcur=sqlrcur_alloc(secondcon);
598 	checkSuccessInt(sqlrcur_sendQuery(secondcur,"select count(*) from testtable"),1);
599 	checkSuccessString(sqlrcur_getFieldByIndex(secondcur,0,0),"0");
600 	checkSuccessInt(sqlrcon_commit(con),1);
601 	checkSuccessInt(sqlrcur_sendQuery(secondcur,"select count(*) from testtable"),1);
602 	checkSuccessString(sqlrcur_getFieldByIndex(secondcur,0,0),"8");
603 	checkSuccessInt(sqlrcur_sendQuery(secondcur,"insert into testtable values (10,10.1,'testchar10','testvarchar10')"),1);
604 	checkSuccessInt(sqlrcur_sendQuery(secondcur,"select count(*) from testtable"),1);
605 	checkSuccessString(sqlrcur_getFieldByIndex(secondcur,0,0),"9");
606 	printf("\n");
607 
608 	printf("FINISHED SUSPENDED SESSION: \n");
609 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable order by testint"),1);
610 	checkSuccessString(sqlrcur_getFieldByIndex(cur,4,0),"5");
611 	checkSuccessString(sqlrcur_getFieldByIndex(cur,5,0),"6");
612 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),"7");
613 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),"8");
614 	id=sqlrcur_getResultSetId(cur);
615 	sqlrcur_suspendResultSet(cur);
616 	checkSuccessInt(sqlrcon_suspendSession(con),1);
617 	port=sqlrcon_getConnectionPort(con);
618 	socket=strdup(sqlrcon_getConnectionSocket(con));
619 	checkSuccessInt(sqlrcon_resumeSession(con,port,socket),1);
620 	checkSuccessInt(sqlrcur_resumeResultSet(cur,id),1);
621 	checkSuccessString(sqlrcur_getFieldByIndex(cur,4,0),NULL);
622 	checkSuccessString(sqlrcur_getFieldByIndex(cur,5,0),NULL);
623 	checkSuccessString(sqlrcur_getFieldByIndex(cur,6,0),NULL);
624 	checkSuccessString(sqlrcur_getFieldByIndex(cur,7,0),NULL);
625 	printf("\n");
626 
627 	// drop existing table
628 	sqlrcur_sendQuery(cur,"drop table testtable");
629 
630 	// invalid queries...
631 	printf("INVALID QUERIES: \n");
632 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable"),0);
633 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable"),0);
634 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable"),0);
635 	checkSuccessInt(sqlrcur_sendQuery(cur,"select * from testtable"),0);
636 	printf("\n");
637 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (1,2,3,4)"),0);
638 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (1,2,3,4)"),0);
639 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (1,2,3,4)"),0);
640 	checkSuccessInt(sqlrcur_sendQuery(cur,"insert into testtable values (1,2,3,4)"),0);
641 	printf("\n");
642 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable"),0);
643 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable"),0);
644 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable"),0);
645 	checkSuccessInt(sqlrcur_sendQuery(cur,"create table testtable"),0);
646 	printf("\n");
647 
648 	return 0;
649 }
650