1 : #if HAVE_CONFIG_H
2 : #include <config.h>
3 : #endif /* HAVE_CONFIG_H */
4 :
5 : #include <stdio.h>
6 : #include <assert.h>
7 :
8 : #if HAVE_STDLIB_H
9 : #include <stdlib.h>
10 : #endif /* HAVE_STDLIB_H */
11 :
12 : #if HAVE_SYS_STAT_H
13 : #include <sys/stat.h>
14 : #endif /* HAVE_SYS_STAT_H */
15 :
16 : #if HAVE_STRING_H
17 : #include <string.h>
18 : #endif /* HAVE_STRING_H */
19 :
20 :
21 : #include <ctpublic.h>
22 : #include <bkpublic.h>
23 : #include "common.h"
24 : #include "blk_in.h"
25 :
26 : static int
27 : do_bind(CS_BLKDESC * blkdesc, int colnum, CS_INT host_format, CS_INT host_type, CS_INT host_maxlen,
28 : void *var_addr,
29 : CS_INT *var_len_addr,
30 : CS_SMALLINT *var_ind_addr );
31 :
32 : static char command[512];
33 :
34 : /*
35 : * Static data for insertion
36 : */
37 : int not_null_bit = 1;
38 : CS_INT l_not_null_bit = 4;
39 : CS_SMALLINT i_not_null_bit = 0;
40 :
41 : char not_null_char[] = "a char";
42 : CS_INT l_not_null_char = 6;
43 : CS_SMALLINT i_not_null_char = 0;
44 :
45 : char not_null_varchar[] = "a varchar";
46 : CS_INT l_not_null_varchar = 9;
47 : CS_SMALLINT i_not_null_varchar = 0;
48 :
49 : char not_null_datetime[] = "Dec 17 2003 3:44PM";
50 : CS_INT l_not_null_datetime = 19;
51 : CS_SMALLINT i_not_null_datetime = 0;
52 :
53 : char not_null_smalldatetime[] = "Dec 17 2003 3:44PM";
54 : CS_INT l_not_null_smalldatetime = 19;
55 : CS_SMALLINT i_not_null_smalldatetime = 0;
56 :
57 : char not_null_money[] = "12.34";
58 : CS_INT l_not_null_money = 5;
59 : CS_SMALLINT i_not_null_money = 0;
60 :
61 : char not_null_smallmoney[] = "12.34";
62 : CS_INT l_not_null_smallmoney = 5;
63 : CS_SMALLINT i_not_null_smallmoney = 0;
64 :
65 : char not_null_float[] = "12.34";
66 : CS_INT l_not_null_float = 5;
67 : CS_SMALLINT i_not_null_float = 0;
68 :
69 : char not_null_real[] = "12.34";
70 : CS_INT l_not_null_real = 5;
71 : CS_SMALLINT i_not_null_real = 0;
72 :
73 : char not_null_decimal[] = "12.34";
74 : CS_INT l_not_null_decimal = 5;
75 : CS_SMALLINT i_not_null_decimal = 0;
76 :
77 : char not_null_numeric[] = "12.34";
78 : CS_INT l_not_null_numeric = 5;
79 : CS_SMALLINT i_not_null_numeric = 0;
80 :
81 : int not_null_int = 1234;
82 : CS_INT l_not_null_int = 4;
83 : CS_SMALLINT i_not_null_int = 0;
84 :
85 : int not_null_smallint = 1234;
86 : CS_INT l_not_null_smallint = 4;
87 : CS_SMALLINT i_not_null_smallint = 0;
88 :
89 : int not_null_tinyint = 123;
90 : CS_INT l_not_null_tinyint = 4;
91 : CS_SMALLINT i_not_null_tinyint = 0;
92 :
93 : CS_INT l_null_char = 0;
94 : CS_SMALLINT i_null_char = -1;
95 :
96 : CS_INT l_null_varchar = 0;
97 : CS_SMALLINT i_null_varchar = -1;
98 :
99 : CS_INT l_null_datetime = 0;
100 : CS_SMALLINT i_null_datetime = -1;
101 :
102 : CS_INT l_null_smalldatetime = 0;
103 : CS_SMALLINT i_null_smalldatetime = -1;
104 :
105 : CS_INT l_null_money = 0;
106 : CS_SMALLINT i_null_money = -1;
107 :
108 : CS_INT l_null_smallmoney = 0;
109 : CS_SMALLINT i_null_smallmoney = -1;
110 :
111 : CS_INT l_null_float = 0;
112 : CS_SMALLINT i_null_float = -1;
113 :
114 : CS_INT l_null_real = 0;
115 : CS_SMALLINT i_null_real = -1;
116 :
117 : CS_INT l_null_decimal = 0;
118 : CS_SMALLINT i_null_decimal = -1;
119 :
120 : CS_INT l_null_numeric = 0;
121 : CS_SMALLINT i_null_numeric = -1;
122 :
123 : CS_INT l_null_int = 0;
124 : CS_SMALLINT i_null_int = -1;
125 :
126 : CS_INT l_null_smallint = 0;
127 : CS_SMALLINT i_null_smallint = -1;
128 :
129 : CS_INT l_null_tinyint = 0;
130 : CS_SMALLINT i_null_tinyint = -1;
131 :
132 : static void
133 : do_binds(CS_BLKDESC * blkdesc)
134 2 : {
135 : enum { prefixlen = 0 };
136 : enum { termlen = 0 };
137 : enum NullValue { IsNull, IsNotNull };
138 :
139 : CS_RETCODE ret;
140 :
141 : /* non nulls */
142 :
143 2 : ret = do_bind(blkdesc, 1, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_bit, &l_not_null_bit, &i_not_null_bit);
144 2 : ret = do_bind(blkdesc, 2, CS_FMT_NULLTERM, CS_CHAR_TYPE, 7, not_null_char, &l_not_null_char, &i_not_null_char);
145 2 : ret = do_bind(blkdesc, 3, CS_FMT_NULLTERM, CS_CHAR_TYPE, 10, not_null_varchar, &l_not_null_varchar, &i_not_null_varchar);
146 2 : ret = do_bind(blkdesc, 4, CS_FMT_NULLTERM, CS_CHAR_TYPE, 20, not_null_datetime, &l_not_null_datetime, &i_not_null_datetime);
147 2 : ret = do_bind(blkdesc, 5, CS_FMT_NULLTERM, CS_CHAR_TYPE, 20, not_null_smalldatetime, &l_not_null_smalldatetime, &i_not_null_smalldatetime);
148 2 : ret = do_bind(blkdesc, 6, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_money, &l_not_null_money, &i_not_null_money);
149 2 : ret = do_bind(blkdesc, 7, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_smallmoney, &l_not_null_smallmoney, &i_not_null_smallmoney);
150 2 : ret = do_bind(blkdesc, 8, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_float, &l_not_null_float, &i_not_null_float);
151 2 : ret = do_bind(blkdesc, 9, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_real, &l_not_null_real, &i_not_null_real);
152 2 : ret = do_bind(blkdesc, 10, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_decimal, &l_not_null_decimal, &i_not_null_decimal);
153 2 : ret = do_bind(blkdesc, 11, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_numeric, &l_not_null_numeric, &i_not_null_numeric);
154 2 : ret = do_bind(blkdesc, 12, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_int, &l_not_null_int, &i_not_null_int);
155 2 : ret = do_bind(blkdesc, 13, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_smallint, &l_not_null_smallint, &i_not_null_smallint);
156 2 : ret = do_bind(blkdesc, 14, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_tinyint, &l_not_null_tinyint, &i_not_null_tinyint);
157 :
158 : /* nulls */
159 :
160 2 : ret = do_bind(blkdesc, 15, CS_FMT_NULLTERM, CS_CHAR_TYPE, 7, not_null_char, &l_null_char, &i_null_char);
161 2 : ret = do_bind(blkdesc, 16, CS_FMT_NULLTERM, CS_CHAR_TYPE, 10, not_null_varchar, &l_null_varchar, &i_null_varchar);
162 2 : ret = do_bind(blkdesc, 17, CS_FMT_NULLTERM, CS_CHAR_TYPE, 20, not_null_datetime, &l_null_datetime, &i_null_datetime);
163 2 : ret = do_bind(blkdesc, 18, CS_FMT_NULLTERM, CS_CHAR_TYPE, 20, not_null_smalldatetime, &l_null_smalldatetime, &i_null_smalldatetime);
164 2 : ret = do_bind(blkdesc, 19, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_money, &l_null_money, &i_null_money);
165 2 : ret = do_bind(blkdesc, 20, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_smallmoney, &l_null_smallmoney, &i_null_smallmoney);
166 2 : ret = do_bind(blkdesc, 21, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_float, &l_null_float, &i_null_float);
167 2 : ret = do_bind(blkdesc, 22, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_real, &l_null_real, &i_null_real);
168 2 : ret = do_bind(blkdesc, 23, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_decimal, &l_null_decimal, &i_null_decimal);
169 2 : ret = do_bind(blkdesc, 24, CS_FMT_NULLTERM, CS_CHAR_TYPE, 6, not_null_numeric, &l_null_numeric, &i_null_numeric);
170 2 : ret = do_bind(blkdesc, 25, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_int, &l_null_int, &i_null_int);
171 2 : ret = do_bind(blkdesc, 26, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_smallint, &l_null_smallint, &i_null_smallint);
172 2 : ret = do_bind(blkdesc, 27, CS_FMT_UNUSED, CS_INT_TYPE, 4, ¬_null_tinyint, &l_null_tinyint, &i_null_tinyint);
173 :
174 2 : }
175 :
176 : static int
177 : do_bind(CS_BLKDESC * blkdesc, int colnum, CS_INT host_format, CS_INT host_type, CS_INT host_maxlen,
178 : void *var_addr,
179 : CS_INT *var_len_addr,
180 : CS_SMALLINT *var_ind_addr )
181 54 : {
182 : CS_DATAFMT datafmt;
183 : CS_RETCODE ret;
184 :
185 54 : ret = blk_describe(blkdesc, colnum, &datafmt);
186 54 : if (ret != CS_SUCCEED) {
187 0 : fprintf(stderr, "blk_describe(%d) failed", colnum);
188 0 : return CS_FAIL;
189 : }
190 :
191 54 : datafmt.format = host_format;
192 54 : datafmt.datatype = host_type;
193 54 : datafmt.maxlength = host_maxlen;
194 54 : datafmt.count = 1;
195 :
196 54 : ret = blk_bind(blkdesc, colnum, &datafmt, var_addr, var_len_addr, var_ind_addr );
197 54 : if (ret != CS_SUCCEED) {
198 0 : fprintf(stderr, "blk_bind() failed\n");
199 0 : return CS_FAIL;
200 : }
201 54 : return CS_SUCCEED;
202 : }
203 :
204 :
205 : int
206 : main(int argc, char **argv)
207 2 : {
208 : CS_CONTEXT *ctx;
209 : CS_CONNECTION *conn;
210 : CS_COMMAND *cmd;
211 : CS_BLKDESC *blkdesc;
212 2 : int verbose = 0;
213 2 : int count = 0;
214 2 : int ret = 0;
215 : int i;
216 :
217 2 : const char *table_name = "all_types_bcp_unittest";
218 :
219 2 : fprintf(stdout, "%s: Retrieve data using array binding \n", __FILE__);
220 2 : if (verbose) {
221 0 : fprintf(stdout, "Trying login\n");
222 : }
223 2 : ret = try_ctlogin(&ctx, &conn, &cmd, verbose);
224 2 : if (ret != CS_SUCCEED) {
225 0 : fprintf(stderr, "Login failed\n");
226 0 : return 1;
227 : }
228 :
229 2 : sprintf(command,"if exists (select 1 from sysobjects where type = 'U' and name = '%s') drop table %s",
230 : table_name, table_name);
231 :
232 2 : ret = run_command(cmd, command);
233 2 : if (ret != CS_SUCCEED)
234 0 : return 1;
235 :
236 2 : ret = run_command(cmd, create_table_sql);
237 2 : if (ret != CS_SUCCEED)
238 0 : return 1;
239 :
240 2 : ret = blk_alloc(conn, BLK_VERSION_100, &blkdesc);
241 2 : if (ret != CS_SUCCEED) {
242 0 : fprintf(stderr, "blk_alloc() failed\n");
243 0 : return 1;
244 : }
245 :
246 2 : ret = blk_init(blkdesc, CS_BLK_IN, (char *) table_name, CS_NULLTERM );
247 :
248 2 : if (ret != CS_SUCCEED) {
249 0 : fprintf(stderr, "blk_init() failed\n");
250 0 : return 1;
251 : }
252 :
253 2 : do_binds(blkdesc);
254 :
255 2 : fprintf(stdout, "Sending same row 10 times... \n");
256 22 : for (i=0; i<10; i++) {
257 20 : if((ret = blk_rowxfer(blkdesc)) != CS_SUCCEED) {
258 0 : fprintf(stderr, "blk_rowxfer() failed\n");
259 0 : return 1;
260 : }
261 : }
262 :
263 2 : ret = blk_done(blkdesc, CS_BLK_ALL, &count);
264 2 : if (ret != CS_SUCCEED) {
265 0 : fprintf(stderr, "blk_done() failed\n");
266 0 : return 1;
267 : }
268 :
269 2 : blk_drop(blkdesc);
270 :
271 2 : printf("%d rows copied.\n", count);
272 :
273 2 : printf("done\n");
274 :
275 2 : ret = try_ctlogout(ctx, conn, cmd, verbose);
276 2 : if (ret != CS_SUCCEED) {
277 0 : fprintf(stderr, "Logout failed\n");
278 0 : return 1;
279 : }
280 :
281 2 : return 0;
282 : }
|