aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interfaces/ecpg/ChangeLog10
-rw-r--r--src/interfaces/ecpg/TODO3
-rw-r--r--src/interfaces/ecpg/lib/Makefile.in4
-rw-r--r--src/interfaces/ecpg/lib/ecpglib.c121
-rw-r--r--src/interfaces/ecpg/test/Makefile4
-rw-r--r--src/interfaces/ecpg/test/test1.pgc16
-rw-r--r--src/interfaces/ecpg/test/test4.pgc2
7 files changed, 130 insertions, 30 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index defc1cfa0fb..3d5828f6ba6 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 16af8686437..542894945d1 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[<integer>] 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 0fcbc7b808d..296c3c5a409 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 205a051a1e7..5074bc20e07 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 c6b5621acfb..03afc89b6d3 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 02a631a12f5..5bbabc6a44f 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<j; i++)
{
- printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], 8);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
amount[i]+=1000;
- }
- strcpy(msg, "insert");
- exec sql at pm insert into "Test" (name, amount, letter) values (:name, :amount, :letter);
+ strcpy(msg, "insert");
+ exec sql at pm insert into "Test" (name, amount, letter) values (:n, :a, :l);
+ }
strcpy(msg, "select");
exec sql at pm select * into :name, :amount, :letter from "Test";
diff --git a/src/interfaces/ecpg/test/test4.pgc b/src/interfaces/ecpg/test/test4.pgc
index 57a2143cc5b..d4822218706 100644
--- a/src/interfaces/ecpg/test/test4.pgc
+++ b/src/interfaces/ecpg/test/test4.pgc
@@ -30,7 +30,7 @@ EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO test(f,i,a) VALUES(404.90,1,'{0,1,2,3,4,5,6,7,8,9}');
-/* EXEC SQL INSERT INTO test(f,i,a) VALUES(140787.0,2,:a);*/
+ EXEC SQL INSERT INTO test(f,i,a) VALUES(140787.0,2,:a);
EXEC SQL COMMIT;