From 1c7fad57d6bc5018e2dcc35a3aaf253b62814eaa Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Fri, 3 Mar 2000 13:24:06 +0000 Subject: [PATCH] *** empty log message *** --- src/interfaces/ecpg/test/Makefile | 7 +- src/interfaces/ecpg/test/dyntest.pgc | 172 ++++++++++++++++---------- src/interfaces/ecpg/test/dyntest2.pgc | 141 +++++++++++++++++++++ 3 files changed, 252 insertions(+), 68 deletions(-) create mode 100644 src/interfaces/ecpg/test/dyntest2.pgc diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile index a4238fcc38..7e824c021a 100644 --- a/src/interfaces/ecpg/test/Makefile +++ b/src/interfaces/ecpg/test/Makefile @@ -1,7 +1,7 @@ -all: test1 test2 test3 test4 perftest dyntest +all: test1 test2 test3 test4 perftest dyntest dyntest2 #LDFLAGS=-g -I /usr/local/pgsql/include -L/usr/local/pgsql/lib -lecpg -lpq -lcrypt -LDFLAGS=-g -I../include -I/usr/include/postgresql -L/usr/lib/postgresql -L../lib -lecpg -lpq -lcrypt +LDFLAGS=-g -I../include -I/usr/include/postgresql -L../lib -L/usr/lib/postgresql -lecpg -lpq -lcrypt #LDFLAGS=-g -I/usr/include/postgresql -lecpg -lpq -lcrypt #ECPG=/usr/local/pgsql/bin/ecpg @@ -16,9 +16,10 @@ test3: test3.c test4: test4.c perftest: perftest.c dyntest: dyntest.c +dyntest2: dyntest2.c .pgc.c: $(ECPG) $? clean: - -/bin/rm test1 test2 test3 test4 perftest *.c log dyntest + -/bin/rm test1 test2 test3 test4 perftest *.c log dyntest dyntest2 diff --git a/src/interfaces/ecpg/test/dyntest.pgc b/src/interfaces/ecpg/test/dyntest.pgc index f7c9ee4798..2988730975 100644 --- a/src/interfaces/ecpg/test/dyntest.pgc +++ b/src/interfaces/ecpg/test/dyntest.pgc @@ -2,7 +2,7 @@ * * 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 @@ -11,18 +11,17 @@ exec sql include sql3types; 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]; @@ -30,22 +29,18 @@ exec sql begin declare section; 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; @@ -59,83 +54,130 @@ exec sql end declare section; 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); + printf("%f",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: + 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; } diff --git a/src/interfaces/ecpg/test/dyntest2.pgc b/src/interfaces/ecpg/test/dyntest2.pgc new file mode 100644 index 0000000000..121287523c --- /dev/null +++ b/src/interfaces/ecpg/test/dyntest2.pgc @@ -0,0 +1,141 @@ +/* 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; +}