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