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