summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meskes2000-02-18 16:02:49 +0000
committerMichael Meskes2000-02-18 16:02:49 +0000
commitbc8a39beef91e3d9bafafed031a8f997d0f61153 (patch)
tree6585c604dcc958e3441a998c32c88a3cb758f4ef
parentab0c8c691e6f377f59d439076701ec7d3943748e (diff)
*** empty log message ***
-rw-r--r--src/interfaces/ecpg/include/ecpglib.h2
-rw-r--r--src/interfaces/ecpg/lib/dynamic.c65
-rw-r--r--src/interfaces/ecpg/lib/ecpglib.c23
3 files changed, 65 insertions, 25 deletions
diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h
index b3105e943a1..3cb3255c4a8 100644
--- a/src/interfaces/ecpg/include/ecpglib.h
+++ b/src/interfaces/ecpg/include/ecpglib.h
@@ -59,7 +59,7 @@ extern "C"
const char *descriptor,const char *query);
bool ECPGdeallocate_desc(int line,const char *name);
bool ECPGallocate_desc(int line,const char *name);
- void ECPGraise(int line,int code);
+ void ECPGraise(int line, int code, const char *str);
bool ECPGget_desc_header(int, char *, int *);
diff --git a/src/interfaces/ecpg/lib/dynamic.c b/src/interfaces/ecpg/lib/dynamic.c
index b66883b934a..fb2f28e69c5 100644
--- a/src/interfaces/ecpg/lib/dynamic.c
+++ b/src/interfaces/ecpg/lib/dynamic.c
@@ -2,7 +2,7 @@
*
* Copyright (c) 2000, Christof Petig <[email protected]>
*
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/dynamic.c,v 1.3 2000/02/18 14:34:05 meskes Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/dynamic.c,v 1.4 2000/02/18 16:02:49 meskes Exp $
*/
/* I borrowed the include files from ecpglib.c, maybe we don't need all of them */
@@ -10,7 +10,8 @@
#include <sql3types.h>
static struct descriptor
-{ char *name;
+{
+ char *name;
PGresult *result;
struct descriptor *next;
} *all_descriptors=NULL;
@@ -18,7 +19,8 @@ static struct descriptor
PGconn *ECPG_internal_get_connection(char *name);
unsigned int ECPGDynamicType(Oid type)
-{ switch(type)
+{
+ switch(type)
{ case 16: return SQL3_BOOLEAN; /* bool */
case 21: return SQL3_SMALLINT; /* int2 */
case 23: return SQL3_INTEGER; /* int4 */
@@ -204,7 +206,7 @@ bool ECPGdo_descriptor(int line,const char *connection,
return (status);
}
}
- ECPGraise(line,ECPG_UNKNOWN_DESCRIPTOR);
+ ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, NULL);
return false;
}
@@ -217,7 +219,7 @@ PGresult *ECPGresultByDescriptor(int line,const char *name)
if (!strcmp(name, i->name)) return i->result;
}
- ECPGraise(line,ECPG_UNKNOWN_DESCRIPTOR);
+ ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, NULL);
return NULL;
}
@@ -236,7 +238,7 @@ bool ECPGdeallocate_desc(int line,const char *name)
return true;
}
}
- ECPGraise(line,ECPG_UNKNOWN_DESCRIPTOR);
+ ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, NULL);
return false;
}
@@ -252,30 +254,69 @@ bool ECPGallocate_desc(int line,const char *name)
return true;
}
-void ECPGraise(int line, int code)
+void
+ECPGraise(int line, int code, const char *str)
{
+ struct auto_mem *am;
+
sqlca.sqlcode=code;
switch (code)
{
case ECPG_NOT_FOUND:
snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
- "No data found line %d.",line);
+ "No data found line %d.", line);
+ break;
+
+ case ECPG_OUT_OF_MEMORY:
+ snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
+ "Out of memory in line %d.", line);
break;
+
+ case ECPG_UNSUPPORTED:
+ snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
+ "Unsupported type %s in line %d.", str, line);
+ break;
+
+ case ECPG_TOO_MANY_ARGUMENTS:
+ snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
+ "Too many arguments in line %d.", line);
+ break;
+
+ case ECPG_TOO_FEW_ARGUMENTS:
+ snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
+ "Too few arguments in line %d.", line);
+ break;
+
case ECPG_MISSING_INDICATOR:
snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
- "NULL value without indicator, line %d.",line);
+ "NULL value without indicator, line %d.", line);
break;
+
case ECPG_UNKNOWN_DESCRIPTOR:
snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
- "descriptor not found, line %d.",line);
+ "descriptor not found, line %d.", line);
break;
+
case ECPG_INVALID_DESCRIPTOR_INDEX:
snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
- "descriptor index out of range, line %d.",line);
+ "descriptor index out of range, line %d.", line);
break;
+
default:
snprintf(sqlca.sqlerrm.sqlerrmc,sizeof(sqlca.sqlerrm.sqlerrmc),
- "SQL error #%d, line %d.",code,line);
+ "SQL error #%d, line %d.",code, line);
break;
}
+
+ /* free all memory we have allocated for the user */
+ for (am = auto_allocs; am;)
+ {
+ struct auto_mem *act = am;
+
+ am = am->next;
+ free(act->pointer);
+ free(act);
+ }
+
+ auto_allocs = NULL;
}
diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c
index a6e2b23e01b..72c38e48a18 100644
--- a/src/interfaces/ecpg/lib/ecpglib.c
+++ b/src/interfaces/ecpg/lib/ecpglib.c
@@ -190,7 +190,7 @@ ecpg_alloc(long size, int lineno)
if (!new)
{
ECPGlog("out of memory\n");
- register_error(ECPG_OUT_OF_MEMORY, "Out of memory in line %d", lineno);
+ ECPGraise(ECPG_OUT_OF_MEMORY, lineno, NULL);
return NULL;
}
@@ -206,7 +206,7 @@ ecpg_strdup(const char *string, int lineno)
if (!new)
{
ECPGlog("out of memory\n");
- register_error(ECPG_OUT_OF_MEMORY, "Out of memory in line %d", lineno);
+ ECPGraise(ECPG_OUT_OF_MEMORY, lineno, NULL);
return NULL;
}
@@ -634,8 +634,7 @@ ECPGexecute(struct statement * stmt)
default:
/* Not implemented yet */
- register_error(ECPG_UNSUPPORTED, "Unsupported type %s on line %d.",
- ECPGtype_name(var->type), stmt->lineno);
+ ECPGraise(ECPG_UNSUPPORTED, stmt->lineno, ECPGtype_name(var->type));
return false;
break;
}
@@ -658,7 +657,7 @@ ECPGexecute(struct statement * stmt)
* We have an argument but we dont have the matched up string
* in the string
*/
- register_error(ECPG_TOO_MANY_ARGUMENTS, "Too many arguments line %d.", stmt->lineno);
+ ECPGraise(ECPG_TOO_MANY_ARGUMENTS, stmt->lineno, NULL);
return false;
}
else
@@ -695,7 +694,7 @@ ECPGexecute(struct statement * stmt)
/* Check if there are unmatched things left. */
if (next_insert(copiedquery) != NULL)
{
- register_error(ECPG_TOO_FEW_ARGUMENTS, "Too few arguments line %d.", stmt->lineno);
+ ECPGraise(ECPG_TOO_FEW_ARGUMENTS, stmt->lineno, NULL);
return false;
}
@@ -743,7 +742,7 @@ ECPGexecute(struct statement * stmt)
{
ECPGlog("ECPGexecute line %d: Incorrect number of matches: %d\n",
stmt->lineno, ntuples);
- register_error(ECPG_NOT_FOUND, "No data found line %d.", stmt->lineno);
+ ECPGraise(ECPG_NOT_FOUND, stmt->lineno, NULL);
status = false;
break;
}
@@ -757,7 +756,7 @@ ECPGexecute(struct statement * stmt)
if (var == NULL)
{
ECPGlog("ECPGexecute line %d: Too few arguments.\n", stmt->lineno);
- register_error(ECPG_TOO_FEW_ARGUMENTS, "Too few arguments line %d.", stmt->lineno);
+ ECPGraise(ECPG_TOO_FEW_ARGUMENTS, stmt->lineno, NULL);
return (false);
}
@@ -779,7 +778,7 @@ ECPGexecute(struct statement * stmt)
{
ECPGlog("ECPGexecute line %d: Incorrect number of matches: %d don't fit into array of %d\n",
stmt->lineno, ntuples, var->arrsize);
- register_error(ECPG_TOO_MANY_MATCHES, "Too many matches line %d.", stmt->lineno);
+ ECPGraise(ECPG_TOO_MANY_MATCHES, stmt->lineno, NULL);
status = false;
break;
}
@@ -854,7 +853,7 @@ ECPGexecute(struct statement * stmt)
}
break;
default:
- register_error(ECPG_UNSUPPORTED, "Unsupported indicator type %s on line %d.", ECPGtype_name(var->ind_type), stmt->lineno);
+ ECPGraise(ECPG_UNSUPPORTED, stmt->lineno, ECPGtype_name(var->ind_type));
status = false;
break;
}
@@ -1058,7 +1057,7 @@ ECPGexecute(struct statement * stmt)
break;
default:
- register_error(ECPG_UNSUPPORTED, "Unsupported type %s on line %d.", ECPGtype_name(var->type), stmt->lineno);
+ ECPGraise(ECPG_UNSUPPORTED, stmt->lineno, ECPGtype_name(var->type));
status = false;
break;
}
@@ -1068,7 +1067,7 @@ ECPGexecute(struct statement * stmt)
if (status && var != NULL)
{
- register_error(ECPG_TOO_MANY_ARGUMENTS, "Too many arguments line %d.", stmt->lineno);
+ ECPGraise(ECPG_TOO_MANY_ARGUMENTS, stmt->lineno, NULL);
status = false;
}