--- pgtclCmds.c.orig Thu Jul 19 10:08:27 2001 +++ pgtclCmds.c Thu Jul 19 13:33:06 2001 @@ -439,6 +439,9 @@ Pg_ConnectionId *connid; PGconn *conn; PGresult *result; +#ifdef TCL_UTF8 + Tcl_DString putString; +#endif if (argc != 3) { @@ -456,8 +459,13 @@ Tcl_SetResult(interp, "Attempt to query while COPY in progress", TCL_STATIC); return TCL_ERROR; } - +#ifdef TCL_UTF8 + Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString); + result = PQexec(conn, Tcl_DStringValue(&putString)); + Tcl_DStringFree(&putString); +#else result = PQexec(conn, argv[2]); +#endif /* TCL_UTF8 */ /* Transfer any notify events from libpq to Tcl event queue. */ PgNotifyTransferEvents(connid); @@ -543,6 +551,9 @@ char *arrVar; char nameBuffer[256]; const char *appendstr; +#ifdef TCL_UTF8 + Tcl_DString retString; +#endif if (argc < 3 || argc > 5) { @@ -693,10 +704,27 @@ } #ifdef TCL_ARRAYS for (i = 0; i < PQnfields(result); i++) - Tcl_AppendElement(interp, tcl_value(PQgetvalue(result, tupno, i))); +#ifdef TCL_UTF8 + { + Tcl_ExternalToUtfDString(NULL, tcl_value(PQgetvalue(result,tupno, i)), -1, &retString); + Tcl_AppendElement(interp, Tcl_DStringValue(&retString)); + } #else + Tcl_AppendElement(interp, tcl_value(PQgetvalue(result, tupno, i))); +#endif /* TCL_UTF8 */ +#else /* TCL_ARRAYS */ for (i = 0; i < PQnfields(result); i++) +#ifdef TCL_UTF8 + { + Tcl_ExternalToUtfDString(NULL, PQgetvalue(result, tupno, i), -1, &retString); + Tcl_AppendElement(interp, Tcl_DStringValue(&retString)); + } +#else Tcl_AppendElement(interp, PQgetvalue(result, tupno, i)); +#endif /* TCL_UTF8 */ +#endif /* TCL_ARRAYS */ +#ifdef TCL_UTF8 + Tcl_DStringFree(&retString); #endif return TCL_OK; } @@ -715,6 +743,20 @@ } for (i = 0; i < PQnfields(result); i++) { +#ifdef TCL_UTF8 + Tcl_ExternalToUtfDString(NULL, +#ifdef TCL_ARRAYS + tcl_value(PQgetvalue(result,tupno, i)), +#else + PQgetvalue(result, tupno, i), +#endif /* TCL_ARRAYS */ + -1, &retString); + if (Tcl_SetVar2(interp, argv[4], PQfname(result, i), + Tcl_DStringValue(&retString), + TCL_LEAVE_ERR_MSG) == NULL) + { + Tcl_DStringFree(&retString); +#else /* ndef TCL_UTF8 */ if (Tcl_SetVar2(interp, argv[4], PQfname(result, i), #ifdef TCL_ARRAYS tcl_value(PQgetvalue(result, tupno, i)), @@ -722,14 +764,28 @@ PQgetvalue(result, tupno, i), #endif TCL_LEAVE_ERR_MSG) == NULL) + { +#endif /* TCL_UTF8 */ return TCL_ERROR; + } } +#ifdef TCL_UTF8 + Tcl_DStringFree(&retString); +#endif return TCL_OK; } else if (strcmp(opt, "-attributes") == 0) { for (i = 0; i < PQnfields(result); i++) +#ifdef TCL_UTF8 + { + Tcl_ExternalToUtfDString(NULL, PQfname(result, i), -1, &retString); + Tcl_AppendElement(interp, Tcl_DStringValue(&retString)); + Tcl_DStringFree(&retString); + } +#else Tcl_AppendElement(interp, PQfname(result, i)); +#endif return TCL_OK; } else if (strcmp(opt, "-lAttributes") == 0) @@ -806,6 +862,9 @@ char *oid_varname = NULL; char *array_varname = NULL; char buf[64]; +#ifdef TCL_UTF8 + Tcl_DString dString; +#endif char *usage = "Wrong # of arguments\n" "pg_execute ?-array arrayname? ?-oid varname? " @@ -882,7 +941,12 @@ /* * Execute the query */ +#ifdef TCL_UTF8 + result = PQexec(conn, Tcl_UtfToExternalDString(NULL, argv[i++], -1, &dString)); + Tcl_DStringFree(&dString); +#else result = PQexec(conn, argv[i++]); +#endif /* * Transfer any notify events from libpq to Tcl event queue. @@ -1022,6 +1086,9 @@ int n; char *fname; char *value; +#ifdef TCL_UTF8 + Tcl_DString dString; +#endif /* * For each column get the column name and value and put it into a Tcl @@ -1031,19 +1098,36 @@ for (i = 0; i < n; i++) { fname = PQfname(result, i); +#ifdef TCL_UTF8 + value = Tcl_ExternalToUtfDString(NULL, PQgetvalue(result, tupno, i), -1, &dString); +#else value = PQgetvalue(result, tupno, i); +#endif if (array_varname != NULL) { if (Tcl_SetVar2(interp, array_varname, fname, value, TCL_LEAVE_ERR_MSG) == NULL) + { +#ifdef TCL_UTF8 + Tcl_DStringFree(&dString); +#endif return TCL_ERROR; + } } else { if (Tcl_SetVar(interp, fname, value, TCL_LEAVE_ERR_MSG) == NULL) + { +#ifdef TCL_UTF8 + Tcl_DStringFree(&dString); +#endif return TCL_ERROR; + } } +#ifdef TCL_UTF8 + Tcl_DStringFree(&dString); +#endif } return TCL_OK; @@ -1658,6 +1742,10 @@ column, ncols; Tcl_DString headers; +#ifdef TCL_UTF8 + Tcl_DString retString; + Tcl_DString putString; +#endif char buffer[2048]; struct info_s { @@ -1676,7 +1764,15 @@ if (conn == (PGconn *) NULL) return TCL_ERROR; +#ifdef TCL_UTF8 + Tcl_UtfToExternalDString(NULL, argv[2], -1, &putString); + result = PQexec(conn, Tcl_DStringValue(&putString)); + Tcl_DStringFree(&putString); + + if (result == 0) +#else if ((result = PQexec(conn, argv[2])) == 0) +#endif { /* error occurred sending the query */ Tcl_SetResult(interp, PQerrorMessage(conn), TCL_VOLATILE); @@ -1724,6 +1820,19 @@ Tcl_SetVar2(interp, argv[3], ".tupno", buffer, 0); for (column = 0; column < ncols; column++) +#ifdef TCL_UTF8 + { + Tcl_ExternalToUtfDString(NULL, +#ifdef TCL_ARRAYS + tcl_value(PQgetvalue(result, tupno, column)), +#else + PQgetvalue(result, tupno, column), +#endif /* TCL_ARRAYS */ + -1, &retString); + Tcl_SetVar2(interp, argv[3], info[column].cname, Tcl_DStringValue(&retString), 0); + Tcl_DStringFree(&retString); + } +#else /* ndef TCL_UTF8 */ Tcl_SetVar2(interp, argv[3], info[column].cname, #ifdef TCL_ARRAYS tcl_value(PQgetvalue(result, tupno, column)), @@ -1731,7 +1840,7 @@ PQgetvalue(result, tupno, column), #endif 0); - +#endif /* TCL_UTF8 */ Tcl_SetVar2(interp, argv[3], ".command", "update", 0); if ((r = Tcl_Eval(interp, argv[4])) != TCL_OK && r != TCL_CONTINUE) --- pgtclCmds.h.orig Thu Jul 19 11:31:00 2001 +++ pgtclCmds.h Thu Jul 19 11:34:40 2001 @@ -20,14 +20,24 @@ #define RES_HARD_MAX 128 #define RES_START 16 +#ifdef TCL_MAJOR_VERSION + /* * From Tcl verion 8.0 on we can make large object access binary. */ -#ifdef TCL_MAJOR_VERSION #if (TCL_MAJOR_VERSION >= 8) #define PGTCL_USE_TCLOBJ #endif + + +/* + * Tcl >= 8.1 uses UTF8 encoding for internal string representation. + */ +#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION > 0) || TCL_MAJOR_VERSION > 8 +#define TCL_UTF8 #endif + +#endif /* TCL_MAJOR_VERSION */ /* * Each Pg_ConnectionId has a list of Pg_TclNotifies structs, one for each