From 94189c9fc94e2443bcb1e41f84b74aafd0e8529d Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Wed, 28 Jan 2004 09:55:53 +0000 Subject: [PATCH] - Fixed prototype for ECPGprepared_statement to not moan about "const char" - Fixed parsing of nested structures. --- src/interfaces/ecpg/ecpglib/execute.c | 10 +++++----- src/interfaces/ecpg/ecpglib/prepare.c | 4 ++-- src/interfaces/ecpg/include/ecpglib.h | 2 +- src/interfaces/ecpg/preproc/type.c | 6 +++++- src/interfaces/ecpg/preproc/variable.c | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 3c54a07ac5b..7dc477847ee 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.26.2.3 2003/12/17 15:31:51 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.26.2.4 2004/01/28 09:55:53 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -190,7 +190,7 @@ free_variable(struct variable * var) { struct variable *var_next; - if (var == (struct variable *) NULL) + if (var == NULL) return; var_next = var->next; ECPGfree(var); @@ -206,7 +206,7 @@ free_variable(struct variable * var) static void free_statement(struct statement * stmt) { - if (stmt == (struct statement *) NULL) + if (stmt == NULL) return; free_variable(stmt->inlist); free_variable(stmt->outlist); @@ -333,7 +333,7 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia } PQclear(query); ECPGtypeinfocache_push(&(stmt->connection->cache_head), type, isarray, stmt->lineno); - ECPGlog("ECPGexecute line %d: TYPE database: %d C: %d array: %d\n", stmt->lineno, type, var->type, isarray); + ECPGlog("ECPGis_type_an_array line %d: TYPE database: %d C: %d array: %d\n", stmt->lineno, type, var->type, isarray); return isarray; } @@ -356,7 +356,7 @@ ECPGstore_result(const PGresult *results, int act_field, */ if ((var->arrsize > 0 && ntuples > var->arrsize) || (var->ind_arrsize > 0 && ntuples > var->ind_arrsize)) { - ECPGlog("ECPGexecute line %d: Incorrect number of matches: %d don't fit into array of %d\n", + ECPGlog("ECPGstore_result line %d: Incorrect number of matches: %d don't fit into array of %d\n", stmt->lineno, ntuples, var->arrsize); ECPGraise(stmt->lineno, INFORMIX_MODE(stmt->compat)?ECPG_INFORMIX_SUBSELECT_NOT_ONE:ECPG_TOO_MANY_MATCHES, ECPG_SQLSTATE_CARDINALITY_VIOLATION, NULL); return false; diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c index 55f497e03ab..923c931a823 100644 --- a/src/interfaces/ecpg/ecpglib/prepare.c +++ b/src/interfaces/ecpg/ecpglib/prepare.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.9 2003/08/04 00:43:32 momjian Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.9.4.1 2004/01/28 09:55:53 meskes Exp $ */ #define POSTGRES_ECPG_INTERNAL #include "postgres_fe.h" @@ -169,7 +169,7 @@ ECPGdeallocate_all(int lineno) /* return the prepared statement */ char * -ECPGprepared_statement(char *name) +ECPGprepared_statement(const char *name) { struct prepared_statement *this; diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index 317d35e3294..6f9938aaf0d 100644 --- a/src/interfaces/ecpg/include/ecpglib.h +++ b/src/interfaces/ecpg/include/ecpglib.h @@ -54,7 +54,7 @@ bool ECPGprepare(int, char *, char *); bool ECPGdeallocate(int, int, char *); bool ECPGdeallocate_one(int, char *); bool ECPGdeallocate_all(int); -char *ECPGprepared_statement(char *); +char *ECPGprepared_statement(const char *); void ECPGlog(const char *format,...); char *ECPGerrmsg(void); diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index e14321d54f9..cb0eb275667 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -47,7 +47,11 @@ ECPGstruct_member_dup(struct ECPGstruct_member * rm) type = ECPGmake_struct_type(rm->type->u.members, rm->type->type, rm->type->struct_sizeof); break; case ECPGt_array: - type = ECPGmake_array_type(ECPGmake_simple_type(rm->type->u.element->type, rm->type->u.element->size), rm->type->size); + /* if this array does contain a struct again, we have to create the struct too */ + if (rm->type->u.element->type == ECPGt_struct) + type = ECPGmake_struct_type(rm->type->u.element->u.members, rm->type->u.element->type, rm->type->u.element->struct_sizeof); + else + type = ECPGmake_array_type(ECPGmake_simple_type(rm->type->u.element->type, rm->type->u.element->size), rm->type->size); break; default: type = ECPGmake_simple_type(rm->type->type, rm->type->size); diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index be1cb5f0b74..e12b9434998 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -104,10 +104,10 @@ find_struct_member(char *name, char *str, struct ECPGstruct_member * members, in return (find_struct_member(name, end, members->type->u.element->u.members, brace_level)); break; case '.': - if (members->type->type != ECPGt_array) + if (members->type->type == ECPGt_array) return (find_struct_member(name, end, members->type->u.element->u.members, brace_level)); else - return (find_struct_member(name, next, members->type->u.members, brace_level)); + return (find_struct_member(name, end, members->type->u.members, brace_level)); break; default: snprintf(errortext, sizeof(errortext), "incorrectly formed variable %s", name);