1 // Copyright (c) 1999-2018 David Muse
2 // See the file COPYING for more information.
3 
4 #include <sqlrelay/sqlrclient.h>
5 #include <rudiments/charstring.h>
6 #include <rudiments/process.h>
7 #include <rudiments/snooze.h>
8 #include <rudiments/stdio.h>
9 
10 sqlrconnection	*con;
11 sqlrcursor	*cur;
12 sqlrconnection	*secondcon;
13 sqlrcursor	*secondcur;
14 
checkSuccess(const char * value,const char * success)15 void checkSuccess(const char *value, const char *success) {
16 
17 	if (!success) {
18 		if (!value) {
19 			stdoutput.printf("success \n");
20 			return;
21 		} else {
22 			stdoutput.printf("failure %s!=%s\n",value,success);
23 			delete cur;
24 			delete con;
25 			process::exit(1);
26 		}
27 	}
28 
29 	if (!charstring::compare(value,success)) {
30 		stdoutput.printf("success \n");
31 	} else {
32 		stdoutput.printf("failure %s!=%s\n",value,success);
33 		delete cur;
34 		delete con;
35 		process::exit(1);
36 	}
37 }
38 
checkSuccess(const char * value,const char * success,size_t length)39 void checkSuccess(const char *value, const char *success, size_t length) {
40 
41 	if (!success) {
42 		if (!value) {
43 			stdoutput.printf("success \n");
44 			return;
45 		} else {
46 			stdoutput.printf("failure %s!=%s\n",value,success);
47 			delete cur;
48 			delete con;
49 			process::exit(1);
50 		}
51 	}
52 
53 	if (!charstring::compare(value,success,length)) {
54 		stdoutput.printf("success \n");
55 	} else {
56 		stdoutput.printf("failure %s!=%s\n",value,success);
57 		delete cur;
58 		delete con;
59 		process::exit(1);
60 	}
61 }
62 
checkSuccess(int value,int success)63 void checkSuccess(int value, int success) {
64 
65 	if (value==success) {
66 		stdoutput.printf("success \n");
67 	} else {
68 		stdoutput.printf("failure %d!=%d\n",value,success);
69 		delete cur;
70 		delete con;
71 		process::exit(1);
72 	}
73 }
74 
checkSuccess(double value,double success)75 void checkSuccess(double value, double success) {
76 
77 	if (value==success) {
78 		stdoutput.printf("success \n");
79 	} else {
80 		stdoutput.printf("failure %f!=%f\n",value,success);
81 		delete cur;
82 		delete con;
83 		process::exit(1);
84 	}
85 }
86 
main(int argc,char ** argv)87 int	main(int argc, char **argv) {
88 
89 	const char * const *cols;
90 	const char * const *fields;
91 	uint32_t	*fieldlens;
92 
93 	// instantiation
94 	con=new sqlrconnection("sqlrelay",9000,"/tmp/test.socket",
95 							"test","test",0,1);
96 	cur=new sqlrcursor(con);
97 
98 	// get database type
99 	stdoutput.printf("IDENTIFY: \n");
100 	checkSuccess(con->identify(),"router");
101 	stdoutput.printf("\n");
102 
103 	// get the db version
104 	const char	*dbversion=con->dbVersion();
105 	uint32_t	majorversion=dbversion[0]-'0';
106 
107 	// ping
108 	stdoutput.printf("PING: \n");
109 	checkSuccess(con->ping(),1);
110 	stdoutput.printf("\n");
111 
112 	stdoutput.printf("FILTERED-OUT QUERIES: \n");
113 	checkSuccess(cur->sendQuery("create table junktable (col1 int)"),0);
114 	checkSuccess(cur->sendQuery("insert into junktable values (1)"),0);
115 	checkSuccess(cur->sendQuery("update junktable set col1=2"),0);
116 	checkSuccess(cur->sendQuery("delete from junktable"),0);
117 	checkSuccess(cur->sendQuery("drop table junktable (col1 int)"),0);
118 	stdoutput.printf("\n");
119 
120 	// drop existing table
121 	cur->sendQuery("drop table testtable1");
122 	cur->sendQuery("drop table testtable2");
123 
124 	stdoutput.printf("CREATE TESTTABLES: \n");
125 	checkSuccess(cur->sendQuery("create table testtable1 (testint int, testfloat float, testreal real, testsmallint smallint, testchar char(40), testvarchar varchar(40), testdate date, testtime time, testtimestamp timestamp)"),1);
126 	checkSuccess(cur->sendQuery("create table testtable2 (testint int, testfloat float, testreal real, testsmallint smallint, testchar char(40), testvarchar varchar(40), testdate date, testtime time, testtimestamp timestamp)"),1);
127 	stdoutput.printf("\n");
128 
129 	stdoutput.printf("BEGIN TRANSCTION: \n");
130 	checkSuccess(cur->sendQuery("begin"),1);
131 	stdoutput.printf("\n");
132 
133 	stdoutput.printf("INSERT: \n");
134 	checkSuccess(cur->sendQuery("insert into testtable1 values (1,1.1,1.1,1,'testchar1','testvarchar1','2001-01-01','01:00:00',NULL)"),1);
135 	checkSuccess(cur->sendQuery("insert into testtable1 values (2,2.2,2.2,2,'testchar2','testvarchar2','2002-01-01','02:00:00',NULL)"),1);
136 	checkSuccess(cur->sendQuery("insert into testtable1 values (3,3.3,3.3,3,'testchar3','testvarchar3','2003-01-01','03:00:00',NULL)"),1);
137 	checkSuccess(cur->sendQuery("insert into testtable1 values (4,4.4,4.4,4,'testchar4','testvarchar4','2004-01-01','04:00:00',NULL)"),1);
138 	stdoutput.printf("\n");
139 	checkSuccess(cur->sendQuery("insert into testtable2 values (1,1.1,1.1,1,'testchar1','testvarchar1','2001-01-01','01:00:00',NULL)"),1);
140 	checkSuccess(cur->sendQuery("insert into testtable2 values (2,2.2,2.2,2,'testchar2','testvarchar2','2002-01-01','02:00:00',NULL)"),1);
141 	checkSuccess(cur->sendQuery("insert into testtable2 values (3,3.3,3.3,3,'testchar3','testvarchar3','2003-01-01','03:00:00',NULL)"),1);
142 	checkSuccess(cur->sendQuery("insert into testtable2 values (4,4.4,4.4,4,'testchar4','testvarchar4','2004-01-01','04:00:00',NULL)"),1);
143 	stdoutput.printf("\n");
144 
145 	stdoutput.printf("AFFECTED ROWS: \n");
146 	checkSuccess(cur->affectedRows(),1);
147 	stdoutput.printf("\n");
148 
149 	stdoutput.printf("BIND BY NAME: \n");
150 	cur->prepareQuery("insert into testtable1 values (?,?,?,?,?,?,?,?,NULL)");
151 	checkSuccess(cur->countBindVariables(),8);
152 	cur->inputBind("1",5);
153 	cur->inputBind("2",5.5,4,2);
154 	cur->inputBind("3",5.5,4,2);
155 	cur->inputBind("4",5);
156 	cur->inputBind("5","testchar5");
157 	cur->inputBind("6","testvarchar5");
158 	cur->inputBind("7","2005-01-01");
159 	cur->inputBind("8","05:00:00");
160 	checkSuccess(cur->executeQuery(),1);
161 	cur->clearBinds();
162 	cur->inputBind("1",6);
163 	cur->inputBind("2",6.6,4,2);
164 	cur->inputBind("3",6.6,4,2);
165 	cur->inputBind("4",6);
166 	cur->inputBind("5","testchar6");
167 	cur->inputBind("6","testvarchar6");
168 	cur->inputBind("7","2006-01-01");
169 	cur->inputBind("8","06:00:00");
170 	checkSuccess(cur->executeQuery(),1);
171 	cur->clearBinds();
172 	cur->inputBind("1",7);
173 	cur->inputBind("2",7.7,4,2);
174 	cur->inputBind("3",7.7,4,2);
175 	cur->inputBind("4",7);
176 	cur->inputBind("5","testchar7");
177 	cur->inputBind("6","testvarchar7");
178 	cur->inputBind("7","2007-01-01");
179 	cur->inputBind("8","07:00:00");
180 	checkSuccess(cur->executeQuery(),1);
181 	stdoutput.printf("\n");
182 
183 	stdoutput.printf("BIND BY NAME WITH VALIDATION: \n");
184 	cur->clearBinds();
185 	cur->inputBind("1",8);
186 	cur->inputBind("2",8.8,4,2);
187 	cur->inputBind("3",8.8,4,2);
188 	cur->inputBind("4",8);
189 	cur->inputBind("5","testchar8");
190 	cur->inputBind("6","testvarchar8");
191 	cur->inputBind("7","2008-01-01");
192 	cur->inputBind("8","08:00:00");
193 	cur->inputBind("9","junkvalue");
194 	cur->validateBinds();
195 	checkSuccess(cur->executeQuery(),1);
196 	stdoutput.printf("\n");
197 
198 	stdoutput.printf("BIND BY NAME: \n");
199 	cur->prepareQuery("insert into testtable2 values (?,?,?,?,?,?,?,?,NULL)");
200 	checkSuccess(cur->countBindVariables(),8);
201 	cur->inputBind("1",5);
202 	cur->inputBind("2",5.5,4,2);
203 	cur->inputBind("3",5.5,4,2);
204 	cur->inputBind("4",5);
205 	cur->inputBind("5","testchar5");
206 	cur->inputBind("6","testvarchar5");
207 	cur->inputBind("7","2005-01-01");
208 	cur->inputBind("8","05:00:00");
209 	checkSuccess(cur->executeQuery(),1);
210 	cur->clearBinds();
211 	cur->inputBind("1",6);
212 	cur->inputBind("2",6.6,4,2);
213 	cur->inputBind("3",6.6,4,2);
214 	cur->inputBind("4",6);
215 	cur->inputBind("5","testchar6");
216 	cur->inputBind("6","testvarchar6");
217 	cur->inputBind("7","2006-01-01");
218 	cur->inputBind("8","06:00:00");
219 	checkSuccess(cur->executeQuery(),1);
220 	cur->clearBinds();
221 	cur->inputBind("1",7);
222 	cur->inputBind("2",7.7,4,2);
223 	cur->inputBind("3",7.7,4,2);
224 	cur->inputBind("4",7);
225 	cur->inputBind("5","testchar7");
226 	cur->inputBind("6","testvarchar7");
227 	cur->inputBind("7","2007-01-01");
228 	cur->inputBind("8","07:00:00");
229 	checkSuccess(cur->executeQuery(),1);
230 	stdoutput.printf("\n");
231 
232 	stdoutput.printf("BIND BY NAME WITH VALIDATION: \n");
233 	cur->clearBinds();
234 	cur->inputBind("1",8);
235 	cur->inputBind("2",8.8,4,2);
236 	cur->inputBind("3",8.8,4,2);
237 	cur->inputBind("4",8);
238 	cur->inputBind("5","testchar8");
239 	cur->inputBind("6","testvarchar8");
240 	cur->inputBind("7","2008-01-01");
241 	cur->inputBind("8","08:00:00");
242 	cur->inputBind("9","junkvalue");
243 	cur->validateBinds();
244 	checkSuccess(cur->executeQuery(),1);
245 	stdoutput.printf("\n");
246 
247 	checkSuccess(con->commit(),1);
248 	snooze::macrosnooze(2,0);
249 
250 	stdoutput.printf("SELECT: \n");
251 	checkSuccess(cur->sendQuery("select * from testtable1 order by testint"),1);
252 	stdoutput.printf("\n");
253 
254 	stdoutput.printf("COLUMN COUNT: \n");
255 	checkSuccess(cur->colCount(),9);
256 	stdoutput.printf("\n");
257 
258 	stdoutput.printf("COLUMN NAMES: \n");
259 	checkSuccess(cur->getColumnName(0),"testint");
260 	checkSuccess(cur->getColumnName(1),"testfloat");
261 	checkSuccess(cur->getColumnName(2),"testreal");
262 	checkSuccess(cur->getColumnName(3),"testsmallint");
263 	checkSuccess(cur->getColumnName(4),"testchar");
264 	checkSuccess(cur->getColumnName(5),"testvarchar");
265 	checkSuccess(cur->getColumnName(6),"testdate");
266 	checkSuccess(cur->getColumnName(7),"testtime");
267 	checkSuccess(cur->getColumnName(8),"testtimestamp");
268 	cols=cur->getColumnNames();
269 	checkSuccess(cols[0],"testint");
270 	checkSuccess(cols[1],"testfloat");
271 	checkSuccess(cols[2],"testreal");
272 	checkSuccess(cols[3],"testsmallint");
273 	checkSuccess(cols[4],"testchar");
274 	checkSuccess(cols[5],"testvarchar");
275 	checkSuccess(cols[6],"testdate");
276 	checkSuccess(cols[7],"testtime");
277 	checkSuccess(cols[8],"testtimestamp");
278 	stdoutput.printf("\n");
279 
280 	stdoutput.printf("COLUMN TYPES: \n");
281 	checkSuccess(cur->getColumnType((uint32_t)0),"INT");
282 	checkSuccess(cur->getColumnType("testint"),"INT");
283 	checkSuccess(cur->getColumnType(1),"FLOAT");
284 	checkSuccess(cur->getColumnType("testfloat"),"FLOAT");
285 	checkSuccess(cur->getColumnType(2),"REAL");
286 	checkSuccess(cur->getColumnType("testreal"),"REAL");
287 	checkSuccess(cur->getColumnType(3),"SMALLINT");
288 	checkSuccess(cur->getColumnType("testsmallint"),"SMALLINT");
289 	if (majorversion==3) {
290 		checkSuccess(cur->getColumnType(4),"VARSTRING");
291 		checkSuccess(cur->getColumnType("testchar"),"VARSTRING");
292 	} else {
293 		checkSuccess(cur->getColumnType(4),"STRING");
294 		checkSuccess(cur->getColumnType("testchar"),"STRING");
295 	}
296 	checkSuccess(cur->getColumnType(5),"VARSTRING");
297 	checkSuccess(cur->getColumnType("testvarchar"),"VARSTRING");
298 	checkSuccess(cur->getColumnType(6),"DATE");
299 	checkSuccess(cur->getColumnType("testdate"),"DATE");
300 	checkSuccess(cur->getColumnType(7),"TIME");
301 	checkSuccess(cur->getColumnType("testtime"),"TIME");
302 	checkSuccess(cur->getColumnType(8),"TIMESTAMP");
303 	checkSuccess(cur->getColumnType("testtimestamp"),"TIMESTAMP");
304 	stdoutput.printf("\n");
305 
306 	stdoutput.printf("COLUMN LENGTH: \n");
307 	checkSuccess(cur->getColumnLength((uint32_t)0),4);
308 	checkSuccess(cur->getColumnLength("testint"),4);
309 	checkSuccess(cur->getColumnLength(1),4);
310 	checkSuccess(cur->getColumnLength("testfloat"),4);
311 	checkSuccess(cur->getColumnLength(2),8);
312 	checkSuccess(cur->getColumnLength("testreal"),8);
313 	checkSuccess(cur->getColumnLength(3),2);
314 	checkSuccess(cur->getColumnLength("testsmallint"),2);
315 	// not reliable... some mysql client return the number of bytes
316 	// rather than chars, which can be 3 times the number of chars if
317 	// the db supports multibyte characters
318 	//checkSuccess(cur->getColumnLength(4),40);
319 	//checkSuccess(cur->getColumnLength("testchar"),40);
320 	//checkSuccess(cur->getColumnLength(5),41);
321 	//checkSuccess(cur->getColumnLength("testvarchar"),41);
322 	checkSuccess(cur->getColumnLength(6),3);
323 	checkSuccess(cur->getColumnLength("testdate"),3);
324 	checkSuccess(cur->getColumnLength(7),3);
325 	checkSuccess(cur->getColumnLength("testtime"),3);
326 	checkSuccess(cur->getColumnLength(8),4);
327 	checkSuccess(cur->getColumnLength("testtimestamp"),4);
328 	stdoutput.printf("\n");
329 
330 	/*stdoutput.printf("LONGEST COLUMN: \n");
331 	// FIXME: weird, this returns 0 but the next one works
332 	checkSuccess(cur->getLongest((uint32_t)0),1);
333 	checkSuccess(cur->getLongest("testint"),1);
334 	checkSuccess(cur->getLongest(1),3);
335 	checkSuccess(cur->getLongest("testfloat"),3);
336 	checkSuccess(cur->getLongest(2),3);
337 	checkSuccess(cur->getLongest("testreal"),3);
338 	checkSuccess(cur->getLongest(3),1);
339 	checkSuccess(cur->getLongest("testsmallint"),1);
340 	checkSuccess(cur->getLongest(4),9);
341 	checkSuccess(cur->getLongest("testchar"),9);
342 	checkSuccess(cur->getLongest(5),12);
343 	checkSuccess(cur->getLongest("testvarchar"),12);
344 	checkSuccess(cur->getLongest(6),10);
345 	checkSuccess(cur->getLongest("testdate"),10);
346 	checkSuccess(cur->getLongest(7),8);
347 	checkSuccess(cur->getLongest("testtime"),8);
348 	stdoutput.printf("\n");*/
349 
350 	stdoutput.printf("ROW COUNT: \n");
351 	checkSuccess(cur->rowCount(),8);
352 	stdoutput.printf("\n");
353 
354 	stdoutput.printf("TOTAL ROWS: \n");
355 	checkSuccess(cur->totalRows(),8);
356 	stdoutput.printf("\n");
357 
358 	stdoutput.printf("FIRST ROW INDEX: \n");
359 	checkSuccess(cur->firstRowIndex(),0);
360 	stdoutput.printf("\n");
361 
362 	stdoutput.printf("END OF RESULT SET: \n");
363 	checkSuccess(cur->endOfResultSet(),1);
364 	stdoutput.printf("\n");
365 
366 	stdoutput.printf("FIELDS BY INDEX: \n");
367 	checkSuccess(cur->getField(0,(uint32_t)0),"1");
368 	//checkSuccess(cur->getField(0,1),"1.1");
369 	//checkSuccess(cur->getField(0,2),"1.1");
370 	checkSuccess(cur->getField(0,3),"1");
371 	checkSuccess(cur->getField(0,4),"testchar1");
372 	checkSuccess(cur->getField(0,5),"testvarchar1");
373 	checkSuccess(cur->getField(0,6),"2001-01-01");
374 	checkSuccess(cur->getField(0,7),"01:00:00");
375 	stdoutput.printf("\n");
376 	checkSuccess(cur->getField(7,(uint32_t)0),"8");
377 	//checkSuccess(cur->getField(7,1),"8.8");
378 	//checkSuccess(cur->getField(7,2),"8.8");
379 	checkSuccess(cur->getField(7,3),"8");
380 	checkSuccess(cur->getField(7,4),"testchar8");
381 	checkSuccess(cur->getField(7,5),"testvarchar8");
382 	checkSuccess(cur->getField(7,6),"2008-01-01");
383 	checkSuccess(cur->getField(7,7),"08:00:00");
384 	stdoutput.printf("\n");
385 
386 	stdoutput.printf("FIELD LENGTHS BY INDEX: \n");
387 	checkSuccess(cur->getFieldLength(0,(uint32_t)0),1);
388 	//checkSuccess(cur->getFieldLength(0,1),3);
389 	//checkSuccess(cur->getFieldLength(0,2),3);
390 	checkSuccess(cur->getFieldLength(0,3),1);
391 	checkSuccess(cur->getFieldLength(0,4),9);
392 	checkSuccess(cur->getFieldLength(0,5),12);
393 	checkSuccess(cur->getFieldLength(0,6),10);
394 	checkSuccess(cur->getFieldLength(0,7),8);
395 	stdoutput.printf("\n");
396 	checkSuccess(cur->getFieldLength(7,(uint32_t)0),1);
397 	//checkSuccess(cur->getFieldLength(7,1),3);
398 	//checkSuccess(cur->getFieldLength(7,2),3);
399 	checkSuccess(cur->getFieldLength(7,3),1);
400 	checkSuccess(cur->getFieldLength(7,4),9);
401 	checkSuccess(cur->getFieldLength(7,5),12);
402 	checkSuccess(cur->getFieldLength(7,6),10);
403 	checkSuccess(cur->getFieldLength(7,7),8);
404 	stdoutput.printf("\n");
405 
406 	stdoutput.printf("FIELDS BY NAME: \n");
407 	checkSuccess(cur->getField(0,"testint"),"1");
408 	//checkSuccess(cur->getField(0,"testfloat"),"1.1");
409 	//checkSuccess(cur->getField(0,"testreal"),"1.1");
410 	checkSuccess(cur->getField(0,"testsmallint"),"1");
411 	checkSuccess(cur->getField(0,"testchar"),"testchar1");
412 	checkSuccess(cur->getField(0,"testvarchar"),"testvarchar1");
413 	checkSuccess(cur->getField(0,"testdate"),"2001-01-01");
414 	checkSuccess(cur->getField(0,"testtime"),"01:00:00");
415 	stdoutput.printf("\n");
416 	checkSuccess(cur->getField(7,"testint"),"8");
417 	//checkSuccess(cur->getField(7,"testfloat"),"8.8");
418 	//checkSuccess(cur->getField(7,"testreal"),"8.8");
419 	checkSuccess(cur->getField(7,"testsmallint"),"8");
420 	checkSuccess(cur->getField(7,"testchar"),"testchar8");
421 	checkSuccess(cur->getField(7,"testvarchar"),"testvarchar8");
422 	checkSuccess(cur->getField(7,"testdate"),"2008-01-01");
423 	checkSuccess(cur->getField(7,"testtime"),"08:00:00");
424 	stdoutput.printf("\n");
425 
426 	stdoutput.printf("FIELD LENGTHS BY NAME: \n");
427 	checkSuccess(cur->getFieldLength(0,"testint"),1);
428 	//checkSuccess(cur->getFieldLength(0,"testfloat"),3);
429 	//checkSuccess(cur->getFieldLength(0,"testreal"),3);
430 	checkSuccess(cur->getFieldLength(0,"testsmallint"),1);
431 	checkSuccess(cur->getFieldLength(0,"testchar"),9);
432 	checkSuccess(cur->getFieldLength(0,"testvarchar"),12);
433 	checkSuccess(cur->getFieldLength(0,"testdate"),10);
434 	checkSuccess(cur->getFieldLength(0,"testtime"),8);
435 	stdoutput.printf("\n");
436 	checkSuccess(cur->getFieldLength(7,"testint"),1);
437 	//checkSuccess(cur->getFieldLength(7,"testfloat"),3);
438 	//checkSuccess(cur->getFieldLength(7,"testreal"),3);
439 	checkSuccess(cur->getFieldLength(7,"testsmallint"),1);
440 	checkSuccess(cur->getFieldLength(7,"testchar"),9);
441 	checkSuccess(cur->getFieldLength(7,"testvarchar"),12);
442 	checkSuccess(cur->getFieldLength(7,"testdate"),10);
443 	checkSuccess(cur->getFieldLength(7,"testtime"),8);
444 	stdoutput.printf("\n");
445 
446 	stdoutput.printf("FIELDS BY ARRAY: \n");
447 	fields=cur->getRow(0);
448 	checkSuccess(fields[0],"1");
449 	//checkSuccess(fields[1],"1.1");
450 	//checkSuccess(fields[2],"1.1");
451 	checkSuccess(fields[3],"1");
452 	checkSuccess(fields[4],"testchar1");
453 	checkSuccess(fields[5],"testvarchar1");
454 	checkSuccess(fields[6],"2001-01-01");
455 	checkSuccess(fields[7],"01:00:00");
456 	stdoutput.printf("\n");
457 
458 	stdoutput.printf("FIELD LENGTHS BY ARRAY: \n");
459 	fieldlens=cur->getRowLengths(0);
460 	checkSuccess(fieldlens[0],1);
461 	//checkSuccess(fieldlens[1],3);
462 	//checkSuccess(fieldlens[2],3);
463 	checkSuccess(fieldlens[3],1);
464 	checkSuccess(fieldlens[4],9);
465 	checkSuccess(fieldlens[5],12);
466 	checkSuccess(fieldlens[6],10);
467 	checkSuccess(fieldlens[7],8);
468 	stdoutput.printf("\n");
469 
470 	checkSuccess(con->commit(),1);
471 	snooze::macrosnooze(2,0);
472 
473 	stdoutput.printf("SELECT: \n");
474 	checkSuccess(cur->sendQuery("select * from testtable1 order by testint"),1);
475 	stdoutput.printf("\n");
476 
477 	stdoutput.printf("COLUMN COUNT: \n");
478 	checkSuccess(cur->colCount(),9);
479 	stdoutput.printf("\n");
480 
481 	stdoutput.printf("COLUMN NAMES: \n");
482 	checkSuccess(cur->getColumnName(0),"testint");
483 	checkSuccess(cur->getColumnName(1),"testfloat");
484 	checkSuccess(cur->getColumnName(2),"testreal");
485 	checkSuccess(cur->getColumnName(3),"testsmallint");
486 	checkSuccess(cur->getColumnName(4),"testchar");
487 	checkSuccess(cur->getColumnName(5),"testvarchar");
488 	checkSuccess(cur->getColumnName(6),"testdate");
489 	checkSuccess(cur->getColumnName(7),"testtime");
490 	checkSuccess(cur->getColumnName(8),"testtimestamp");
491 	cols=cur->getColumnNames();
492 	checkSuccess(cols[0],"testint");
493 	checkSuccess(cols[1],"testfloat");
494 	checkSuccess(cols[2],"testreal");
495 	checkSuccess(cols[3],"testsmallint");
496 	checkSuccess(cols[4],"testchar");
497 	checkSuccess(cols[5],"testvarchar");
498 	checkSuccess(cols[6],"testdate");
499 	checkSuccess(cols[7],"testtime");
500 	checkSuccess(cols[8],"testtimestamp");
501 	stdoutput.printf("\n");
502 
503 	stdoutput.printf("COLUMN TYPES: \n");
504 	checkSuccess(cur->getColumnType((uint32_t)0),"INT");
505 	checkSuccess(cur->getColumnType("testint"),"INT");
506 	checkSuccess(cur->getColumnType(1),"FLOAT");
507 	checkSuccess(cur->getColumnType("testfloat"),"FLOAT");
508 	checkSuccess(cur->getColumnType(2),"REAL");
509 	checkSuccess(cur->getColumnType("testreal"),"REAL");
510 	checkSuccess(cur->getColumnType(3),"SMALLINT");
511 	checkSuccess(cur->getColumnType("testsmallint"),"SMALLINT");
512 	if (majorversion==3) {
513 		checkSuccess(cur->getColumnType(4),"VARSTRING");
514 		checkSuccess(cur->getColumnType("testchar"),"VARSTRING");
515 	} else {
516 		checkSuccess(cur->getColumnType(4),"STRING");
517 		checkSuccess(cur->getColumnType("testchar"),"STRING");
518 	}
519 	checkSuccess(cur->getColumnType(5),"VARSTRING");
520 	checkSuccess(cur->getColumnType("testvarchar"),"VARSTRING");
521 	checkSuccess(cur->getColumnType(6),"DATE");
522 	checkSuccess(cur->getColumnType("testdate"),"DATE");
523 	checkSuccess(cur->getColumnType(7),"TIME");
524 	checkSuccess(cur->getColumnType("testtime"),"TIME");
525 	checkSuccess(cur->getColumnType(8),"TIMESTAMP");
526 	checkSuccess(cur->getColumnType("testtimestamp"),"TIMESTAMP");
527 	stdoutput.printf("\n");
528 
529 	stdoutput.printf("COLUMN LENGTH: \n");
530 	checkSuccess(cur->getColumnLength((uint32_t)0),4);
531 	checkSuccess(cur->getColumnLength("testint"),4);
532 	checkSuccess(cur->getColumnLength(1),4);
533 	checkSuccess(cur->getColumnLength("testfloat"),4);
534 	checkSuccess(cur->getColumnLength(2),8);
535 	checkSuccess(cur->getColumnLength("testreal"),8);
536 	checkSuccess(cur->getColumnLength(3),2);
537 	checkSuccess(cur->getColumnLength("testsmallint"),2);
538 	//checkSuccess(cur->getColumnLength(4),40);
539 	//checkSuccess(cur->getColumnLength("testchar"),40);
540 	//checkSuccess(cur->getColumnLength(5),41);
541 	//checkSuccess(cur->getColumnLength("testvarchar"),41);
542 	checkSuccess(cur->getColumnLength(6),3);
543 	checkSuccess(cur->getColumnLength("testdate"),3);
544 	checkSuccess(cur->getColumnLength(7),3);
545 	checkSuccess(cur->getColumnLength("testtime"),3);
546 	checkSuccess(cur->getColumnLength(8),4);
547 	checkSuccess(cur->getColumnLength("testtimestamp"),4);
548 	stdoutput.printf("\n");
549 
550 	stdoutput.printf("LONGEST COLUMN: \n");
551 	checkSuccess(cur->getLongest((uint32_t)0),1);
552 	checkSuccess(cur->getLongest("testint"),1);
553 	//checkSuccess(cur->getLongest(1),3);
554 	//checkSuccess(cur->getLongest("testfloat"),3);
555 	//checkSuccess(cur->getLongest(2),3);
556 	//checkSuccess(cur->getLongest("testreal"),3);
557 	checkSuccess(cur->getLongest(3),1);
558 	checkSuccess(cur->getLongest("testsmallint"),1);
559 	checkSuccess(cur->getLongest(4),9);
560 	checkSuccess(cur->getLongest("testchar"),9);
561 	checkSuccess(cur->getLongest(5),12);
562 	checkSuccess(cur->getLongest("testvarchar"),12);
563 	checkSuccess(cur->getLongest(6),10);
564 	checkSuccess(cur->getLongest("testdate"),10);
565 	checkSuccess(cur->getLongest(7),8);
566 	checkSuccess(cur->getLongest("testtime"),8);
567 	stdoutput.printf("\n");
568 
569 	stdoutput.printf("ROW COUNT: \n");
570 	checkSuccess(cur->rowCount(),8);
571 	stdoutput.printf("\n");
572 
573 	stdoutput.printf("TOTAL ROWS: \n");
574 	checkSuccess(cur->totalRows(),8);
575 	stdoutput.printf("\n");
576 
577 	stdoutput.printf("FIRST ROW INDEX: \n");
578 	checkSuccess(cur->firstRowIndex(),0);
579 	stdoutput.printf("\n");
580 
581 	stdoutput.printf("END OF RESULT SET: \n");
582 	checkSuccess(cur->endOfResultSet(),1);
583 	stdoutput.printf("\n");
584 
585 	stdoutput.printf("FIELDS BY INDEX: \n");
586 	checkSuccess(cur->getField(0,(uint32_t)0),"1");
587 	//checkSuccess(cur->getField(0,1),"1.1");
588 	//checkSuccess(cur->getField(0,2),"1.1");
589 	checkSuccess(cur->getField(0,3),"1");
590 	checkSuccess(cur->getField(0,4),"testchar1");
591 	checkSuccess(cur->getField(0,5),"testvarchar1");
592 	checkSuccess(cur->getField(0,6),"2001-01-01");
593 	checkSuccess(cur->getField(0,7),"01:00:00");
594 	stdoutput.printf("\n");
595 	checkSuccess(cur->getField(7,(uint32_t)0),"8");
596 	//checkSuccess(cur->getField(7,1),"8.8");
597 	//checkSuccess(cur->getField(7,2),"8.8");
598 	checkSuccess(cur->getField(7,3),"8");
599 	checkSuccess(cur->getField(7,4),"testchar8");
600 	checkSuccess(cur->getField(7,5),"testvarchar8");
601 	checkSuccess(cur->getField(7,6),"2008-01-01");
602 	checkSuccess(cur->getField(7,7),"08:00:00");
603 	stdoutput.printf("\n");
604 
605 	stdoutput.printf("FIELD LENGTHS BY INDEX: \n");
606 	checkSuccess(cur->getFieldLength(0,(uint32_t)0),1);
607 	//checkSuccess(cur->getFieldLength(0,1),3);
608 	//checkSuccess(cur->getFieldLength(0,2),3);
609 	checkSuccess(cur->getFieldLength(0,3),1);
610 	checkSuccess(cur->getFieldLength(0,4),9);
611 	checkSuccess(cur->getFieldLength(0,5),12);
612 	checkSuccess(cur->getFieldLength(0,6),10);
613 	checkSuccess(cur->getFieldLength(0,7),8);
614 	stdoutput.printf("\n");
615 	checkSuccess(cur->getFieldLength(7,(uint32_t)0),1);
616 	//checkSuccess(cur->getFieldLength(7,1),3);
617 	//checkSuccess(cur->getFieldLength(7,2),3);
618 	checkSuccess(cur->getFieldLength(7,3),1);
619 	checkSuccess(cur->getFieldLength(7,4),9);
620 	checkSuccess(cur->getFieldLength(7,5),12);
621 	checkSuccess(cur->getFieldLength(7,6),10);
622 	checkSuccess(cur->getFieldLength(7,7),8);
623 	stdoutput.printf("\n");
624 
625 	stdoutput.printf("FIELDS BY NAME: \n");
626 	checkSuccess(cur->getField(0,"testint"),"1");
627 	//checkSuccess(cur->getField(0,"testfloat"),"1.1");
628 	//checkSuccess(cur->getField(0,"testreal"),"1.1");
629 	checkSuccess(cur->getField(0,"testsmallint"),"1");
630 	checkSuccess(cur->getField(0,"testchar"),"testchar1");
631 	checkSuccess(cur->getField(0,"testvarchar"),"testvarchar1");
632 	checkSuccess(cur->getField(0,"testdate"),"2001-01-01");
633 	checkSuccess(cur->getField(0,"testtime"),"01:00:00");
634 	stdoutput.printf("\n");
635 	checkSuccess(cur->getField(7,"testint"),"8");
636 	//checkSuccess(cur->getField(7,"testfloat"),"8.8");
637 	//checkSuccess(cur->getField(7,"testreal"),"8.8");
638 	checkSuccess(cur->getField(7,"testsmallint"),"8");
639 	checkSuccess(cur->getField(7,"testchar"),"testchar8");
640 	checkSuccess(cur->getField(7,"testvarchar"),"testvarchar8");
641 	checkSuccess(cur->getField(7,"testdate"),"2008-01-01");
642 	checkSuccess(cur->getField(7,"testtime"),"08:00:00");
643 	stdoutput.printf("\n");
644 
645 	stdoutput.printf("FIELD LENGTHS BY NAME: \n");
646 	checkSuccess(cur->getFieldLength(0,"testint"),1);
647 	//checkSuccess(cur->getFieldLength(0,"testfloat"),3);
648 	//checkSuccess(cur->getFieldLength(0,"testreal"),3);
649 	checkSuccess(cur->getFieldLength(0,"testsmallint"),1);
650 	checkSuccess(cur->getFieldLength(0,"testchar"),9);
651 	checkSuccess(cur->getFieldLength(0,"testvarchar"),12);
652 	checkSuccess(cur->getFieldLength(0,"testdate"),10);
653 	checkSuccess(cur->getFieldLength(0,"testtime"),8);
654 	stdoutput.printf("\n");
655 	checkSuccess(cur->getFieldLength(7,"testint"),1);
656 	//checkSuccess(cur->getFieldLength(7,"testfloat"),3);
657 	//checkSuccess(cur->getFieldLength(7,"testreal"),3);
658 	checkSuccess(cur->getFieldLength(7,"testsmallint"),1);
659 	checkSuccess(cur->getFieldLength(7,"testchar"),9);
660 	checkSuccess(cur->getFieldLength(7,"testvarchar"),12);
661 	checkSuccess(cur->getFieldLength(7,"testdate"),10);
662 	checkSuccess(cur->getFieldLength(7,"testtime"),8);
663 	stdoutput.printf("\n");
664 
665 	stdoutput.printf("FIELDS BY ARRAY: \n");
666 	fields=cur->getRow(0);
667 	checkSuccess(fields[0],"1");
668 	//checkSuccess(fields[1],"1.1");
669 	//checkSuccess(fields[2],"1.1");
670 	checkSuccess(fields[3],"1");
671 	checkSuccess(fields[4],"testchar1");
672 	checkSuccess(fields[5],"testvarchar1");
673 	checkSuccess(fields[6],"2001-01-01");
674 	checkSuccess(fields[7],"01:00:00");
675 	stdoutput.printf("\n");
676 
677 	stdoutput.printf("FIELD LENGTHS BY ARRAY: \n");
678 	fieldlens=cur->getRowLengths(0);
679 	checkSuccess(fieldlens[0],1);
680 	//checkSuccess(fieldlens[1],3);
681 	//checkSuccess(fieldlens[2],3);
682 	checkSuccess(fieldlens[3],1);
683 	checkSuccess(fieldlens[4],9);
684 	checkSuccess(fieldlens[5],12);
685 	checkSuccess(fieldlens[6],10);
686 	checkSuccess(fieldlens[7],8);
687 	stdoutput.printf("\n");
688 
689 	stdoutput.printf("COMMIT AND ROLLBACK: \n");
690 	secondcon=new sqlrconnection("sqlrelay",9000,"/tmp/test.socket",
691 							"test","test",0,1);
692 	secondcur=new sqlrcursor(secondcon);
693 	checkSuccess(con->commit(),1);
694 	snooze::macrosnooze(2,0);
695 	checkSuccess(secondcon->commit(),1);
696 	snooze::macrosnooze(2,0);
697 	checkSuccess(secondcur->sendQuery("select count(*) from testtable1"),1);
698 	checkSuccess(secondcur->getField(0,(uint32_t)0),"8");
699 	checkSuccess(secondcur->sendQuery("select count(*) from testtable2"),1);
700 	checkSuccess(secondcur->getField(0,(uint32_t)0),"8");
701 	checkSuccess(con->autoCommitOn(),1);
702 	checkSuccess(secondcon->autoCommitOn(),1);
703 	checkSuccess(cur->sendQuery("insert into testtable1 values (10,10.1,10.1,10,'testchar10','testvarchar10','2010-01-01','10:00:00',NULL)"),1);
704 	checkSuccess(cur->sendQuery("insert into testtable2 values (10,10.1,10.1,10,'testchar10','testvarchar10','2010-01-01','10:00:00',NULL)"),1);
705 	snooze::macrosnooze(2,0);
706 	checkSuccess(secondcur->sendQuery("select count(*) from testtable1"),1);
707 	checkSuccess(secondcur->getField(0,(uint32_t)0),"9");
708 	checkSuccess(secondcur->sendQuery("select count(*) from testtable2"),1);
709 	checkSuccess(secondcur->getField(0,(uint32_t)0),"9");
710 	checkSuccess(con->autoCommitOff(),1);
711 	checkSuccess(secondcon->autoCommitOff(),1);
712 	checkSuccess(cur->sendQuery("begin"),1);
713 	stdoutput.printf("\n");
714 
715 	// drop existing table
716 	cur->sendQuery("drop table testtable1");
717 	cur->sendQuery("drop table testtable2");
718 
719 	stdoutput.printf("\n");
720 
721 	return 0;
722 }
723