Line data Source code
1 : /*
2 : * Purpose: Test bcp functions
3 : * Functions: bcp_batch bcp_bind bcp_done bcp_init bcp_sendrow
4 : */
5 :
6 : #include "common.h"
7 :
8 : #include <assert.h>
9 :
10 : #if HAVE_SYS_STAT_H
11 : #include <sys/stat.h>
12 : #endif /* HAVE_SYS_STAT_H */
13 :
14 : #include "bcp.h"
15 :
16 : static char cmd[1024];
17 : static int init(DBPROCESS * dbproc, const char *name);
18 : static void test_bind(DBPROCESS * dbproc);
19 :
20 : /*
21 : * Static data for insertion
22 : */
23 : static int not_null_bit = 1;
24 : static char not_null_char[] = "a char";
25 : static char not_null_varchar[] = "a varchar";
26 : static char not_null_datetime[] = "Dec 17 2003 3:44PM";
27 : static char not_null_smalldatetime[] = "Dec 17 2003 3:44PM";
28 : static char not_null_money[] = "12.34";
29 : static char not_null_smallmoney[] = "12.34";
30 : static char not_null_float[] = "12.34";
31 : static char not_null_real[] = "12.34";
32 : static char not_null_decimal[] = "12.34";
33 : static char not_null_numeric[] = "12.34";
34 : static int not_null_int = 1234;
35 : static int not_null_smallint = 1234;
36 : static int not_null_tinyint = 123;
37 :
38 :
39 : static int
40 8 : init(DBPROCESS * dbproc, const char *name)
41 : {
42 8 : int res = 0;
43 : RETCODE rc;
44 :
45 8 : printf("Dropping %s.%s..%s\n", SERVER, DATABASE, name);
46 8 : sql_cmd(dbproc);
47 8 : dbsqlexec(dbproc);
48 8 : while ((rc=dbresults(dbproc)) == SUCCEED) {
49 : /* nop */
50 : }
51 8 : if (rc != NO_MORE_RESULTS)
52 : return 1;
53 :
54 8 : printf("Creating %s.%s..%s\n", SERVER, DATABASE, name);
55 8 : sql_cmd(dbproc);
56 8 : sql_cmd(dbproc);
57 :
58 8 : if (dbsqlexec(dbproc) == FAIL) {
59 0 : res = 1;
60 : }
61 48 : while ((rc=dbresults(dbproc)) == SUCCEED) {
62 40 : dbprhead(dbproc);
63 40 : dbprrow(dbproc);
64 80 : while ((rc=dbnextrow(dbproc)) == REG_ROW) {
65 0 : dbprrow(dbproc);
66 : }
67 : }
68 8 : if (rc != NO_MORE_RESULTS)
69 : return 1;
70 8 : printf("%s\n", res? "error" : "ok");
71 8 : return res;
72 : }
73 :
74 : #define VARCHAR_BIND(x) \
75 : bcp_bind( dbproc, (unsigned char *) &x, prefixlen, strlen(x), NULL, termlen, SYBVARCHAR, col++ )
76 :
77 : #define INT_BIND(x) \
78 : bcp_bind( dbproc, (unsigned char *) &x, prefixlen, -1, NULL, termlen, SYBINT4, col++ )
79 :
80 : #define NULL_BIND(x, type) \
81 : bcp_bind( dbproc, (unsigned char *) &x, prefixlen, 0, NULL, termlen, type, col++ )
82 :
83 : static void
84 8 : test_bind(DBPROCESS * dbproc)
85 : {
86 : enum { prefixlen = 0 };
87 : enum { termlen = 0 };
88 : enum NullValue { IsNull, IsNotNull };
89 :
90 : RETCODE fOK;
91 8 : int col=1;
92 :
93 : /* non nulls */
94 8 : fOK = INT_BIND(not_null_bit);
95 8 : assert(fOK == SUCCEED);
96 :
97 8 : fOK = VARCHAR_BIND(not_null_char);
98 8 : assert(fOK == SUCCEED);
99 8 : fOK = VARCHAR_BIND(not_null_varchar);
100 8 : assert(fOK == SUCCEED);
101 :
102 8 : fOK = VARCHAR_BIND(not_null_datetime);
103 8 : assert(fOK == SUCCEED);
104 8 : fOK = VARCHAR_BIND(not_null_smalldatetime);
105 8 : assert(fOK == SUCCEED);
106 :
107 8 : fOK = VARCHAR_BIND(not_null_money);
108 8 : assert(fOK == SUCCEED);
109 8 : fOK = VARCHAR_BIND(not_null_smallmoney);
110 8 : assert(fOK == SUCCEED);
111 :
112 8 : fOK = VARCHAR_BIND(not_null_float);
113 8 : assert(fOK == SUCCEED);
114 8 : fOK = VARCHAR_BIND(not_null_real);
115 8 : assert(fOK == SUCCEED);
116 :
117 8 : fOK = VARCHAR_BIND(not_null_decimal);
118 8 : assert(fOK == SUCCEED);
119 8 : fOK = VARCHAR_BIND(not_null_numeric);
120 8 : assert(fOK == SUCCEED);
121 :
122 8 : fOK = INT_BIND(not_null_int);
123 8 : assert(fOK == SUCCEED);
124 8 : fOK = INT_BIND(not_null_smallint);
125 8 : assert(fOK == SUCCEED);
126 8 : fOK = INT_BIND(not_null_tinyint);
127 8 : assert(fOK == SUCCEED);
128 :
129 : /* nulls */
130 8 : fOK = NULL_BIND(not_null_char, SYBVARCHAR);
131 8 : assert(fOK == SUCCEED);
132 8 : fOK = NULL_BIND(not_null_varchar, SYBVARCHAR);
133 8 : assert(fOK == SUCCEED);
134 :
135 8 : fOK = NULL_BIND(not_null_datetime, SYBVARCHAR);
136 8 : assert(fOK == SUCCEED);
137 8 : fOK = NULL_BIND(not_null_smalldatetime, SYBVARCHAR);
138 8 : assert(fOK == SUCCEED);
139 :
140 8 : fOK = NULL_BIND(not_null_money, SYBVARCHAR);
141 8 : assert(fOK == SUCCEED);
142 8 : fOK = NULL_BIND(not_null_smallmoney, SYBVARCHAR);
143 8 : assert(fOK == SUCCEED);
144 :
145 8 : fOK = NULL_BIND(not_null_float, SYBVARCHAR);
146 8 : assert(fOK == SUCCEED);
147 8 : fOK = NULL_BIND(not_null_real, SYBVARCHAR);
148 8 : assert(fOK == SUCCEED);
149 :
150 8 : fOK = NULL_BIND(not_null_decimal, SYBVARCHAR);
151 8 : assert(fOK == SUCCEED);
152 8 : fOK = NULL_BIND(not_null_numeric, SYBVARCHAR);
153 8 : assert(fOK == SUCCEED);
154 :
155 8 : fOK = NULL_BIND(not_null_int, SYBINT4);
156 8 : assert(fOK == SUCCEED);
157 8 : fOK = NULL_BIND(not_null_smallint, SYBINT4);
158 8 : assert(fOK == SUCCEED);
159 8 : fOK = NULL_BIND(not_null_tinyint, SYBINT4);
160 8 : assert(fOK == SUCCEED);
161 :
162 8 : }
163 :
164 : int
165 8 : main(int argc, char **argv)
166 : {
167 : LOGINREC *login;
168 : DBPROCESS *dbproc;
169 8 : int i, rows_sent=0;
170 : const char *s;
171 8 : const char *table_name = "all_types_bcp_unittest";
172 :
173 8 : set_malloc_options();
174 :
175 8 : read_login_info(argc, argv);
176 :
177 8 : printf("Starting %s\n", argv[0]);
178 :
179 8 : dbsetversion(DBVERSION_100);
180 8 : dbinit();
181 :
182 8 : dberrhandle(syb_err_handler);
183 8 : dbmsghandle(syb_msg_handler);
184 :
185 8 : printf("About to logon\n");
186 :
187 8 : login = dblogin();
188 8 : DBSETLPWD(login, PASSWORD);
189 8 : DBSETLUSER(login, USER);
190 8 : DBSETLAPP(login, "bcp.c unit test");
191 8 : BCP_SETL(login, 1);
192 :
193 8 : printf("About to open %s.%s\n", SERVER, DATABASE);
194 :
195 8 : dbproc = dbopen(login, SERVER);
196 8 : if (strlen(DATABASE))
197 8 : dbuse(dbproc, DATABASE);
198 8 : dbloginfree(login);
199 :
200 8 : if (init(dbproc, table_name))
201 0 : exit(1);
202 :
203 : /* set up and send the bcp */
204 8 : sprintf(cmd, "%s..%s", DATABASE, table_name);
205 8 : printf("preparing to insert into %s ... ", cmd);
206 8 : if (bcp_init(dbproc, cmd, NULL, NULL, DB_IN) == FAIL) {
207 0 : fprintf(stderr, "failed\n");
208 0 : exit(1);
209 : }
210 8 : printf("OK\n");
211 :
212 8 : test_bind(dbproc);
213 :
214 8 : printf("Sending same row 10 times... \n");
215 88 : for (i=0; i<10; i++) {
216 80 : if (bcp_sendrow(dbproc) == FAIL) {
217 0 : fprintf(stderr, "send failed\n");
218 0 : exit(1);
219 : }
220 : }
221 :
222 8 : printf("Sending 5 more rows ... \n");
223 112 : for (i=15; i <= 27; i++) {
224 104 : int type = dbcoltype(dbproc, i);
225 104 : int len = (type == SYBCHAR || type == SYBVARCHAR)? dbcollen(dbproc, i) : -1;
226 104 : if (bcp_collen(dbproc, len, i) == FAIL) {
227 0 : fprintf(stderr, "bcp_collen failed for column %d\n", i);
228 0 : exit(1);
229 : }
230 : }
231 40 : for (i=0; i<5; i++) {
232 40 : if (bcp_sendrow(dbproc) == FAIL) {
233 0 : fprintf(stderr, "send failed\n");
234 0 : exit(1);
235 : }
236 : }
237 : #if 1
238 8 : rows_sent = bcp_batch(dbproc);
239 8 : if (rows_sent == -1) {
240 0 : fprintf(stderr, "batch failed\n");
241 0 : exit(1);
242 : }
243 : #endif
244 :
245 8 : printf("OK\n");
246 :
247 : /* end bcp. */
248 8 : if ((rows_sent += bcp_done(dbproc)) == -1)
249 0 : printf("Bulk copy unsuccessful.\n");
250 : else
251 8 : printf("%d rows copied.\n", rows_sent);
252 :
253 :
254 8 : printf("done\n");
255 :
256 :
257 : #if 1
258 8 : sql_cmd(dbproc);
259 :
260 8 : dbsqlexec(dbproc);
261 24 : while ((i=dbresults(dbproc)) == SUCCEED) {
262 8 : dbprhead(dbproc);
263 8 : dbprrow(dbproc);
264 16 : while ((i=dbnextrow(dbproc)) == REG_ROW) {
265 0 : dbprrow(dbproc);
266 : }
267 : }
268 : #endif
269 :
270 : #ifdef DB_QUERYOUT
271 : /* test initializing with a very long query and DB_QUERYOUT */
272 8 : if (bcp_init(dbproc, select_table_sql, NULL, NULL, DB_QUERYOUT) == FAIL) {
273 0 : fprintf(stderr, "failed\n");
274 0 : exit(1);
275 : }
276 8 : bcp_done(dbproc);
277 8 : printf("OK\n");
278 : #endif
279 :
280 8 : if ((s = getenv("BCP")) != NULL && 0 == strcmp(s, "nodrop")) {
281 0 : printf("BCP=nodrop: '%s..%s' kept\n", DATABASE, table_name);
282 : } else {
283 8 : printf("Dropping table %s\n", table_name);
284 8 : sql_cmd(dbproc);
285 8 : dbsqlexec(dbproc);
286 8 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
287 : /* nop */
288 : }
289 : }
290 8 : dbexit();
291 :
292 8 : printf("%s OK\n", __FILE__);
293 : return 0;
294 : }
|