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.