Age Owner TLA Line data Source code
1 : #include <stdlib.h>
2 : #include <string.h>
3 : #include <limits.h>
4 : #include "ecpg_config.h"
5 :
6 : exec sql include ../regression;
7 : exec sql include sqlda.h;
8 : exec sql include pgtypes_numeric.h;
9 :
10 : exec sql whenever sqlerror stop;
11 :
12 : /* These shouldn't be under DECLARE SECTION */
13 : sqlda_t *inp_sqlda, *outp_sqlda, *outp_sqlda1;
14 :
15 : static void
4842 meskes 16 CBC 12 : dump_sqlda(sqlda_t *sqlda)
17 : {
18 : int i;
19 :
20 12 : if (sqlda == NULL)
21 : {
4842 meskes 22 UBC 0 : printf("dump_sqlda called with NULL sqlda\n");
23 0 : return;
24 : }
25 :
4842 meskes 26 CBC 84 : for (i = 0; i < sqlda->sqld; i++)
27 : {
28 72 : if (sqlda->sqlvar[i].sqlind && *(sqlda->sqlvar[i].sqlind) == -1)
29 10 : printf("name sqlda descriptor: '%s' value NULL'\n", sqlda->sqlvar[i].sqlname.data);
30 : else
31 62 : switch (sqlda->sqlvar[i].sqltype)
32 : {
33 20 : case ECPGt_char:
34 20 : printf("name sqlda descriptor: '%s' value '%s'\n", sqlda->sqlvar[i].sqlname.data, sqlda->sqlvar[i].sqldata);
35 20 : break;
36 12 : case ECPGt_int:
37 12 : printf("name sqlda descriptor: '%s' value %d\n", sqlda->sqlvar[i].sqlname.data, *(int *)sqlda->sqlvar[i].sqldata);
38 12 : break;
1787 tgl 39 10 : case ECPGt_long:
40 10 : printf("name sqlda descriptor: '%s' value %ld\n", sqlda->sqlvar[i].sqlname.data, *(long int *)sqlda->sqlvar[i].sqldata);
41 10 : break;
1787 tgl 42 UBC 0 : case ECPGt_long_long:
1258 peter 43 0 : printf(
44 : #ifdef _WIN32
45 : "name sqlda descriptor: '%s' value %I64d\n",
46 : #else
47 : "name sqlda descriptor: '%s' value %lld\n",
48 : #endif
49 0 : sqlda->sqlvar[i].sqlname.data, *(long long int *)sqlda->sqlvar[i].sqldata);
1787 tgl 50 0 : break;
4842 meskes 51 CBC 10 : case ECPGt_double:
1785 tgl 52 10 : printf("name sqlda descriptor: '%s' value %f\n", sqlda->sqlvar[i].sqlname.data, *(double *)sqlda->sqlvar[i].sqldata);
4842 meskes 53 10 : break;
54 10 : case ECPGt_numeric:
55 : {
56 : char *val;
57 :
58 10 : val = PGTYPESnumeric_to_asc((numeric*)sqlda->sqlvar[i].sqldata, -1);
59 10 : printf("name sqlda descriptor: '%s' value NUMERIC '%s'\n", sqlda->sqlvar[i].sqlname.data, val);
1756 tmunro 60 10 : PGTYPESchar_free(val);
4842 meskes 61 10 : break;
62 : }
63 : }
64 : }
65 : }
66 :
67 : int
68 1 : main (void)
69 : {
70 : exec sql begin declare section;
71 1 : char *stmt1 = "SELECT * FROM t1";
72 1 : char *stmt2 = "SELECT * FROM t1 WHERE id = ?";
73 : int rec;
74 : int id;
75 : exec sql end declare section;
76 :
77 : char msg[128];
78 :
79 1 : ECPGdebug(1, stderr);
80 :
81 1 : strcpy(msg, "connect");
82 1 : exec sql connect to REGRESSDB1 as regress1;
83 1 :
84 1 : strcpy(msg, "set");
85 1 : exec sql set datestyle to iso;
86 1 :
87 1 : strcpy(msg, "create");
88 1 : exec sql create table t1(
89 : id integer,
90 : t text,
91 : d1 numeric,
92 : d2 float8,
93 : c char(10),
94 : big bigint
95 : );
96 1 :
97 1 : strcpy(msg, "insert");
98 1 : exec sql insert into t1 values
99 : (1, 'a', 1.0, 1, 'a',1111111111111111111),
100 : (2, null, null, null, null,null),
101 : (3, 'c', 0.0, 3, 'c',3333333333333333333),
102 : (4, 'd', 'NaN', 4, 'd',4444444444444444444),
103 : (5, 'e', 0.001234, 5, 'e',5555555555555555555);
104 1 :
105 1 : strcpy(msg, "commit");
106 1 : exec sql commit;
107 1 :
108 : /* SQLDA test for getting all records from a table */
109 :
110 1 : outp_sqlda = NULL;
111 :
112 1 : strcpy(msg, "prepare");
113 1 : exec sql prepare st_id1 from :stmt1;
114 1 :
115 1 : strcpy(msg, "declare");
116 : exec sql declare mycur1 cursor for st_id1;
117 :
118 1 : strcpy(msg, "open");
119 1 : exec sql open mycur1;
120 1 :
121 : exec sql whenever not found do break;
122 :
123 1 : rec = 0;
124 : while (1)
125 : {
126 6 : strcpy(msg, "fetch");
4520 peter_e 127 6 : exec sql fetch 1 from mycur1 into descriptor outp_sqlda;
4842 meskes 128 6 :
129 5 : printf("FETCH RECORD %d\n", ++rec);
130 5 : dump_sqlda(outp_sqlda);
131 : }
132 :
133 : exec sql whenever not found continue;
134 :
135 1 : strcpy(msg, "close");
136 1 : exec sql close mycur1;
137 1 :
138 1 : strcpy(msg, "deallocate");
139 1 : exec sql deallocate prepare st_id1;
140 1 :
141 1 : free(outp_sqlda);
142 :
143 : /* SQLDA test for getting ALL records into the sqlda list */
144 :
145 1 : outp_sqlda = NULL;
146 :
147 1 : strcpy(msg, "prepare");
148 1 : exec sql prepare st_id2 from :stmt1;
149 1 :
150 1 : strcpy(msg, "declare");
151 : exec sql declare mycur2 cursor for st_id2;
152 :
153 1 : strcpy(msg, "open");
154 1 : exec sql open mycur2;
155 1 :
156 1 : strcpy(msg, "fetch");
157 1 : exec sql fetch all from mycur2 into descriptor outp_sqlda;
158 1 :
159 1 : outp_sqlda1 = outp_sqlda;
160 1 : rec = 0;
161 6 : while (outp_sqlda1)
162 : {
163 : sqlda_t *ptr;
164 5 : printf("FETCH RECORD %d\n", ++rec);
165 5 : dump_sqlda(outp_sqlda1);
166 :
167 5 : ptr = outp_sqlda1;
168 5 : outp_sqlda1 = outp_sqlda1->desc_next;
169 5 : free(ptr);
170 : }
171 :
172 1 : strcpy(msg, "close");
173 1 : exec sql close mycur2;
174 1 :
175 1 : strcpy(msg, "deallocate");
176 1 : exec sql deallocate prepare st_id2;
177 1 :
178 : /* SQLDA test for getting one record using an input descriptor */
179 :
180 : /*
181 : * Input sqlda has to be built manually
182 : * sqlda_t contains 1 sqlvar_t structure already.
183 : */
184 1 : inp_sqlda = (sqlda_t *)malloc(sizeof(sqlda_t));
185 1 : memset(inp_sqlda, 0, sizeof(sqlda_t));
186 1 : inp_sqlda->sqln = 1;
187 :
188 1 : inp_sqlda->sqlvar[0].sqltype = ECPGt_int;
189 1 : inp_sqlda->sqlvar[0].sqldata = (char *)&id;
190 :
191 1 : printf("EXECUTE RECORD 4\n");
192 :
193 1 : id = 4;
194 :
195 1 : outp_sqlda = NULL;
196 :
197 1 : strcpy(msg, "prepare");
198 1 : exec sql prepare st_id3 FROM :stmt2;
199 1 :
200 1 : strcpy(msg, "execute");
201 1 : exec sql execute st_id3 using descriptor inp_sqlda into descriptor outp_sqlda;
202 1 :
203 1 : dump_sqlda(outp_sqlda);
204 :
205 1 : strcpy(msg, "deallocate");
206 1 : exec sql deallocate prepare st_id3;
207 1 :
208 1 : free(inp_sqlda);
209 1 : free(outp_sqlda);
210 :
211 : /* SQLDA test for getting one record using an input descriptor
212 : * on a named connection
213 : */
214 :
215 1 : exec sql connect to REGRESSDB1 as con2;
216 1 :
217 : /*
218 : * Input sqlda has to be built manually
219 : * sqlda_t contains 1 sqlvar_t structure already.
220 : */
221 1 : inp_sqlda = (sqlda_t *)malloc(sizeof(sqlda_t));
222 1 : memset(inp_sqlda, 0, sizeof(sqlda_t));
223 1 : inp_sqlda->sqln = 1;
224 :
225 1 : inp_sqlda->sqlvar[0].sqltype = ECPGt_int;
226 1 : inp_sqlda->sqlvar[0].sqldata = (char *)&id;
227 :
228 1 : printf("EXECUTE RECORD 4\n");
229 :
230 1 : id = 4;
231 :
232 1 : outp_sqlda = NULL;
233 :
234 1 : strcpy(msg, "prepare");
235 1 : exec sql at con2 prepare st_id4 FROM :stmt2;
236 1 :
237 1 : strcpy(msg, "execute");
238 1 : exec sql at con2 execute st_id4 using descriptor inp_sqlda into descriptor outp_sqlda;
239 1 :
240 1 : dump_sqlda(outp_sqlda);
241 :
242 1 : strcpy(msg, "commit");
243 1 : exec sql at con2 commit;
244 1 :
245 1 : strcpy(msg, "deallocate");
246 1 : exec sql deallocate prepare st_id4;
247 1 :
248 1 : free(inp_sqlda);
249 1 : free(outp_sqlda);
250 :
251 1 : strcpy(msg, "disconnect");
252 1 : exec sql disconnect con2;
253 1 :
254 : /* End test */
255 :
256 1 : strcpy(msg, "drop");
257 1 : exec sql drop table t1;
258 1 :
259 1 : strcpy(msg, "commit");
260 1 : exec sql commit;
261 1 :
262 1 : strcpy(msg, "disconnect");
263 1 : exec sql disconnect;
264 1 :
2061 peter_e 265 1 : return 0;
266 : }
|