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