Line data Source code
1 : /*
2 : * Purpose: Test bcp in, with dbvarylen()
3 : * Functions: bcp_colfmt bcp_columns bcp_exec bcp_init dbvarylen
4 : */
5 :
6 : #include "common.h"
7 : #include <assert.h>
8 :
9 : int
10 8 : main(int argc, char *argv[])
11 : {
12 8 : int failed = 0;
13 : LOGINREC *login;
14 : DBPROCESS *dbproc;
15 : int i;
16 : RETCODE ret;
17 8 : int big_endian = 1;
18 :
19 8 : char *out_file = "t0017.out";
20 : static const char in_file_le[] = FREETDS_SRCDIR "/t0017.in";
21 : static const char in_file_be[] = FREETDS_SRCDIR "/t0017.in.be";
22 8 : const char *in_file = in_file_le;
23 8 : const char *err_file = "t0017.err";
24 : DBINT rows_copied;
25 8 : int num_cols = 0;
26 : int col_type[256];
27 : DBBOOL col_varylen[256];
28 : int prefix_len;
29 :
30 : if (((char *) &big_endian)[0] == 1)
31 8 : big_endian = 0;
32 : if (big_endian)
33 : in_file = in_file_be;
34 :
35 8 : setbuf(stdout, NULL);
36 8 : setbuf(stderr, NULL);
37 :
38 8 : set_malloc_options();
39 :
40 8 : read_login_info(argc, argv);
41 8 : printf("Starting %s\n", argv[0]);
42 8 : dbinit();
43 :
44 8 : dberrhandle(syb_err_handler);
45 8 : dbmsghandle(syb_msg_handler);
46 :
47 8 : printf("About to logon ... ");
48 :
49 8 : login = dblogin();
50 8 : assert(login);
51 8 : BCP_SETL(login, TRUE);
52 8 : DBSETLPWD(login, PASSWORD);
53 8 : DBSETLUSER(login, USER);
54 8 : DBSETLAPP(login, "t0017");
55 8 : printf("done\n");
56 :
57 8 : printf("Opening \"%s\" for \"%s\" ... ", SERVER, USER);
58 8 : dbproc = dbopen(login, SERVER);
59 8 : assert(dbproc);
60 8 : if (strlen(DATABASE)) {
61 8 : dbuse(dbproc, DATABASE);
62 : }
63 8 : dbloginfree(login);
64 8 : printf("done\n");
65 :
66 8 : printf("Creating table ... ");
67 8 : sql_cmd(dbproc);
68 8 : dbsqlexec(dbproc);
69 8 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
70 : /* nop */
71 : }
72 8 : printf("done\n");
73 :
74 8 : sql_cmd(dbproc);
75 8 : dbsqlexec(dbproc);
76 8 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
77 : /* nop */
78 : }
79 :
80 : /* BCP out */
81 8 : printf("bcp_init... ");
82 8 : ret = bcp_init(dbproc, "#dblib0017", out_file, err_file, DB_OUT);
83 8 : if (ret != SUCCEED)
84 0 : failed = 1;
85 8 : printf("done\n");
86 :
87 8 : printf("Issuing SELECT ... ");
88 8 : sql_cmd(dbproc);
89 8 : dbsqlexec(dbproc);
90 8 : printf("done\nFetching metadata ... ");
91 8 : if (dbresults(dbproc) != FAIL) {
92 8 : num_cols = dbnumcols(dbproc);
93 24 : for (i = 0; i < num_cols; ++i) {
94 16 : col_type[i] = dbcoltype(dbproc, i + 1);
95 16 : col_varylen[i] = dbvarylen(dbproc, i + 1);
96 : }
97 8 : while (dbnextrow(dbproc) != NO_MORE_ROWS) {
98 : }
99 : }
100 8 : printf("done\n");
101 :
102 8 : printf("bcp_columns ... ");
103 8 : ret = bcp_columns(dbproc, num_cols);
104 8 : if (ret != SUCCEED)
105 0 : failed = 1;
106 24 : for (i = 0; i < num_cols; i++) {
107 16 : prefix_len = 0;
108 16 : if (col_type[i] == SYBIMAGE || col_type[i] == SYBTEXT) {
109 : prefix_len = 4;
110 8 : } else if (col_varylen[i]) {
111 8 : prefix_len = 1;
112 : }
113 16 : printf("bind %d prefix %d col_type %s\n", i, prefix_len, col_type[i] == SYBIMAGE ? "image" : "other");
114 16 : ret = bcp_colfmt(dbproc, i + 1, col_type[i], prefix_len, -1, NULL, 0, i + 1);
115 16 : if (ret == FAIL) {
116 0 : fprintf(stderr, "return from bcp_colfmt = %d\n", ret);
117 0 : failed = 1;
118 : }
119 : }
120 8 : printf("done\n");
121 :
122 8 : rows_copied = -1;
123 8 : printf("bcp_exec ... ");
124 8 : ret = bcp_exec(dbproc, &rows_copied);
125 8 : if (ret != SUCCEED || rows_copied != 1)
126 0 : failed = 1;
127 :
128 8 : printf("%d rows copied\n", rows_copied);
129 :
130 : /* delete rows */
131 8 : sql_cmd(dbproc);
132 8 : dbsqlexec(dbproc);
133 8 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
134 : /* nop */
135 : }
136 :
137 : /*
138 : * BCP in
139 : */
140 8 : printf("bcp_init... ");
141 8 : ret = bcp_init(dbproc, "#dblib0017", in_file, err_file, DB_IN);
142 8 : if (ret != SUCCEED)
143 0 : failed = 1;
144 8 : printf("done\n");
145 :
146 8 : printf("Issuing SELECT ... ");
147 8 : sql_cmd(dbproc);
148 8 : dbsqlexec(dbproc);
149 8 : printf("done\nFetching metadata ... ");
150 8 : if (dbresults(dbproc) != FAIL) {
151 8 : num_cols = dbnumcols(dbproc);
152 24 : for (i = 0; i < num_cols; i++) {
153 16 : col_type[i] = dbcoltype(dbproc, i + 1);
154 16 : col_varylen[i] = dbvarylen(dbproc, i + 1);
155 : }
156 8 : while (dbnextrow(dbproc) != NO_MORE_ROWS) {
157 : }
158 : }
159 8 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
160 : /* nop */
161 : }
162 8 : printf("done\n");
163 :
164 8 : printf("bcp_columns ... ");
165 8 : ret = bcp_columns(dbproc, num_cols);
166 8 : if (ret != SUCCEED)
167 0 : failed = 1;
168 24 : for (i = 0; i < num_cols; i++) {
169 16 : prefix_len = 0;
170 16 : if (col_type[i] == SYBIMAGE || col_type[i] == SYBTEXT) {
171 : prefix_len = 4;
172 8 : } else if (col_varylen[i]) {
173 8 : prefix_len = 1;
174 : }
175 16 : ret = bcp_colfmt(dbproc, i + 1, col_type[i], prefix_len, -1, NULL, 0, i + 1);
176 16 : if (ret == FAIL) {
177 0 : fprintf(stderr, "return from bcp_colfmt = %d\n", ret);
178 0 : failed = 1;
179 : }
180 : }
181 8 : printf("done\n");
182 :
183 8 : printf("bcp_exec ... ");
184 8 : rows_copied = -1;
185 8 : ret = bcp_exec(dbproc, &rows_copied);
186 8 : if (ret != SUCCEED || rows_copied != 1)
187 0 : failed = 1;
188 8 : printf("done\n");
189 :
190 :
191 : /* test we inserted correctly row */
192 8 : if (!failed) {
193 8 : sql_cmd(dbproc);
194 8 : dbsqlexec(dbproc);
195 44 : while (dbresults(dbproc) != NO_MORE_RESULTS) {
196 28 : while ((ret=dbnextrow(dbproc)) != NO_MORE_ROWS) {
197 0 : fprintf(stderr, "Invalid dbnextrow result %d executing query\n", ret);
198 0 : failed = 1;
199 : }
200 : }
201 : }
202 :
203 8 : printf("%d rows copied\n", rows_copied);
204 8 : dbclose(dbproc);
205 8 : dbexit();
206 :
207 8 : printf("dblib %s on %s\n", (failed ? "failed!" : "okay"), __FILE__);
208 8 : return failed ? 1 : 0;
209 : }
|