*
* Copyright (c) 2000, Christof Petig
*
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.4 2000/02/23 19:26:04 meskes Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.5 2000/03/03 13:24:06 meskes Exp $
*/
#include
exec sql include sqlca;
void error()
-{
- printf("\n#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
+{ printf("#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
exit(1);
}
int main(int argc,char **argv)
-{
-exec sql begin declare section;
+{ exec sql begin declare section;
int COUNT;
- int INTVAR, BOOLVAR;
+ int INTVAR;
int INDEX;
int INDICATOR;
+ bool BOOLVAR;
int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
int DATETIME_INTERVAL_CODE;
char NAME[120];
float FLOATVAR;
double DOUBLEVAR;
char QUERY[1024];
-exec sql end declare section;
+ char DB[1024];
+ exec sql end declare section;
int done=0;
- FILE *dbgs;
-
- exec sql var BOOLVAR is bool;
-
- if ((dbgs = fopen("log", "w")) != NULL)
- ECPGdebug(1, dbgs);
- snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1?argv[1]:"pg_tables");
+ snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0]?argv[1]:"pg_tables");
exec sql whenever sqlerror do error();
exec sql allocate descriptor MYDESC;
-
- exec sql connect to mm;
+
+ strncpy(DB,argc>2?argv[2]:"mm",sizeof DB);
+ exec sql connect to :DB;
exec sql prepare MYQUERY from :QUERY;
exec sql declare MYCURS cursor for MYQUERY;
exec sql get descriptor MYDESC :COUNT = count;
if (!done)
- { printf("Count %d\n",COUNT);
+ { printf("%d Columns\n",COUNT);
+ for (INDEX=1;INDEX<=COUNT;++INDEX)
+ { exec sql get descriptor MYDESC value :INDEX
+ :TYPE = type,
+ :LENGTH = length, :OCTET_LENGTH=octet_length,
+ :PRECISION = precision, :SCALE=scale,
+ :NULLABLE=nullable, :NAME=name;
+ printf("%s ",NAME);
+ switch (TYPE)
+ { case SQL3_BOOLEAN:
+ printf("bool ");
+ break;
+ case SQL3_NUMERIC:
+ printf("numeric(%d,%d) ",PRECISION,SCALE);
+ break;
+ case SQL3_DECIMAL:
+ printf("decimal(%d,%d) ",PRECISION,SCALE);
+ break;
+ case SQL3_INTEGER:
+ printf("integer ");
+ break;
+ case SQL3_SMALLINT:
+ printf("smallint ");
+ break;
+ case SQL3_FLOAT:
+ printf("float(%d,%d) ",PRECISION,SCALE);
+ break;
+ case SQL3_REAL:
+ printf("real ");
+ break;
+ case SQL3_DOUBLE_PRECISION:
+ printf("double precision ");
+ break;
+ case SQL3_DATE_TIME_TIMESTAMP:
+ exec sql get descriptor MYDESC value :INDEX
+ :DATETIME_INTERVAL_CODE=datetime_interval_code;
+ switch(DATETIME_INTERVAL_CODE)
+ { case SQL3_DDT_DATE:
+ printf("date "); break;
+ case SQL3_DDT_TIME:
+ printf("time "); break;
+ case SQL3_DDT_TIMESTAMP:
+ printf("timestamp "); break;
+ case SQL3_DDT_TIME_WITH_TIME_ZONE:
+ printf("time with time zone "); break;
+ case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE:
+ printf("timestamp with time zone "); break;
+ }
+ break;
+ case SQL3_INTERVAL:
+ printf("interval ");
+ break;
+ case SQL3_CHARACTER:
+ if (LENGTH>0) printf("char(%d) ",LENGTH);
+ else printf("char(?) ");
+ break;
+ case SQL3_CHARACTER_VARYING:
+ if (LENGTH>0) printf("varchar(%d) ",LENGTH);
+ else printf("varchar() ");
+ break;
+ default:
+ if (TYPE<0) printf(" ",-TYPE);
+ else printf(" ",TYPE);
+ break;
+ }
+ if (!NULLABLE) printf("not null ");
+ if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
+ putchar('\n');
+ }
+ putchar('\n');
done=1;
}
for (INDEX=1;INDEX<=COUNT;++INDEX)
{ exec sql get descriptor MYDESC value :INDEX
- :TYPE = type,
- :LENGTH = length, :OCTET_LENGTH=octet_length,
- :RETURNED_OCTET_LENGTH=returned_octet_length,
- :PRECISION = precision, :SCALE=scale,
- :NULLABLE=nullable, :NAME=name,
+ :TYPE = type, :SCALE=scale, :PRECISION = precision,
:INDICATOR=indicator;
- printf("%2d\t%s (type: %d length: %d precision: %d scale: %d
- \toctet_length: %d returned_octet_length: %d nullable: %d)\n\t= "
- ,INDEX,NAME,TYPE,LENGTH,PRECISION,SCALE
- ,OCTET_LENGTH,RETURNED_OCTET_LENGTH,NULLABLE);
- if (INDICATOR==-1) printf("NULL\n");
+ if (INDICATOR==-1) printf("NULL");
else switch (TYPE)
- {
- case SQL3_BOOLEAN:
+ { case SQL3_BOOLEAN:
exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
- printf("%s\n",BOOLVAR ? "true":"false");
- break;
- case SQL3_NUMERIC:
- case SQL3_DECIMAL:
- if (SCALE==0)
+ printf(BOOLVAR?"true":"false");
+ break;
+ case SQL3_NUMERIC:
+ case SQL3_DECIMAL:
+ if (SCALE==0) // we might even print leading zeros "%0*d"
{ exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
- printf("%d\n",INTVAR);
+ printf("%*d",PRECISION,INTVAR);
}
else
{ exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
- printf("%.*f\n",SCALE,FLOATVAR);
+ printf("%*.*f",PRECISION+1,SCALE,FLOATVAR);
}
break;
- case SQL3_INTEGER:
- case SQL3_SMALLINT:
+ case SQL3_INTEGER:
+ case SQL3_SMALLINT:
exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
- printf("%d\n",INTVAR);
+ printf("%d",INTVAR);
break;
- case SQL3_FLOAT:
- case SQL3_REAL:
+ case SQL3_FLOAT:
+ case SQL3_REAL:
exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
- printf("%.*f\n",PRECISION,FLOATVAR);
+ printf("%f",FLOATVAR);
break;
- case SQL3_DOUBLE_PRECISION:
+ case SQL3_DOUBLE_PRECISION:
exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
- printf("%.*f\n",PRECISION,DOUBLEVAR);
- break;
- case SQL3_DATE_TIME_TIMESTAMP:
- exec sql get descriptor MYDESC value :INDEX
- :DATETIME_INTERVAL_CODE=datetime_interval_code,
- :STRINGVAR=data;
- printf("%d \"%s\"\n",DATETIME_INTERVAL_CODE,STRINGVAR);
+ printf("%f",DOUBLEVAR);
break;
- case SQL3_INTERVAL:
+ case SQL3_DATE_TIME_TIMESTAMP:
+ case SQL3_INTERVAL:
+ case SQL3_CHARACTER:
+ case SQL3_CHARACTER_VARYING:
+ default:
exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
- printf("\"%s\"\n",STRINGVAR);
- break;
- case SQL3_CHARACTER:
- case SQL3_CHARACTER_VARYING:
- exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
- printf("\"%s\"\n",STRINGVAR);
- break;
- default:
- exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
- printf("<\"%s\">\n",STRINGVAR);
+ printf("'%s'",STRINGVAR);
break;
}
+ putchar('|');
}
+ putchar('\n');
}
exec sql close MYCURS;
exec sql deallocate descriptor MYDESC;
-
- if (dbgs != NULL)
- fclose(dbgs);
-
return 0;
}
--- /dev/null
+/* dynamic SQL test program
+ *
+ * Copyright (c) 2000, Christof Petig
+ *
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest2.pgc,v 1.1 2000/03/03 13:24:06 meskes Exp $
+ */
+
+#include
+
+exec sql include sql3types;
+exec sql include sqlca;
+
+void error()
+{
+ printf("\n#%d:%s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
+ exit(1);
+}
+
+int main(int argc,char **argv)
+{
+exec sql begin declare section;
+ int COUNT;
+ int INTVAR, BOOLVAR;
+ int INDEX;
+ int INDICATOR;
+ int TYPE,LENGTH,OCTET_LENGTH,PRECISION,SCALE,NULLABLE,RETURNED_OCTET_LENGTH;
+ int DATETIME_INTERVAL_CODE;
+ char NAME[120];
+ char STRINGVAR[1024];
+ float FLOATVAR;
+ double DOUBLEVAR;
+ char QUERY[1024];
+exec sql end declare section;
+ int done=0;
+ FILE *dbgs;
+
+ exec sql var BOOLVAR is bool;
+
+ if ((dbgs = fopen("log", "w")) != NULL)
+ ECPGdebug(1, dbgs);
+
+ snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1?argv[1]:"pg_tables");
+
+ exec sql whenever sqlerror do error();
+
+ exec sql allocate descriptor MYDESC;
+
+ exec sql connect to mm;
+
+ exec sql prepare MYQUERY from :QUERY;
+ exec sql declare MYCURS cursor for MYQUERY;
+
+ exec sql open MYCURS;
+
+ while (1)
+ { exec sql fetch in MYCURS into sql descriptor MYDESC;
+
+ if (sqlca.sqlcode) break;
+
+ exec sql get descriptor MYDESC :COUNT = count;
+ if (!done)
+ { printf("Count %d\n",COUNT);
+ done=1;
+ }
+
+ for (INDEX=1;INDEX<=COUNT;++INDEX)
+ { exec sql get descriptor MYDESC value :INDEX
+ :TYPE = type,
+ :LENGTH = length, :OCTET_LENGTH=octet_length,
+ :RETURNED_OCTET_LENGTH=returned_octet_length,
+ :PRECISION = precision, :SCALE=scale,
+ :NULLABLE=nullable, :NAME=name,
+ :INDICATOR=indicator;
+ printf("%2d\t%s (type: %d length: %d precision: %d scale: %d
+ \toctet_length: %d returned_octet_length: %d nullable: %d)\n\t= "
+ ,INDEX,NAME,TYPE,LENGTH,PRECISION,SCALE
+ ,OCTET_LENGTH,RETURNED_OCTET_LENGTH,NULLABLE);
+ if (INDICATOR==-1) printf("NULL\n");
+ else switch (TYPE)
+ {
+ case SQL3_BOOLEAN:
+ exec sql get descriptor MYDESC value :INDEX :BOOLVAR=data;
+ printf("%s\n",BOOLVAR ? "true":"false");
+ break;
+ case SQL3_NUMERIC:
+ case SQL3_DECIMAL:
+ if (SCALE==0)
+ { exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
+ printf("%d\n",INTVAR);
+ }
+ else
+ { exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
+ printf("%.*f\n",SCALE,FLOATVAR);
+ }
+ break;
+ case SQL3_INTEGER:
+ case SQL3_SMALLINT:
+ exec sql get descriptor MYDESC value :INDEX :INTVAR=data;
+ printf("%d\n",INTVAR);
+ break;
+ case SQL3_FLOAT:
+ case SQL3_REAL:
+ exec sql get descriptor MYDESC value :INDEX :FLOATVAR=data;
+ printf("%.*f\n",PRECISION,FLOATVAR);
+ break;
+ case SQL3_DOUBLE_PRECISION:
+ exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR=data;
+ printf("%.*f\n",PRECISION,DOUBLEVAR);
+ break;
+ case SQL3_DATE_TIME_TIMESTAMP:
+ exec sql get descriptor MYDESC value :INDEX
+ :DATETIME_INTERVAL_CODE=datetime_interval_code,
+ :STRINGVAR=data;
+ printf("%d \"%s\"\n",DATETIME_INTERVAL_CODE,STRINGVAR);
+ break;
+ case SQL3_INTERVAL:
+ exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
+ printf("\"%s\"\n",STRINGVAR);
+ break;
+ case SQL3_CHARACTER:
+ case SQL3_CHARACTER_VARYING:
+ exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
+ printf("\"%s\"\n",STRINGVAR);
+ break;
+ default:
+ exec sql get descriptor MYDESC value :INDEX :STRINGVAR=data;
+ printf("<\"%s\">\n",STRINGVAR);
+ break;
+ }
+ }
+ }
+
+ exec sql close MYCURS;
+
+ exec sql deallocate descriptor MYDESC;
+
+ if (dbgs != NULL)
+ fclose(dbgs);
+
+ return 0;
+}