Re: libpgtcl doesn't use UTF encoding of TCL

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: libpgtcl doesn't use UTF encoding of TCL
Дата
Msg-id 200107181524.f6IFOfK10889@candle.pha.pa.us
обсуждение исходный текст
Ответ на libpgtcl doesn't use UTF encoding of TCL  (pgsql-bugs@postgresql.org)
Ответы Re: libpgtcl doesn't use UTF encoding of TCL  (Reinhard Max <max@suse.de>)
Список pgsql-bugs
Do you have any idea how this will work with earlier TCL versions?  When
was Tcl_UtfToExternalDString added to TCL?

> Eugene Faukin (elf@solvo.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@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

В списке pgsql-bugs по дате отправления:

Предыдущее
От: "Vadim I. Passynkov"
Дата:
Сообщение: Curious result from text ( netmask ( inet ) ) functions.
Следующее
От: Bruce Momjian
Дата:
Сообщение: Re: libpgtcl doesn't use UTF encoding of TCL