Line data Source code
1 : #include "common.h"
2 :
3 : #include <stdarg.h>
4 :
5 : static CS_CONNECTION *conn = NULL;
6 :
7 : /* Testing: Retrieve CS_TEXT_TYPE using ct_bind() */
8 : int
9 8 : main(void)
10 : {
11 : CS_CONTEXT *ctx;
12 : CS_COMMAND *cmd;
13 8 : int i, verbose = 0;
14 :
15 : CS_RETCODE ret;
16 : CS_RETCODE ret2;
17 : CS_RETCODE results_ret;
18 : CS_INT result_type;
19 : CS_INT num_cols;
20 :
21 : CS_DATAFMT datafmt;
22 : CS_INT datalength;
23 : CS_SMALLINT ind;
24 8 : CS_INT count, row_count = 0;
25 :
26 : CS_INT id;
27 : CS_CHAR name[600];
28 : CS_CHAR *nameptr;
29 : CS_INT getlen;
30 :
31 : char large_sql[1024];
32 : char len600[601];
33 : char len800[801];
34 : char temp[11];
35 :
36 : char *textptr;
37 : CS_IODESC iodesc;
38 :
39 : int tds_version;
40 :
41 8 : len600[0] = 0;
42 8 : name[0] = 0;
43 488 : for (i = 0; i < 60; i++) {
44 480 : sprintf(temp, "_abcde_%03d", (i + 1) * 10);
45 480 : strcat(len600, temp);
46 : }
47 8 : len600[600] = '\0';
48 :
49 8 : len800[0] = 0;
50 648 : for (i = 0; i < 80; i++) {
51 640 : sprintf(temp, "_zzzzz_%03d", (i + 1) * 10);
52 640 : strcat(len800, temp);
53 : }
54 8 : len800[800] = '\0';
55 :
56 :
57 8 : printf("%s: Retrieve CS_TEXT_TYPE using ct_bind()\n", __FILE__);
58 : if (verbose) {
59 : printf("Trying login\n");
60 : }
61 8 : check_call(try_ctlogin, (&ctx, &conn, &cmd, verbose));
62 :
63 8 : check_call(ct_con_props, (conn, CS_GET, CS_TDS_VERSION, &tds_version, CS_UNUSED, NULL));
64 : #ifdef CS_TDS_72
65 8 : if (tds_version >= CS_TDS_72) {
66 2 : printf("Protocol TDS7.2+ detected, test not supported\n");
67 2 : try_ctlogout(ctx, conn, cmd, verbose);
68 2 : return 0;
69 : }
70 : #endif
71 :
72 6 : check_call(run_command, (cmd, "CREATE TABLE #test_table (id int, name text)"));
73 :
74 6 : sprintf(large_sql, "INSERT #test_table (id, name) VALUES (2, '%s')", len600);
75 6 : check_call(run_command, (cmd, large_sql));
76 :
77 6 : check_call(ct_command, (cmd, CS_LANG_CMD, "SELECT id, name FROM #test_table", CS_NULLTERM, CS_UNUSED));
78 6 : check_call(ct_send, (cmd));
79 6 : while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
80 12 : switch ((int) result_type) {
81 : case CS_CMD_SUCCEED:
82 : break;
83 : case CS_CMD_DONE:
84 : break;
85 0 : case CS_CMD_FAIL:
86 0 : fprintf(stderr, "ct_results() result_type CS_CMD_FAIL.\n");
87 0 : return 1;
88 6 : case CS_ROW_RESULT:
89 6 : check_call(ct_res_info, (cmd, CS_NUMDATA, &num_cols, CS_UNUSED, NULL));
90 6 : if (num_cols != 2) {
91 0 : fprintf(stderr, "num_cols %d != 2", num_cols);
92 0 : return 1;
93 : }
94 :
95 6 : check_call(ct_describe, (cmd, 1, &datafmt));
96 6 : datafmt.format = CS_FMT_UNUSED;
97 6 : if (datafmt.maxlength > 1024) {
98 0 : datafmt.maxlength = 1024;
99 : }
100 6 : check_call(ct_bind, (cmd, 1, &datafmt, &id, &datalength, &ind));
101 :
102 6 : while (((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED)
103 6 : || (ret == CS_ROW_FAIL)) {
104 6 : row_count += count;
105 6 : if (ret == CS_ROW_FAIL) {
106 0 : fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
107 0 : return 1;
108 : } else { /* ret == CS_SUCCEED */
109 : if (verbose) {
110 : printf("id = '%d'\n", id);
111 : }
112 :
113 : nameptr = name;
114 18 : while ((ret2 = ct_get_data(cmd, 2 , nameptr, 200, &getlen )) == CS_SUCCEED) {
115 12 : nameptr += getlen;
116 : }
117 6 : if (ret2 != CS_END_DATA) {
118 0 : fprintf(stderr, "ct_get_data() failed\n");
119 0 : return 1;
120 : }
121 :
122 6 : if (memcmp(name, len600, 600)) {
123 0 : fprintf(stderr, "Bad return data\n");
124 0 : return 1;
125 : }
126 6 : printf("%s: Trying ct_data_info on text column\n", __FILE__);
127 :
128 6 : check_call(ct_data_info, (cmd, CS_GET, 2, &iodesc));
129 :
130 6 : printf("datatype = %d\n", iodesc.datatype);
131 6 : printf("usertype = %d\n", iodesc.usertype);
132 6 : printf("text len = %d\n", iodesc.total_txtlen);
133 6 : printf("name = %*.*s\n", iodesc.namelen, iodesc.namelen, iodesc.name);
134 6 : if (iodesc.datatype != CS_TEXT_TYPE) {
135 0 : fprintf(stderr, "Unexpected datatype %d\n", iodesc.datatype);
136 0 : return 1;
137 : }
138 : }
139 : }
140 6 : switch ((int) ret) {
141 : case CS_END_DATA:
142 : break;
143 0 : case CS_FAIL:
144 0 : fprintf(stderr, "ct_fetch() returned CS_FAIL.\n");
145 0 : return 1;
146 0 : default:
147 0 : fprintf(stderr, "ct_fetch() unexpected return.\n");
148 0 : return 1;
149 : }
150 : break;
151 0 : case CS_COMPUTE_RESULT:
152 0 : fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
153 0 : return 1;
154 0 : default:
155 0 : fprintf(stderr, "ct_results() unexpected result_type.\n");
156 0 : return 1;
157 : }
158 : }
159 6 : switch ((int) results_ret) {
160 : case CS_END_RESULTS:
161 : break;
162 0 : case CS_FAIL:
163 0 : fprintf(stderr, "ct_results() failed.\n");
164 0 : return 1;
165 : break;
166 0 : default:
167 0 : fprintf(stderr, "ct_results() unexpected return.\n");
168 0 : return 1;
169 : }
170 :
171 6 : check_call(ct_command, (cmd, CS_SEND_DATA_CMD, NULL, CS_UNUSED, CS_COLUMN_DATA));
172 :
173 6 : iodesc.total_txtlen = 800;
174 6 : iodesc.log_on_update = CS_TRUE;
175 :
176 6 : check_call(ct_data_info, (cmd, CS_SET, CS_UNUSED, &iodesc));
177 :
178 30 : for ( i = 0 ; i < 800 ; i += 200 ) {
179 24 : textptr = &len800[i];
180 :
181 24 : check_call(ct_send_data, (cmd, textptr, (CS_INT) 200));
182 : }
183 6 : check_call(ct_send, (cmd));
184 :
185 6 : while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
186 16 : switch ((int) result_type) {
187 : case CS_CMD_SUCCEED:
188 : break;
189 : case CS_CMD_DONE:
190 : break;
191 0 : case CS_CMD_FAIL:
192 0 : fprintf(stderr, "ct_results() result_type CS_CMD_FAIL.\n");
193 0 : return 1;
194 : case CS_ROW_RESULT:
195 : break;
196 : case CS_PARAM_RESULT:
197 : break;
198 0 : case CS_COMPUTE_RESULT:
199 0 : fprintf(stderr, "ct_results() unexpected CS_COMPUTE_RESULT.\n");
200 0 : return 1;
201 0 : default:
202 0 : fprintf(stderr, "ct_results() unexpected result_type.\n");
203 0 : return 1;
204 : }
205 : }
206 6 : switch ((int) results_ret) {
207 : case CS_END_RESULTS:
208 : break;
209 0 : case CS_FAIL:
210 0 : fprintf(stderr, "ct_results() failed.\n");
211 0 : return 1;
212 : break;
213 0 : default:
214 0 : fprintf(stderr, "ct_results() unexpected return.\n");
215 0 : return 1;
216 : }
217 :
218 : if (verbose) {
219 : printf("Trying logout\n");
220 : }
221 6 : check_call(try_ctlogout, (ctx, conn, cmd, verbose));
222 :
223 6 : return 0;
224 : }
|