diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index b3105e943a..3cb3255c4a 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 b66883b934..fb2f28e69c 100644 --- a/src/interfaces/ecpg/lib/dynamic.c +++ b/src/interfaces/ecpg/lib/dynamic.c @@ -2,7 +2,7 @@ * * Copyright (c) 2000, Christof Petig * - * $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 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 a6e2b23e01..72c38e48a1 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; }