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