1 #include "common.h"
2 
3 #include <common/test_assert.h>
4 
5 static char software_version[] = "$Id: rowset.c 487476 2015-12-17 19:48:39Z ucko $";
6 static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };
7 
8 static void
test_err(int n)9 test_err(int n)
10 {
11 	CHKSetStmtAttr(SQL_ROWSET_SIZE, (SQLPOINTER) int2ptr(n), 0, "E");
12 	odbc_read_error();
13 	if (strcmp(odbc_sqlstate, "HY024") != 0) {
14 		fprintf(stderr, "Unexpected sql state returned\n");
15 		odbc_disconnect();
16 		exit(1);
17 	}
18 }
19 
20 int
main(int argc,char * argv[])21 main(int argc, char *argv[])
22 {
23 	int i;
24 	SQLLEN len;
25 #ifdef HAVE_SQLROWSETSIZE
26 	SQLROWSETSIZE row_count;
27 #else
28 	SQLULEN row_count;
29 #endif
30 	SQLUSMALLINT statuses[10];
31 	char buf[32];
32 
33 	odbc_use_version3 = 1;
34 	odbc_connect();
35 
36 	/* initial value should be 1 */
37 	CHKGetStmtAttr(SQL_ROWSET_SIZE, &len, sizeof(len), NULL, "S");
38 	if (len != 1) {
39 		fprintf(stderr, "len should be 1\n");
40 		odbc_disconnect();
41 		return 1;
42 	}
43 
44 	/* check invalid parameter values */
45 	test_err(-123);
46 	test_err(-1);
47 	test_err(0);
48 
49 	odbc_check_cursor();
50 
51 	/* set some correct values */
52 	CHKSetStmtAttr(SQL_ROWSET_SIZE, (SQLPOINTER) int2ptr(2), 0, "S");
53 	CHKSetStmtAttr(SQL_ROWSET_SIZE, (SQLPOINTER) int2ptr(1), 0, "S");
54 
55 	/* now check that SQLExtendedFetch works as expected */
56 	odbc_command("CREATE TABLE #rowset(n INTEGER, c VARCHAR(20))");
57 	for (i = 0; i < 10; ++i) {
58 		char s[10];
59 		char sql[128];
60 
61 		memset(s, 'a' + i, 9);
62 		s[9] = 0;
63 		sprintf(sql, "INSERT INTO #rowset(n,c) VALUES(%d,'%s')", i+1, s);
64 		odbc_command(sql);
65 	}
66 
67 	odbc_reset_statement();
68 	CHKSetStmtOption(SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_DYNAMIC, "S");
69 	CHKExecDirect(T("SELECT * FROM #rowset ORDER BY n"), SQL_NTS, "SI");
70 
71 	CHKBindCol(2, SQL_C_CHAR, buf, sizeof(buf), &len, "S");
72 
73 	row_count = 0xdeadbeef;
74 	memset(statuses, 0x55, sizeof(statuses));
75 	CHKExtendedFetch(SQL_FETCH_NEXT, 1, &row_count, statuses, "S");
76 
77 	if (row_count != 1 || statuses[0] != SQL_ROW_SUCCESS || strcmp(buf, "aaaaaaaaa") != 0) {
78 		fprintf(stderr, "Invalid result\n");
79 		odbc_disconnect();
80 		return 1;
81 	}
82 
83 	odbc_disconnect();
84 
85 	printf("Done.\n");
86 	return 0;
87 }
88