From 3615a6a84d44e31d18c92dc7cb02c6bee050b478 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Mon, 16 Oct 2000 19:53:04 +0000 Subject: [PATCH] Fixed handling of variables in connect rule. --- src/interfaces/ecpg/ChangeLog | 4 ++++ src/interfaces/ecpg/preproc/descriptor.c | 3 +-- src/interfaces/ecpg/preproc/preproc.y | 28 ++++++++++++++++++------ src/interfaces/ecpg/preproc/type.c | 23 ++++++++++--------- src/interfaces/ecpg/test/dyntest.pgc | 10 ++++++++- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 1816ec16af..9fe53ee62a 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -965,5 +965,9 @@ Thu Oct 12 20:13:00 CEST 2000 - Changed parser to accept a variable instead of a constant wherever possible. + +Mon Oct 16 21:33:17 CEST 2000 + + - Fixed handling of variables in connect rule. - Set ecpg version to 2.8.0. - Set library version to 3.2.0. diff --git a/src/interfaces/ecpg/preproc/descriptor.c b/src/interfaces/ecpg/preproc/descriptor.c index 3db962b1c7..6c249f4a6a 100644 --- a/src/interfaces/ecpg/preproc/descriptor.c +++ b/src/interfaces/ecpg/preproc/descriptor.c @@ -113,8 +113,7 @@ drop_descriptor(char *name, char *connection) } struct descriptor - * -lookup_descriptor(char *name, char *connection) +*lookup_descriptor(char *name, char *connection) { struct descriptor *i; diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 6aae3c4d53..804d3be457 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -465,7 +465,15 @@ stmt: AlterSchemaStmt { output_statement($1, 0, NULL, connection); } if (connection) mmerror(ET_ERROR, "no at option for connect statement.\n"); - fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d);", $1, autocommit); + fputs("{ ECPGconnect(__LINE__,", yyout); + + if ($1[1] == '?') + fprintf(yyout, "%s, %s, %d);", argsinsert->variable->name, $1 + sizeof("\"?\","), autocommit); + else + fprintf(yyout, "%s, %d); ", $1, autocommit); + + reset_variables(); + whenever_action(2); free($1); } @@ -3965,10 +3973,10 @@ connection_target: database_name opt_server opt_port } | StringConst { - $$ = mm_strdup($1); - $$[0] = '\"'; - $$[strlen($$) - 1] = '\"'; - free($1); + if ($1[0] == '\"') + $$ = $1; + else + $$ = make3_str(make_str("\""), $1, make_str("\"")); } db_prefix: ident cvariable @@ -4032,12 +4040,18 @@ ora_user: user_name $$ = cat_str(3, $1, make_str(","), $3); } -user_name: UserId { if ($1[0] == '\"') +user_name: UserId { + if ($1[0] == '\"') + $$ = $1; + else + $$ = make3_str(make_str("\""), $1, make_str("\"")); + } + | StringConst { + if ($1[0] == '\"') $$ = $1; else $$ = make3_str(make_str("\""), $1, make_str("\"")); } - | StringConst { $$ = make3_str(make_str("\""), $1, make_str("\"")); } char_variable: cvariable { /* check if we have a char variable */ diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index b42e962e7c..29899b7259 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -204,11 +204,11 @@ static void ECPGdump_a_struct(FILE *o, const char *name, const char *ind_name, l void ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * typ, const char *ind_name, struct ECPGtype * ind_typ, const char *prefix, const char *ind_prefix) { - if (ind_typ == NULL) +/* if (ind_typ == NULL) { ind_typ = &ecpg_no_indicator; ind_name = "no_indicator"; - } + }*/ switch (typ->typ) { @@ -228,17 +228,20 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * typ, const char *in ECPGdump_a_simple(o, name, typ->u.element->typ, typ->u.element->size, typ->size, NULL, prefix); - if (ind_typ->typ == ECPGt_NO_INDICATOR) - ECPGdump_a_simple(o, ind_name, ind_typ->typ, ind_typ->size, -1, NULL, ind_prefix); - else + if (ind_typ != NULL) { - if (ind_typ->typ != ECPGt_array) + if (ind_typ->typ == ECPGt_NO_INDICATOR) + ECPGdump_a_simple(o, ind_name, ind_typ->typ, ind_typ->size, -1, NULL, ind_prefix); + else { - fprintf(stderr, "Indicator for an array has to be array too.\n"); - exit(INDICATOR_NOT_ARRAY); + if (ind_typ->typ != ECPGt_array) + { + fprintf(stderr, "Indicator for an array has to be array too.\n"); + exit(INDICATOR_NOT_ARRAY); + } + ECPGdump_a_simple(o, ind_name, ind_typ->u.element->typ, + ind_typ->u.element->size, ind_typ->size, NULL, prefix); } - ECPGdump_a_simple(o, ind_name, ind_typ->u.element->typ, - ind_typ->u.element->size, ind_typ->size, NULL, prefix); } } break; diff --git a/src/interfaces/ecpg/test/dyntest.pgc b/src/interfaces/ecpg/test/dyntest.pgc index 3c53ffec7e..de76779c83 100644 --- a/src/interfaces/ecpg/test/dyntest.pgc +++ b/src/interfaces/ecpg/test/dyntest.pgc @@ -2,7 +2,7 @@ * * Copyright (c) 2000, Christof Petig * - * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.6 2000/03/17 23:26:36 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Attic/dyntest.pgc,v 1.7 2000/10/16 19:53:04 meskes Exp $ */ #include @@ -32,7 +32,11 @@ int main(int argc,char **argv) char DB[1024]; exec sql end declare section; int done=0; + FILE *dbgs; + if ((dbgs = fopen("log", "w")) != NULL) + ECPGdebug(1, dbgs); + snprintf(QUERY,sizeof QUERY,"select * from %s",argc>1 && argv[1][0]?argv[1]:"pg_tables"); exec sql whenever sqlerror do error(); @@ -179,5 +183,9 @@ int main(int argc,char **argv) exec sql close MYCURS; exec sql deallocate descriptor MYDESC; + + if (dbgs != NULL) + fclose(dbgs); + return 0; }