Received: from candle.pha.pa.us (candle.navpoint.com [162.33.245.46]) by postgresql.org (8.11.3/8.11.1) with ESMTP id f6IFPDa05717 for ; Wed, 18 Jul 2001 11:25:13 -0400 (EDT) (envelope-from pgman@candle.pha.pa.us) Received: (from pgman@localhost) by candle.pha.pa.us (8.10.1/8.10.1) id f6IFOfK10889; Wed, 18 Jul 2001 11:24:41 -0400 (EDT) From: Bruce Momjian Message-Id: <200107181524.f6IFOfK10889@candle.pha.pa.us> Subject: Re: libpgtcl doesn't use UTF encoding of TCL In-Reply-To: <200107180818.f6I8INj14514@hub.org> "from pgsql-bugs@postgresql.org at Jul 18, 2001 04:18:23 am" To: elf@solvo.ru, pgsql-bugs@postgresql.org Date: Wed, 18 Jul 2001 11:24:41 -0400 (EDT) X-Mailer: ELM [version 2.4ME+ PL90 (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Archive-Number: 200107/84 X-Sequence-Number: 1866 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