summaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/lib/ecpglib.c
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1998-02-24 15:52:13 +0000
committerMarc G. Fournier <scrappy@hub.org>1998-02-24 15:52:13 +0000
commit80e12829cf79337fb71a19244a171daace974d7a (patch)
tree8c723779b20baff520c080127be3e3be4a14ca1a /src/interfaces/ecpg/lib/ecpglib.c
parent0227a4e1141ae83ac3ae145fa283ede13e86e23e (diff)
+ Sat Feb 21 19:10:55 CET 1998
+ + - use char[] as string not as array of bytes that is integers + + Sun Feb 22 16:37:36 CET 1998 + + - use long for all size variables + - added execute immediate statement + + Sun Feb 22 20:41:32 CET 1998 + + - use varcharsize = 1 for all simple types, 0 means pointer, > 1 + means array if type is char resp. unsigned char + + Thu Feb 24 12:26:12 CET 1998 + + - allow 'go to' in whenever statement as well as 'goto' + - new argument 'stop' for whenever statement From: Michael Meskes <meskes@topsystem.de>
Diffstat (limited to 'src/interfaces/ecpg/lib/ecpglib.c')
-rw-r--r--src/interfaces/ecpg/lib/ecpglib.c71
1 files changed, 48 insertions, 23 deletions
diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c
index 19ec7f3b69a..823a335c764 100644
--- a/src/interfaces/ecpg/lib/ecpglib.c
+++ b/src/interfaces/ecpg/lib/ecpglib.c
@@ -96,9 +96,9 @@ ECPGdo(int lineno, char *query,...)
while (type != ECPGt_EOIT)
{
void *value = NULL;
- short varcharsize;
- short size;
- short arrsize;
+ long varcharsize;
+ long size;
+ long arrsize;
char *newcopy;
char *mallocedval = NULL;
@@ -110,20 +110,18 @@ ECPGdo(int lineno, char *query,...)
contents to arrive in a comma-separated list on insert (I think). */
value = va_arg(ap, void *);
- varcharsize = va_arg(ap, short);
- size = va_arg(ap, short);
- arrsize = va_arg(ap, short);
+ varcharsize = va_arg(ap, long);
+ size = va_arg(ap, long);
+ arrsize = va_arg(ap, long);
switch (type)
{
- case ECPGt_char:
case ECPGt_short:
case ECPGt_int:
sprintf(buff, "%d", *(int *) value);
tobeinserted = buff;
break;
- case ECPGt_unsigned_char:
case ECPGt_unsigned_short:
case ECPGt_unsigned_int:
sprintf(buff, "%d", *(unsigned int *) value);
@@ -155,6 +153,27 @@ ECPGdo(int lineno, char *query,...)
tobeinserted = buff;
break;
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ {
+ /* set slen to string length if type is char * */
+ int slen = (varcharsize == 0) ? strlen((char *) value) : varcharsize;
+
+ newcopy = (char *) malloc(slen + 1);
+ strncpy(newcopy, (char *) value, slen);
+ newcopy[slen] = '\0';
+
+ mallocedval = (char *) malloc(2 * strlen(newcopy) + 3);
+ strcpy(mallocedval, "'");
+ strcat(mallocedval, quote_postgres(newcopy));
+ strcat(mallocedval, "'");
+
+ free(newcopy);
+
+ tobeinserted = mallocedval;
+ }
+ break;
+
case ECPGt_varchar:
case ECPGt_varchar2:
{
@@ -274,7 +293,7 @@ ECPGdo(int lineno, char *query,...)
if (n < 1)
{
- ECPGlog("ECPGdo lineno %d: Incorrect number of matches: %d\n",
+ ECPGlog("ECPGdo line %d: Incorrect number of matches: %d\n",
lineno, n);
register_error(1, "Data not found line %d.", lineno);
break;
@@ -293,9 +312,9 @@ ECPGdo(int lineno, char *query,...)
for (x = 0; x < m && status; x++)
{
void *value = NULL;
- short varcharsize;
- short size;
- short arrsize;
+ long varcharsize;
+ long size;
+ long arrsize;
char *pval = PQgetvalue(results, 0, x);
@@ -311,9 +330,9 @@ ECPGdo(int lineno, char *query,...)
/* We will have to decode the value */
type = va_arg(ap, enum ECPGttype);
value = va_arg(ap, void *);
- varcharsize = va_arg(ap, short);
- size = va_arg(ap, short);
- arrsize = va_arg(ap, short);
+ varcharsize = va_arg(ap, long);
+ size = va_arg(ap, long);
+ arrsize = va_arg(ap, long);
switch (type)
{
@@ -321,7 +340,6 @@ ECPGdo(int lineno, char *query,...)
unsigned long ures;
double dres;
- case ECPGt_char:
case ECPGt_short:
case ECPGt_int:
case ECPGt_long:
@@ -342,9 +360,6 @@ ECPGdo(int lineno, char *query,...)
/* Again?! Yes */
switch (type)
{
- case ECPGt_char:
- *(char *) value = (char) res;
- break;
case ECPGt_short:
*(short *) value = (short) res;
break;
@@ -360,7 +375,6 @@ ECPGdo(int lineno, char *query,...)
}
break;
- case ECPGt_unsigned_char:
case ECPGt_unsigned_short:
case ECPGt_unsigned_int:
case ECPGt_unsigned_long:
@@ -381,9 +395,6 @@ ECPGdo(int lineno, char *query,...)
/* Again?! Yes */
switch (type)
{
- case ECPGt_unsigned_char:
- *(unsigned char *) value = (unsigned char) ures;
- break;
case ECPGt_unsigned_short:
*(unsigned short *) value = (unsigned short) ures;
break;
@@ -452,6 +463,20 @@ ECPGdo(int lineno, char *query,...)
return false;
break;
+ case ECPGt_char:
+ case ECPGt_unsigned_char:
+ {
+ if (varcharsize == 0)
+ {
+ /* char* */
+ strncpy((char *) value, pval, strlen(pval));
+ ((char *) value)[strlen(pval)] = '\0';
+ }
+ else
+ strncpy((char *) value, pval, varcharsize);
+ }
+ break;
+
case ECPGt_varchar:
{
struct ECPGgeneric_varchar *var =