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