22 *
33 * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
44 *
5- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.4 2000/02/23 19:26:04 meskes Exp $
5+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.5 2000/03/03 13:24:06 meskes Exp $
66 */
77
88#include <stdio.h>
@@ -11,41 +11,36 @@ exec sql include sql3types;
1111exec sql include sqlca;
1212
1313void error()
14- {
15- printf("\n#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
14+ { printf("#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
1615 exit(1);
1716}
1817
1918int main(int argc,char **argv)
20- {
21- exec sql begin declare section;
19+ { exec sql begin declare section;
2220 int COUNT;
23- int INTVAR, BOOLVAR ;
21+ int INTVAR;
2422 int INDEX;
2523 int INDICATOR;
24+ bool BOOLVAR;
2625 int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
2726 int DATETIME_INTERVAL_CODE;
2827 char NAME[120];
2928 char STRINGVAR[1024];
3029 float FLOATVAR;
3130 double DOUBLEVAR;
3231 char QUERY[1024];
33- exec sql end declare section;
32+ char DB[1024];
33+ exec sql end declare section;
3434 int done=0;
35- FILE *dbgs;
36-
37- exec sql var BOOLVAR is bool;
38-
39- if ((dbgs = fopen("log", "w")) != NULL)
40- ECPGdebug(1, dbgs);
4135
42- snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1?argv[1]:"pg_tables");
36+ snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0] ?argv[1]:"pg_tables");
4337
4438 exec sql whenever sqlerror do error();
4539
4640 exec sql allocate descriptor MYDESC;
47-
48- exec sql connect to mm;
41+
42+ strncpy(DB,argc>2?argv[2]:"mm",sizeof DB);
43+ exec sql connect to :DB;
4944
5045 exec sql prepare MYQUERY from :QUERY;
5146 exec sql declare MYCURS cursor for MYQUERY;
@@ -59,83 +54,130 @@ exec sql end declare section;
5954
6055 exec sql get descriptor MYDESC :COUNT = count;
6156 if (!done)
62- { printf("Count %d\n",COUNT);
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');
63127 done=1;
64128 }
65129
66130 for (INDEX=1;INDEX<=COUNT;++INDEX)
67131 { exec sql get descriptor MYDESC value :INDEX
68- :TYPE = type,
69- :LENGTH = length, :OCTET_LENGTH=octet_length,
70- :RETURNED_OCTET_LENGTH=returned_octet_length,
71- :PRECISION = precision, :SCALE=scale,
72- :NULLABLE=nullable, :NAME=name,
132+ :TYPE = type, :SCALE=scale, :PRECISION = precision,
73133 :INDICATOR=indicator;
74- printf("%2d\t%s (type: %d length: %d precision: %d scale: %d
75- \toctet_length: %d returned_octet_length: %d nullable: %d)\n\t= "
76- ,INDEX,NAME,TYPE,LENGTH,PRECISION,SCALE
77- ,OCTET_LENGTH,RETURNED_OCTET_LENGTH,NULLABLE);
78- if (INDICATOR==-1) printf("NULL\n");
134+ if (INDICATOR==-1) printf("NULL");
79135 else switch (TYPE)
80- {
81- case SQL3_BOOLEAN:
136+ {case SQL3_BOOLEAN:
82137 exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
83- printf("%s\n", BOOLVAR ? "true":"false");
84- break;
85- case SQL3_NUMERIC:
86- case SQL3_DECIMAL:
87- if (SCALE==0)
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"
88143 { exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
89- printf("%d\n" ,INTVAR);
144+ printf("%*d",PRECISION ,INTVAR);
90145 }
91146 else
92147 { exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
93- printf("%.*f\n" ,SCALE,FLOATVAR);
148+ printf("%* .*f",PRECISION+1 ,SCALE,FLOATVAR);
94149 }
95150 break;
96- case SQL3_INTEGER:
97- case SQL3_SMALLINT:
151+ case SQL3_INTEGER:
152+ case SQL3_SMALLINT:
98153 exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
99- printf("%d\n ",INTVAR);
154+ printf("%d",INTVAR);
100155 break;
101- case SQL3_FLOAT:
102- case SQL3_REAL:
156+ case SQL3_FLOAT:
157+ case SQL3_REAL:
103158 exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
104- printf("%.*f\n",PRECISION ,FLOATVAR);
159+ printf("%f" ,FLOATVAR);
105160 break;
106- case SQL3_DOUBLE_PRECISION:
161+ case SQL3_DOUBLE_PRECISION:
107162 exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
108- printf("%.*f\n",PRECISION,DOUBLEVAR);
109- break;
110- case SQL3_DATE_TIME_TIMESTAMP:
111- exec sql get descriptor MYDESC value :INDEX
112- :DATETIME_INTERVAL_CODE=datetime_interval_code,
113- :STRINGVAR=data;
114- printf("%d \"%s\"\n",DATETIME_INTERVAL_CODE,STRINGVAR);
163+ printf("%f",DOUBLEVAR);
115164 break;
116- case SQL3_INTERVAL:
165+ case SQL3_DATE_TIME_TIMESTAMP:
166+ case SQL3_INTERVAL:
167+ case SQL3_CHARACTER:
168+ case SQL3_CHARACTER_VARYING:
169+ default:
117170 exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
118- printf("\"%s\"\n",STRINGVAR);
119- break;
120- case SQL3_CHARACTER:
121- case SQL3_CHARACTER_VARYING:
122- exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
123- printf("\"%s\"\n",STRINGVAR);
124- break;
125- default:
126- exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
127- printf("<\"%s\">\n",STRINGVAR);
171+ printf("'%s'",STRINGVAR);
128172 break;
129173 }
174+ putchar('|');
130175 }
176+ putchar('\n');
131177 }
132178
133179 exec sql close MYCURS;
134180
135181 exec sql deallocate descriptor MYDESC;
136-
137- if (dbgs != NULL)
138- fclose(dbgs);
139-
140182 return 0;
141183}