1/* dynamic SQL test program
2 */
3
4#include <stdio.h>
5#include <stdlib.h>
6
7exec sql include sql3types;
8exec sql include sqlca;
9exec sql include ../regression;
10
11static void
12error (void)
13{
14  printf ("\n#%ld:%s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
15  exit (1);
16}
17
18int
19main ()
20{
21  exec sql begin declare section;
22  int COUNT;
23  int INTVAR;
24  int INDEX;
25  int INDICATOR;
26  int TYPE, LENGTH, OCTET_LENGTH, PRECISION, SCALE, RETURNED_OCTET_LENGTH;
27  int DATETIME_INTERVAL_CODE;
28  char NAME[120], BOOLVAR;
29  char STRINGVAR[1024];
30  double DOUBLEVAR;
31  char *QUERY;
32  exec sql end declare section;
33  int done = 0;
34
35  exec sql var BOOLVAR is bool;
36
37  ECPGdebug (1, stderr);
38
39  QUERY = "select * from dyntest";
40
41  exec sql whenever sqlerror
42  do
43      error ();
44
45  exec sql allocate descriptor MYDESC;
46
47  exec sql connect to REGRESSDB1;
48
49  exec sql set datestyle to german;
50
51  exec sql create table dyntest (name char (14), d float8, i int,
52				 bignumber int8, b boolean, comment text,
53				 day date);
54  exec sql insert into dyntest values ('first entry', 14.7, 14, 123045607890, true, 'The world''''s most advanced open source database.', '1987-07-14');
55  exec sql insert into dyntest values ('second entry', 1407.87, 1407, 987065403210, false, 'The elephant never forgets.', '1999-11-5');
56
57  exec sql prepare MYQUERY from :QUERY;
58  exec sql declare MYCURS cursor for MYQUERY;
59
60  exec sql open MYCURS;
61
62  while (1)
63    {
64      exec sql fetch in MYCURS into sql descriptor MYDESC;
65
66      if (sqlca.sqlcode)
67	break;
68
69      exec sql get descriptor MYDESC:COUNT = count;
70      if (!done)
71	{
72	  printf ("Found %d columns\n", COUNT);
73	  done = 1;
74	}
75
76      for (INDEX = 1; INDEX <= COUNT; ++INDEX)
77	{
78	exec sql get descriptor MYDESC value :INDEX
79		:TYPE = type,
80		:LENGTH = length,
81		:OCTET_LENGTH = octet_length,
82		:RETURNED_OCTET_LENGTH = returned_octet_length,
83		:PRECISION = precision,
84		:SCALE = scale,
85		:NAME = name,
86		:INDICATOR = indicator;
87	  printf ("%2d\t%s (type: %d length: %d precision: %d scale: %d = " , INDEX, NAME, TYPE, LENGTH, PRECISION, SCALE);
88	  switch (TYPE)
89	    {
90	    case SQL3_BOOLEAN:
91	      printf ("bool");
92	      break;
93	    case SQL3_NUMERIC:
94	      printf ("numeric(%d,%d)", PRECISION, SCALE);
95	      break;
96	    case SQL3_DECIMAL:
97	      printf ("decimal(%d,%d)", PRECISION, SCALE);
98	      break;
99	    case SQL3_INTEGER:
100	      printf ("integer");
101	      break;
102	    case SQL3_SMALLINT:
103	      printf ("smallint");
104	      break;
105	    case SQL3_FLOAT:
106	      printf ("float(%d,%d)", PRECISION, SCALE);
107	      break;
108	    case SQL3_REAL:
109	      printf ("real");
110	      break;
111	    case SQL3_DOUBLE_PRECISION:
112	      printf ("double precision");
113	      break;
114	    case SQL3_DATE_TIME_TIMESTAMP:
115	    exec sql get descriptor MYDESC value :INDEX
116			:DATETIME_INTERVAL_CODE = datetime_interval_code;
117	      switch (DATETIME_INTERVAL_CODE)
118		{
119		case SQL3_DDT_DATE:
120		  printf ("date");
121		  break;
122		case SQL3_DDT_TIME:
123		  printf ("time");
124		  break;
125		case SQL3_DDT_TIMESTAMP:
126		  printf ("timestamp");
127		  break;
128		case SQL3_DDT_TIME_WITH_TIME_ZONE:
129		  printf ("time with time zone");
130		  break;
131		case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE:
132		  printf ("timestamp with time zone");
133		  break;
134		}
135	      break;
136	    case SQL3_INTERVAL:
137	      printf ("interval");
138	      break;
139	    case SQL3_CHARACTER:
140	      if (LENGTH > 0)
141		printf ("char(%d)", LENGTH);
142	      else
143		printf ("text");
144	      break;
145	    case SQL3_CHARACTER_VARYING:
146	      if (LENGTH > 0)
147		printf ("varchar(%d)", LENGTH);
148	      else
149		printf ("varchar()");
150	      break;
151	    default:
152	      printf ("<SQL3 %d>", TYPE);
153	      break;
154	    }
155	  printf (")\n\toctet_length: %d returned_octet_length: %d)\n\t= ",
156		  OCTET_LENGTH, RETURNED_OCTET_LENGTH);
157	  if (INDICATOR == -1)
158	    printf ("NULL\n");
159	  else
160	    switch (TYPE)
161	      {
162	      case SQL3_BOOLEAN:
163	      exec sql get descriptor MYDESC value :INDEX :BOOLVAR = data;
164		printf ("%s\n", BOOLVAR ? "true" : "false");
165		break;
166	      case SQL3_INTEGER:
167	      case SQL3_SMALLINT:
168	      exec sql get descriptor MYDESC value :INDEX :INTVAR = data;
169		printf ("%d\n", INTVAR);
170		break;
171	      case SQL3_DOUBLE_PRECISION:
172	      exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR = data;
173		printf ("%.*f\n", PRECISION, DOUBLEVAR);
174		break;
175	      case SQL3_DATE_TIME_TIMESTAMP:
176	      exec sql get descriptor MYDESC value :INDEX
177			:DATETIME_INTERVAL_CODE = datetime_interval_code,
178		:STRINGVAR = data;
179		printf ("%d \"%s\"\n", DATETIME_INTERVAL_CODE, STRINGVAR);
180		break;
181	      case SQL3_CHARACTER:
182	      case SQL3_CHARACTER_VARYING:
183	      exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data;
184		printf ("\"%s\"\n", STRINGVAR);
185		break;
186	      default:
187	      exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data;
188		printf ("<\"%s\">\n", STRINGVAR);
189		break;
190	      }
191	}
192    }
193
194  exec sql close MYCURS;
195
196  exec sql deallocate descriptor MYDESC;
197
198  return 0;
199  }
200