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
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-hackers pgsql-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

Browse pgsql-bugs by date

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

Browse pgsql-hackers by date

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

Browse pgsql-interfaces by date

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