]> granicus.if.org Git - postgresql/blob - src/interfaces/ecpg/test/dyntest.pgc
Patch possible portability problem: a few places had // style comments,
[postgresql] / src / interfaces / ecpg / test / dyntest.pgc
1 /* dynamic SQL test program
2  *
3  * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
4  *
5  * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.6 2000/03/17 23:26:36 tgl Exp $
6  */
7
8 #include <stdio.h>
9
10 exec sql include sql3types;
11 exec sql include sqlca;
12
13 void error()
14 {  printf("#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
15    exit(1);
16 }
17
18 int main(int argc,char **argv)
19 { exec sql begin declare section;
20   int COUNT;
21   int INTVAR;
22   int INDEX;
23   int INDICATOR;
24   bool BOOLVAR;
25   int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
26   int DATETIME_INTERVAL_CODE;
27   char NAME[120];
28   char STRINGVAR[1024];
29   float FLOATVAR;
30   double DOUBLEVAR;
31   char QUERY[1024];
32   char DB[1024];
33   exec sql end declare section;
34   int done=0;
35   
36   snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0]?argv[1]:"pg_tables");
37
38   exec sql whenever sqlerror do error();
39   
40   exec sql allocate descriptor MYDESC;
41
42   strncpy(DB,argc>2?argv[2]:"mm",sizeof DB);
43   exec sql connect to :DB;
44   
45   exec sql prepare MYQUERY from :QUERY;
46   exec sql declare MYCURS cursor for MYQUERY;
47   
48   exec sql open MYCURS;
49   
50   while (1)
51   {  exec sql fetch in MYCURS into sql descriptor MYDESC;
52      
53      if (sqlca.sqlcode) break;
54      
55      exec sql get descriptor MYDESC :COUNT = count;
56      if (!done) 
57      {  printf("%d Columns\n",COUNT);
58         for (INDEX=1;INDEX<=COUNT;++INDEX)
59         {       exec sql get descriptor MYDESC value :INDEX 
60                         :TYPE = type,
61                         :LENGTH = length, :OCTET_LENGTH=octet_length,
62                         :PRECISION = precision, :SCALE=scale,
63                         :NULLABLE=nullable, :NAME=name;
64                         printf("%s ",NAME);
65                 switch (TYPE)
66                 {  case SQL3_BOOLEAN: 
67                                 printf("bool ");
68                                 break;
69                    case SQL3_NUMERIC:
70                                 printf("numeric(%d,%d) ",PRECISION,SCALE);
71                         break;
72                    case SQL3_DECIMAL:
73                                 printf("decimal(%d,%d) ",PRECISION,SCALE);
74                         break;
75                    case SQL3_INTEGER: 
76                                 printf("integer ");
77                                 break;
78                    case SQL3_SMALLINT:
79                                 printf("smallint ");
80                         break;
81                    case SQL3_FLOAT:
82                                 printf("float(%d,%d) ",PRECISION,SCALE);
83                         break;
84                    case SQL3_REAL:
85                                 printf("real ");
86                         break;
87                    case SQL3_DOUBLE_PRECISION:
88                                 printf("double precision ");
89                         break;
90                    case SQL3_DATE_TIME_TIMESTAMP:
91                                 exec sql get descriptor MYDESC value :INDEX 
92                                 :DATETIME_INTERVAL_CODE=datetime_interval_code;
93                                 switch(DATETIME_INTERVAL_CODE)
94                                 {       case SQL3_DDT_DATE: 
95                                                 printf("date "); break;
96                                         case SQL3_DDT_TIME: 
97                                                 printf("time "); break;
98                                         case SQL3_DDT_TIMESTAMP: 
99                                                 printf("timestamp "); break;
100                                         case SQL3_DDT_TIME_WITH_TIME_ZONE: 
101                                                 printf("time with time zone "); break;
102                                         case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE: 
103                                                 printf("timestamp with time zone "); break;
104                                 }
105                         break;
106                    case SQL3_INTERVAL:
107                                 printf("interval ");
108                         break;
109                    case SQL3_CHARACTER:
110                         if (LENGTH>0) printf("char(%d) ",LENGTH);
111                         else printf("char(?) ");
112                         break;
113                    case SQL3_CHARACTER_VARYING:
114                         if (LENGTH>0) printf("varchar(%d) ",LENGTH);
115                         else printf("varchar() ");
116                         break;
117                    default:
118                         if (TYPE<0) printf("<OID %d> ",-TYPE);
119                         else printf("<SQL3 %d> ",TYPE);
120                         break;
121                 }
122                 if (!NULLABLE) printf("not null ");
123                 if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
124                 putchar('\n');
125         }
126         putchar('\n');
127         done=1;
128      } 
129      
130      for (INDEX=1;INDEX<=COUNT;++INDEX)
131      {  exec sql get descriptor MYDESC value :INDEX 
132                 :TYPE = type, :SCALE=scale, :PRECISION = precision,
133                 :INDICATOR=indicator;
134         if (INDICATOR==-1) printf("NULL");
135         else switch (TYPE)
136         {       case SQL3_BOOLEAN: 
137                 exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
138                         printf(BOOLVAR?"true":"false");
139                         break;
140                 case SQL3_NUMERIC:
141                 case SQL3_DECIMAL:
142                 if (SCALE==0) /* we might even print leading zeros "%0*d" */
143                 {  exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
144                    printf("%*d",PRECISION,INTVAR);
145                 }
146                 else
147                 {  exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
148                    printf("%*.*f",PRECISION+1,SCALE,FLOATVAR);
149                 }
150                 break;
151                 case SQL3_INTEGER:
152                 case SQL3_SMALLINT: 
153                 exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
154                 printf("%d",INTVAR);
155                 break;
156                 case SQL3_FLOAT:
157                 case SQL3_REAL:
158                 exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
159                 printf("%f",FLOATVAR);
160                 break;
161                 case SQL3_DOUBLE_PRECISION:
162                 exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
163                 printf("%f",DOUBLEVAR);
164                 break;
165                 case SQL3_DATE_TIME_TIMESTAMP:
166                 case SQL3_INTERVAL:
167                 case SQL3_CHARACTER:
168                 case SQL3_CHARACTER_VARYING:
169                 default:
170                 exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
171                 printf("'%s'",STRINGVAR);
172                 break;
173         }
174         putchar('|');
175      }
176      putchar('\n');
177   }
178   
179   exec sql close MYCURS;
180   
181   exec sql deallocate descriptor MYDESC;
182   return 0;
183 }