From 5933f1857f572fffcd783ea79c5f6e671fa2b599 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Wed, 16 Feb 2000 11:52:25 +0000 Subject: [PATCH] *** empty log message *** --- src/interfaces/ecpg/ChangeLog | 10 +++ src/interfaces/ecpg/TODO | 3 +- src/interfaces/ecpg/lib/Makefile.in | 4 +- src/interfaces/ecpg/lib/ecpglib.c | 121 ++++++++++++++++++++++++++++++------ src/interfaces/ecpg/test/Makefile | 4 +- src/interfaces/ecpg/test/test1.pgc | 16 +++-- src/interfaces/ecpg/test/test4.pgc | 2 +- 7 files changed, 130 insertions(+), 30 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index defc1cfa0f..3d5828f6ba 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -799,5 +799,15 @@ Tue Feb 15 11:14:07 CET 2000 - Synced keyword.c. - Synced preproc.y with gram.y. + +Tue Feb 15 17:39:19 CET 2000 + + - Do only write the first 70 bytes of the error message to the + sqlca structure since there are only 70 bytes free space. - Set library version to 3.0.10. + +Wed Feb 16 11:57:02 CET 2000 + + - Fixed library to be able to input complete arrays. + - Set library version to 3.1.0. - Set ecpg version to 2.7.0. diff --git a/src/interfaces/ecpg/TODO b/src/interfaces/ecpg/TODO index 16af868643..542894945d 100644 --- a/src/interfaces/ecpg/TODO +++ b/src/interfaces/ecpg/TODO @@ -13,7 +13,8 @@ stderr. Instead it should be listed as a warning. The error handling has to be improved by adding additional error-rules to the parser. -it would be nice to be able to use :var[:index] as cvariable for an array var +it would be nice to be able to use :var[:index] or :var[] as +cvariable for an array var How can one insert arrays from c variables? diff --git a/src/interfaces/ecpg/lib/Makefile.in b/src/interfaces/ecpg/lib/Makefile.in index 0fcbc7b808..296c3c5a40 100644 --- a/src/interfaces/ecpg/lib/Makefile.in +++ b/src/interfaces/ecpg/lib/Makefile.in @@ -6,13 +6,13 @@ # Copyright (c) 1994, Regents of the University of California # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.56 2000/01/18 13:03:47 meskes Exp $ +# $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/Makefile.in,v 1.57 2000/02/16 11:52:24 meskes Exp $ # #------------------------------------------------------------------------- NAME= ecpg SO_MAJOR_VERSION= 3 -SO_MINOR_VERSION= 0.10 +SO_MINOR_VERSION= 1.0 SRCDIR= @top_srcdir@ include $(SRCDIR)/Makefile.global diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c index 205a051a1e..5074bc20e0 100644 --- a/src/interfaces/ecpg/lib/ecpglib.c +++ b/src/interfaces/ecpg/lib/ecpglib.c @@ -414,7 +414,7 @@ ECPGexecute(struct statement * stmt) char *mallocedval = NULL; char *tobeinserted = NULL; char *p; - char buff[20]; + char buff[20]; /* * Some special treatment is needed for records since we want @@ -450,49 +450,132 @@ ECPGexecute(struct statement * stmt) { switch (var->type) { + int element; + case ECPGt_short: - sprintf(buff, "%d", *(short *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%d,", ((short *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_int: - sprintf(buff, "%d", *(int *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%d,", ((int *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_unsigned_short: - sprintf(buff, "%d", *(unsigned short *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%d,", ((unsigned short *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_unsigned_int: - sprintf(buff, "%d", *(unsigned int *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%d,", ((unsigned int *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_long: - sprintf(buff, "%ld", *(long *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%ld,", ((long *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_unsigned_long: - sprintf(buff, "%ld", *(unsigned long *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%ld,", ((unsigned long *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_float: - sprintf(buff, "%.14g", *(float *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((float *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_double: - sprintf(buff, "%.14g", *(double *) var->value); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((double *) var->value)[element]); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_bool: - sprintf(buff, "'%c'", (*(char *) var->value ? 't' : 'f')); - tobeinserted = buff; + if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) + return false; + + sprintf(mallocedval, "%s", (var->arrsize > 1) ? "'{" : ""); + + for (element = 0; element < var->arrsize; element++) + sprintf(mallocedval + strlen(mallocedval), "%c,", (((char *) var->value)[element]) ? 't' : 'f'); + + sprintf(mallocedval + strlen(mallocedval) - 1, "%s", (var->arrsize > 1) ? "}'" : ""); + + tobeinserted = mallocedval; break; case ECPGt_char: diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile index c6b5621acf..03afc89b6d 100644 --- a/src/interfaces/ecpg/test/Makefile +++ b/src/interfaces/ecpg/test/Makefile @@ -1,8 +1,8 @@ all: stp.so test1 test2 test3 test4 test5 perftest #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/usr/include/postgresql -lecpg -lpq -lcrypt +#LDFLAGS=-g -I../include -I/usr/include/postgresql -L/usr/lib/postgresql -L../lib -lecpg -lpq -lcrypt +LDFLAGS=-g -I/usr/include/postgresql -lecpg -lpq -lcrypt #ECPG=/usr/local/pgsql/bin/ecpg ECPG=../preproc/ecpg -I../include diff --git a/src/interfaces/ecpg/test/test1.pgc b/src/interfaces/ecpg/test/test1.pgc index 02a631a12f..5bbabc6a44 100644 --- a/src/interfaces/ecpg/test/test1.pgc +++ b/src/interfaces/ecpg/test/test1.pgc @@ -18,7 +18,7 @@ void warn(void) exec sql include sqlca; /* comment */ -exec sql define AMOUNT 4; +exec sql define AMOUNT 6; exec sql type intarray is int[AMOUNT]; exec sql type string is char(8); @@ -97,12 +97,18 @@ exec sql end declare section; printf("Database: mm\n"); for (i=0, j=sqlca.sqlerrd[2]; i