1 #include <config.h>
2 
3 #if HAVE_STRING_H
4 #include <string.h>
5 #endif /* HAVE_STRING_H */
6 
7 #include <stdio.h>
8 #include <ctpublic.h>
9 #include <bkpublic.h>
10 #include "common.h"
11 
12 /* Testing: array binding of result set */
13 int
main(int argc,char * argv[])14 main(int argc, char *argv[])
15 {
16 	CS_CONTEXT *ctx;
17 	CS_CONNECTION *conn;
18 	CS_COMMAND *cmd;
19 	CS_BLKDESC *blkdesc;
20 	int verbose = 0;
21 
22 	CS_RETCODE ret;
23 
24 	CS_DATAFMT datafmt;
25 	CS_INT count = 0;
26 
27 	CS_INT  col1[2];
28 	CS_CHAR col2[2][5];
29 	CS_CHAR col3[2][32];
30 	CS_INT      lencol1[2];
31 	CS_SMALLINT indcol1[2];
32 	CS_INT      lencol2[2];
33 	CS_SMALLINT indcol2[2];
34 	CS_INT      lencol3[2];
35 	CS_SMALLINT indcol3[2];
36 
37 	int i;
38 
39 
40 	printf("%s: Retrieve data using array binding \n", __FILE__);
41 	if (verbose) {
42 		printf("Trying login\n");
43 	}
44 	ret = try_ctlogin(&ctx, &conn, &cmd, verbose);
45 	if (ret != CS_SUCCEED) {
46 		fprintf(stderr, "Login failed\n");
47 		return 1;
48 	}
49 
50 	/* do not test error */
51 	ret = run_command(cmd, "IF OBJECT_ID('tempdb..#ctlibarray') IS NOT NULL DROP TABLE #ctlibarray");
52 
53 	ret = run_command(cmd, "CREATE TABLE #ctlibarray (col1 int null,  col2 char(4) not null, col3 datetime not null)");
54 	if (ret != CS_SUCCEED)
55 		return 1;
56 
57 	ret = run_command(cmd, "insert into #ctlibarray values (1, 'AAAA', 'Jan  1 2002 10:00:00AM')");
58 	if (ret != CS_SUCCEED)
59 		return 1;
60 
61 	ret = run_command(cmd, "insert into #ctlibarray values (2, 'BBBB', 'Jan  2 2002 10:00:00AM')");
62 	if (ret != CS_SUCCEED)
63 		return 1;
64 
65 	ret = run_command(cmd, "insert into #ctlibarray values (3, 'CCCC', 'Jan  3 2002 10:00:00AM')");
66 	if (ret != CS_SUCCEED)
67 		return 1;
68 
69 	ret = run_command(cmd, "insert into #ctlibarray values (8, 'DDDD', 'Jan  4 2002 10:00:00AM')");
70 	if (ret != CS_SUCCEED)
71 		return 1;
72 
73 	ret = run_command(cmd, "insert into #ctlibarray values (NULL, 'EEEE', 'Jan  5 2002 10:00:00AM')");
74 	if (ret != CS_SUCCEED)
75 		return 1;
76 
77 	ret = blk_alloc(conn, BLK_VERSION_100, &blkdesc);
78 	if (ret != CS_SUCCEED) {
79 		fprintf(stderr, "blk_alloc() failed\n");
80 		return 1;
81 	}
82 
83 	ret = blk_init(blkdesc, CS_BLK_OUT, "#ctlibarray", CS_NULLTERM );
84 
85 	if (ret != CS_SUCCEED) {
86 		fprintf(stderr, "blk_init() failed\n");
87 		return 1;
88 	}
89 
90 
91 	ret = blk_describe(blkdesc, 1, &datafmt);
92 	if (ret != CS_SUCCEED) {
93 		fprintf(stderr, "blk_describe(1) failed");
94 		return 1;
95 	}
96 
97 	datafmt.format = CS_FMT_UNUSED;
98 	if (datafmt.maxlength > 1024) {
99 		datafmt.maxlength = 1024;
100 	}
101 
102 	datafmt.count = 2;
103 
104 	ret = blk_bind(blkdesc, 1, &datafmt, &col1[0], &lencol1[0], &indcol1[0]);
105 	if (ret != CS_SUCCEED) {
106 		fprintf(stderr, "blk_bind() failed\n");
107 		return 1;
108 	}
109 
110 
111 	ret = blk_describe(blkdesc, 2, &datafmt);
112 	if (ret != CS_SUCCEED) {
113 		fprintf(stderr, "blk_describe(2) failed");
114 		return 1;
115 	}
116 
117 	datafmt.format = CS_FMT_NULLTERM;
118 	datafmt.maxlength = 5;
119 	datafmt.count = 2;
120 
121 	ret = blk_bind(blkdesc, 2, &datafmt, col2[0], &lencol2[0], &indcol2[0]);
122 	if (ret != CS_SUCCEED) {
123 		fprintf(stderr, "blk_bind() failed\n");
124 		return 1;
125 	}
126 
127 	ret = blk_describe(blkdesc, 3, &datafmt);
128 	if (ret != CS_SUCCEED) {
129 		fprintf(stderr, "blk_describe() failed");
130 		return 1;
131 	}
132 
133 	datafmt.datatype = CS_CHAR_TYPE;
134 	datafmt.format = CS_FMT_NULLTERM;
135 	datafmt.maxlength = 32;
136 	datafmt.count = 2;
137 
138 	ret = blk_bind(blkdesc, 3, &datafmt, col3[0], &lencol3[0], &indcol3[0]);
139 	if (ret != CS_SUCCEED) {
140 		fprintf(stderr, "ct_bind() failed\n");
141 		return 1;
142 	}
143 
144 	while((ret = blk_rowxfer_mult(blkdesc, &count)) == CS_SUCCEED) {
145 		for(i = 0; i < count; i++) {
146 			printf("retrieved %d (%d,%d) %s (%d,%d) %s (%d,%d)\n",
147 				col1[i], lencol1[i], indcol1[i],
148 				col2[i], lencol2[i], indcol2[i],
149 				col3[i], lencol3[i], indcol3[i] );
150 		}
151 	}
152 	switch (ret) {
153 	case CS_END_DATA:
154 		for(i = 0; i < count; i++) {
155 			printf("retrieved %d (%d,%d) %s (%d,%d) %s (%d,%d)\n",
156 				col1[i], lencol1[i], indcol1[i],
157 				col2[i], lencol2[i], indcol2[i],
158 				col3[i], lencol3[i], indcol3[i] );
159 		}
160 		break;
161 	case CS_FAIL:
162 	case CS_ROW_FAIL:
163 		fprintf(stderr, "blk_rowxfer_mult() failed\n");
164 		return 1;
165 	}
166 
167 	blk_drop(blkdesc);
168 
169 	ret = try_ctlogout(ctx, conn, cmd, verbose);
170 	if (ret != CS_SUCCEED) {
171 		fprintf(stderr, "Logout failed\n");
172 		return 1;
173 	}
174 
175 	return 0;
176 }
177