]> granicus.if.org Git - postgresql/commitdiff
Fixed handling of variables in connect rule.
authorMichael Meskes <meskes@postgresql.org>
Mon, 16 Oct 2000 19:53:04 +0000 (19:53 +0000)
committerMichael Meskes <meskes@postgresql.org>
Mon, 16 Oct 2000 19:53:04 +0000 (19:53 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/descriptor.c
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/preproc/type.c
src/interfaces/ecpg/test/dyntest.pgc

index 1816ec16affa5190347db77d0b3fa1e6cc12dd87..9fe53ee62a96503eac67f2c62b75e56b935d56d1 100644 (file)
@@ -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.
index 3db962b1c7873417fb4c844316f03bb4f6c5e4b0..6c249f4a6a14829207dab01de1f788fb61170e23 100644 (file)
@@ -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;
 
index 6aae3c4d53f3aae604684529d22db5613327121d..804d3be4579e09d451bc815876125f7c726a5ef6 100644 (file)
@@ -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 */
index b42e962e7cadd089b29fc974403d3444e48b26b0..29899b72598f441d052356606262b43b0a681135 100644 (file)
@@ -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;
index 3c53ffec7e53651b456880edf729d787bab33c04..de76779c838934463542dc2766727486045a64be 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
  *
- * $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 <stdio.h>
@@ -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;
 }