Skip site navigation (1) Skip section navigation (2)

Re: libpgtcl doesn't use UTF encoding of TCL

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: elf(at)solvo(dot)ru, pgsql-bugs(at)postgresql(dot)org
Subject: Re: libpgtcl doesn't use UTF encoding of TCL
Date: 2001-07-18 15:24:41
Message-ID: 200107181524.f6IFOfK10889@candle.pha.pa.us (view raw or flat)
Thread:
Lists: pgsql-bugspgsql-hackerspgsql-interfaces
Do you have any idea how this will work with earlier TCL versions?  When
was Tcl_UtfToExternalDString added to TCL?

> Eugene Faukin (elf(at)solvo(dot)ru) reports a bug with a severity of 2
> The lower the number the more severe it is.
> 
> Short Description
> libpgtcl doesn't use UTF encoding of TCL
> 
> Long Description
> Modern versions of the TCL (8.2 at least) use UTF encoding to internal
> storage of the text. libpgtcl uses TCL functions to insert strings directly
> into TCL internal structure without any conversion.
> 
> 
> Sample Code
> I can suggest you next patch I use for myself:
> 
> diff -uNr postgresql-7.0.2.orig/src/interfaces/libpgtcl/pgtclCmds.c postgresql-7.0.2/src/interfaces/libpgtcl/pgtclCmds.c
> --- postgresql-7.0.2.orig/src/interfaces/libpgtcl/pgtclCmds.c   Wed Apr 12 21:17:11 2000
> +++ postgresql-7.0.2/src/interfaces/libpgtcl/pgtclCmds.c        Thu Nov 16 20:26:37 2000
> @@ -431,6 +431,7 @@
>         Pg_ConnectionId *connid;
>         PGconn     *conn;
>         PGresult   *result;
> +       Tcl_DString putString;
>  
>         if (argc != 3)
>         {
> @@ -449,7 +450,9 @@
>                 return TCL_ERROR;
>         }
>  
> -       result = PQexec(conn, argv[2]);
> +       Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString);
> +       result = PQexec(conn, Tcl_DStringValue(&putString));
> +       Tcl_DStringFree(&putString);
>  
>         /* Transfer any notify events from libpq to Tcl event queue. */
>         PgNotifyTransferEvents(connid);
> @@ -535,6 +538,7 @@
>         char       *arrVar;
>         char            nameBuffer[256];
>         const char *appendstr;
> +       Tcl_DString retString;
>  
>         if (argc < 3 || argc > 5)
>         {
> @@ -685,11 +689,24 @@
>                 }
>  #ifdef TCL_ARRAYS
>                 for (i = 0; i < PQnfields(result); i++)
> -                       Tcl_AppendElement(interp, tcl_value(PQgetvalue(result, tupno, i)));
> +               {
> +                   Tcl_ExternalToUtfDString(NULL,
> +                                            tcl_value(PQgetvalue(result,
> +                                                                 tupno, i)),
> +                                            -1, &retString);
> +                   Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
> +               }
>  #else
>                 for (i = 0; i < PQnfields(result); i++)
> -                       Tcl_AppendElement(interp, PQgetvalue(result, tupno, i));
> +               {
> +                   Tcl_ExternalToUtfDString(NULL,
> +                                            PQgetvalue(result, tupno, i),
> +                                            -1, &retString);
> +               
> +                   Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
> +               }
>  #endif
> +               Tcl_DStringFree(&retString);
>                 return TCL_OK;
>         }
>         else if (strcmp(opt, "-tupleArray") == 0)
> @@ -707,21 +724,35 @@
>                 }
>                 for (i = 0; i < PQnfields(result); i++)
>                 {
> -                       if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
> +                   Tcl_ExternalToUtfDString(NULL, 
>  #ifdef TCL_ARRAYS
> -                                                       tcl_value(PQgetvalue(result, tupno, i)),
> +                                            tcl_value(PQgetvalue(result,
> +                                                                 tupno, i)),
>  #else
> -                                                       PQgetvalue(result, tupno, i),
> +                                            PQgetvalue(result, tupno, i),
>  #endif
> -                                                       TCL_LEAVE_ERR_MSG) == NULL)
> -                               return TCL_ERROR;
> +                                            -1, &retString);
> +
> +                   if (Tcl_SetVar2(interp, argv[4], PQfname(result, i),
> +                                   Tcl_DStringValue(&retString),
> +                                   TCL_LEAVE_ERR_MSG) == NULL)
> +                   {
> +                       Tcl_DStringFree(&retString);
> +                       return TCL_ERROR;
> +                   }
>                 }
> +               Tcl_DStringFree(&retString);
>                 return TCL_OK;
>         }
>         else if (strcmp(opt, "-attributes") == 0)
>         {
>                 for (i = 0; i < PQnfields(result); i++)
> -                       Tcl_AppendElement(interp, PQfname(result, i));
> +               {
> +                   Tcl_ExternalToUtfDString(NULL, PQfname(result, i),
> +                                            -1, &retString);
> +                   Tcl_AppendElement(interp, Tcl_DStringValue(&retString));
> +                   Tcl_DStringFree(&retString);
> +               }
>                 return TCL_OK;
>         }
>         else if (strcmp(opt, "-lAttributes") == 0)
> @@ -1274,6 +1305,8 @@
>                                 column,
>                                 ncols;
>         Tcl_DString headers;
> +       Tcl_DString retString;
> +       Tcl_DString putString;
>         char            buffer[2048];
>         struct info_s
>         {
> @@ -1292,7 +1325,11 @@
>         if (conn == (PGconn *) NULL)
>                 return TCL_ERROR;
>  
> -       if ((result = PQexec(conn, argv[2])) == 0)
> +       Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString);
> +       result = PQexec(conn, Tcl_DStringValue(&putString));
> +       Tcl_DStringFree(&putString);
> +
> +       if (result == 0)
>         {
>                 /* error occurred sending the query */
>                 Tcl_SetResult(interp, PQerrorMessage(conn), TCL_VOLATILE);
> @@ -1340,13 +1377,21 @@
>                 Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0);
>  
>                 for (column = 0; column < ncols; column++)
> -                       Tcl_SetVar2(interp, argv[3], info[column].cname,
> +               {
> +                   Tcl_ExternalToUtfDString(NULL,
>  #ifdef TCL_ARRAYS
> -                                               tcl_value(PQgetvalue(result, tupno, column)),
> +                                            tcl_value(PQgetvalue(result,
> +                                                                 tupno,
> +                                                                 column)),
>  #else
> -                                               PQgetvalue(result, tupno, column),
> +                                            PQgetvalue(result, tupno, column),
>  #endif
> -                                               0);
> +                                            -1, &retString);
> +
> +                   Tcl_SetVar2(interp, argv[3], info[column].cname,
> +                               Tcl_DStringValue(&retString), 0);
> +                   Tcl_DStringFree(&retString);
> +               }
>  
>                 Tcl_SetVar2(interp, argv[3], ".command", "update", 0);
>  
> 
> 
> No file was uploaded with this report
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman(at)candle(dot)pha(dot)pa(dot)us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

In response to

Responses

pgsql-hackers by date

Next:From: Bruce MomjianDate: 2001-07-18 15:26:22
Subject: Re: pg_depend
Previous:From: Tom LaneDate: 2001-07-18 15:19:03
Subject: Re: Idea: recycle WAL segments, don't delete/recreate 'em

pgsql-bugs by date

Next:From: Reinhard MaxDate: 2001-07-18 16:14:59
Subject: Re: libpgtcl doesn't use UTF encoding of TCL
Previous:From: Vadim I. PassynkovDate: 2001-07-18 14:08:16
Subject: Curious result from text ( netmask ( inet ) ) functions.

pgsql-interfaces by date

Next:From: Denis GasparinDate: 2001-07-18 15:59:24
Subject: Rows updated by an "UPDATE" query with Python
Previous:From: Matt FairDate: 2001-07-18 15:15:57
Subject: Re: postgres access from windowsNT

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group