Line data Source code
1 : #include <config.h>
2 :
3 : #include <stdio.h>
4 : #include <ctpublic.h>
5 : #include "common.h"
6 :
7 : /* protos */
8 : int do_fetch(CS_COMMAND * cmd);
9 : CS_RETCODE do_results(CS_COMMAND * cmd, CS_INT * results);
10 :
11 : /* defines */
12 : #define NUMROWS 5
13 :
14 : /* Testing: Test order of ct_results() */
15 : int
16 8 : main(int argc, char **argv)
17 : {
18 : CS_CONTEXT *ctx;
19 : CS_CONNECTION *conn;
20 : CS_COMMAND *cmd;
21 8 : int i, verbose = 0;
22 :
23 : CS_RETCODE ret;
24 : CS_RETCODE results_ret;
25 :
26 : char query[1024];
27 8 : CS_INT insert_results[] = { CS_CMD_SUCCEED, CS_CMD_DONE };
28 8 : CS_INT update_results[] = { CS_CMD_SUCCEED, CS_CMD_DONE };
29 8 : CS_INT select_results[] = { CS_ROW_RESULT, CS_CMD_DONE };
30 :
31 8 : printf("%s: Check ordering of returns from cs_results()\n", __FILE__);
32 : if (verbose) {
33 : printf("Trying login\n");
34 : }
35 8 : ret = try_ctlogin(&ctx, &conn, &cmd, verbose);
36 8 : if (ret != CS_SUCCEED) {
37 0 : fprintf(stderr, "Login failed\n");
38 0 : return 1;
39 : }
40 :
41 8 : ret = run_command(cmd, "CREATE TABLE #t0004 (id int)");
42 8 : if (ret != CS_SUCCEED)
43 : return 1;
44 40 : for (i = 0; i < NUMROWS; i++) {
45 40 : sprintf(query, "INSERT #t0004 (id) VALUES (%d)", i);
46 :
47 40 : ret = ct_command(cmd, CS_LANG_CMD, query, CS_NULLTERM, CS_UNUSED);
48 40 : if (ret != CS_SUCCEED) {
49 0 : fprintf(stderr, "ct_command() failed\n");
50 0 : return 1;
51 : }
52 40 : ret = ct_send(cmd);
53 40 : if (ret != CS_SUCCEED) {
54 0 : fprintf(stderr, "ct_send() failed\n");
55 0 : return 1;
56 : }
57 :
58 40 : results_ret = do_results(cmd, insert_results);
59 40 : switch ((int) results_ret) {
60 : case CS_END_RESULTS:
61 : break;
62 0 : case CS_FAIL:
63 0 : fprintf(stderr, "ct_results() failed.\n");
64 0 : return 1;
65 : break;
66 0 : default:
67 0 : fprintf(stderr, "ct_results() unexpected return.\n");
68 0 : return 1;
69 : }
70 : }
71 :
72 8 : ret = ct_command(cmd, CS_LANG_CMD, "UPDATE #t0004 SET id = id + 1", CS_NULLTERM, CS_UNUSED);
73 8 : if (ret != CS_SUCCEED) {
74 0 : fprintf(stderr, "ct_command() failed\n");
75 0 : return 1;
76 : }
77 8 : ret = ct_send(cmd);
78 8 : if (ret != CS_SUCCEED) {
79 0 : fprintf(stderr, "ct_send() failed\n");
80 0 : return 1;
81 : }
82 :
83 8 : results_ret = do_results(cmd, update_results);
84 8 : switch ((int) results_ret) {
85 : case CS_END_RESULTS:
86 : break;
87 0 : case CS_FAIL:
88 0 : fprintf(stderr, "ct_results() failed.\n");
89 0 : return 1;
90 : break;
91 0 : default:
92 0 : fprintf(stderr, "ct_results() unexpected return.\n");
93 0 : return 1;
94 : }
95 :
96 : /* single row select */
97 8 : ret = ct_command(cmd, CS_LANG_CMD, "SELECT * FROM #t0004 WHERE id = 1", CS_NULLTERM, CS_UNUSED);
98 8 : if (ret != CS_SUCCEED) {
99 0 : fprintf(stderr, "ct_command() failed\n");
100 0 : return 1;
101 : }
102 8 : ret = ct_send(cmd);
103 8 : if (ret != CS_SUCCEED) {
104 0 : fprintf(stderr, "ct_send() failed\n");
105 0 : return 1;
106 : }
107 :
108 8 : results_ret = do_results(cmd, select_results);
109 8 : switch ((int) results_ret) {
110 : case CS_END_RESULTS:
111 : break;
112 0 : case CS_FAIL:
113 0 : fprintf(stderr, "ct_results() failed.\n");
114 0 : return 1;
115 : break;
116 0 : default:
117 0 : fprintf(stderr, "ct_results() unexpected return.\n");
118 0 : return 1;
119 : }
120 : if (verbose) {
121 : printf("Trying logout\n");
122 : }
123 8 : ret = try_ctlogout(ctx, conn, cmd, verbose);
124 8 : if (ret != CS_SUCCEED) {
125 0 : fprintf(stderr, "Logout failed\n");
126 0 : return 1;
127 : }
128 :
129 : return 0;
130 : }
131 :
132 : int
133 8 : do_fetch(CS_COMMAND * cmd)
134 : {
135 8 : CS_INT count, row_count = 0;
136 : CS_RETCODE ret;
137 :
138 24 : while ((ret = ct_fetch(cmd, CS_UNUSED, CS_UNUSED, CS_UNUSED, &count)) == CS_SUCCEED) {
139 8 : row_count += count;
140 : }
141 8 : if (ret == CS_ROW_FAIL) {
142 0 : fprintf(stderr, "ct_fetch() CS_ROW_FAIL on row %d.\n", row_count);
143 0 : return 1;
144 8 : } else if (ret == CS_END_DATA) {
145 : return 0;
146 : } else {
147 0 : fprintf(stderr, "ct_fetch() unexpected return %d on row %d.\n", ret, row_count);
148 0 : return 1;
149 : }
150 : }
151 :
152 : CS_RETCODE
153 56 : do_results(CS_COMMAND * cmd, CS_INT * results)
154 : {
155 : int result_num;
156 : CS_RETCODE results_ret, result_type;
157 :
158 56 : result_num = 0;
159 224 : while ((results_ret = ct_results(cmd, &result_type)) == CS_SUCCEED) {
160 112 : printf("result_ret %d result_type %d\n", results_ret, result_type);
161 112 : if (result_type == CS_STATUS_RESULT)
162 0 : continue;
163 112 : if (result_type != results[result_num]) {
164 0 : fprintf(stderr, "ct_results() expected %d received %d\n", results[result_num], result_type);
165 0 : return CS_FAIL;
166 : }
167 112 : switch ((int) result_type) {
168 8 : case CS_ROW_RESULT:
169 8 : if (do_fetch(cmd)) {
170 : return CS_FAIL;
171 : }
172 : break;
173 : }
174 112 : result_num++;
175 : }
176 : return results_ret;
177 : }
|