libpgtcl doesn't use UTF encoding of TCL
От | pgsql-bugs@postgresql.org |
---|---|
Тема | libpgtcl doesn't use UTF encoding of TCL |
Дата | |
Msg-id | 200107180818.f6I8INj14514@hub.org обсуждение исходный текст |
Ответы |
Re: libpgtcl doesn't use UTF encoding of TCL
(Bruce Momjian <pgman@candle.pha.pa.us>)
Re: libpgtcl doesn't use UTF encoding of TCL (Tatsuo Ishii <t-ishii@sra.co.jp>) |
Список | pgsql-bugs |
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
В списке pgsql-bugs по дате отправления:
Следующее
От: "Vadim I. Passynkov"Дата:
Сообщение: Curious result from text ( netmask ( inet ) ) functions.