Commit 16910e44 authored by Bruce Momjian's avatar Bruce Momjian

Next version of patch.

Now with documentation update and disabling of UTF conversion for Tcl <=8.0

On Fri, 24 Aug 2001, Vsevolod Lobko wrote:

> On Thu, 23 Aug 2001, Tom Lane wrote:
>
> > > Is this looks better?
> >
> > It does, but one small gripe: the lack of semicolons will probably cause
> > pg_indent to mess up the indentation.  (I know emacs' autoindent mode
> > will not work nicely with it, either.)  Please set up the macros so that
> > you write
> >
> >                         UTF_BEGIN;
> >                         Tcl_DStringAppend(&unknown_src, UTF_E2U(part), -1);
> >                         UTF_END;
> >
> > and then I'll be happy.
>
> Attached revised patch
>
> > Your point about overhead is a good one, so I retract the gripe about
> > using a configure switch.  But please include documentation patches to
> > describe the configure option in the administrator's guide (installation
> > section).
>
> This patch still uses configure switch for enabling feature.
>
> For enabling based on tcl version we have 2 posibilites:
>  1) having feature enabled by default, but in pltcl.c check for tcl
>     version and disable it for old versions
>  2) enable or disable at configure time based on tcl version, but there
>     are problem - current configure don't checks for tcl version at all
>     and my configure skills not enought for adding this
>

Vsevolod Lobko
parent 37c0b648
...@@ -409,6 +409,21 @@ AC_MSG_RESULT([$enable_pltcl_unknown]) ...@@ -409,6 +409,21 @@ AC_MSG_RESULT([$enable_pltcl_unknown])
AC_SUBST([enable_pltcl_unknown]) AC_SUBST([enable_pltcl_unknown])
#
# If Tcl is enabled (above) then check for pltcl_utf
#
AC_MSG_CHECKING([whether to build with PL/Tcl with UTF support])
if test "$with_tcl" = yes; then
PGAC_ARG_BOOL(enable, pltcl-utf, no,
[ --enable-pltcl-utf build PL/Tcl UTF support (if Tcl is enabled)],
[AC_DEFINE([ENABLE_PLTCL_UTF])])
else
enable_pltcl_utf=no
fi
AC_MSG_RESULT([$enable_pltcl_utf])
AC_SUBST([enable_pltcl_utf])
# #
# Optionally build Perl modules (Pg.pm and PL/Perl) # Optionally build Perl modules (Pg.pm and PL/Perl)
# #
......
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/installation.sgml,v 1.51 2001/08/28 14:20:24 petere Exp $ --> <!-- $Header: /cvsroot/pgsql/doc/src/sgml/installation.sgml,v 1.52 2001/09/06 02:56:32 momjian Exp $ -->
<chapter id="installation"> <chapter id="installation">
<title><![%flattext-install-include[<productname>PostgreSQL</>]]> <title><![%flattext-install-include[<productname>PostgreSQL</>]]>
...@@ -683,6 +683,17 @@ su - postgres ...@@ -683,6 +683,17 @@ su - postgres
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>--enable-pltcl-utf</term>
<listitem>
<para>
Enables enables PL/Tcl Tcl_UtfToExternal and Tcl_ExternalToUtf
conversion support. These functions needed for Tcl versions 8.1
and above for proper handling of 8-bit characters.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term>--enable-odbc</term> <term>--enable-odbc</term>
<listitem> <listitem>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* or in pg_config.h afterwards. Of course, if you edit pg_config.h, then your * or in pg_config.h afterwards. Of course, if you edit pg_config.h, then your
* changes will be overwritten the next time you run configure. * changes will be overwritten the next time you run configure.
* *
* $Id: pg_config.h.in,v 1.1 2001/08/24 14:07:49 petere Exp $ * $Id: pg_config.h.in,v 1.2 2001/09/06 02:56:32 momjian Exp $
*/ */
#ifndef PG_CONFIG_H #ifndef PG_CONFIG_H
...@@ -84,6 +84,9 @@ ...@@ -84,6 +84,9 @@
/* --enable-pltcl-unknown */ /* --enable-pltcl-unknown */
#undef ENABLE_PLTCL_UNKNOWN #undef ENABLE_PLTCL_UNKNOWN
/* --enable-pltcl-utf */
#undef ENABLE_PLTCL_UTF
/* --enable-nls */ /* --enable-nls */
#undef ENABLE_NLS #undef ENABLE_NLS
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
* ENHANCEMENTS, OR MODIFICATIONS. * ENHANCEMENTS, OR MODIFICATIONS.
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.38 2001/08/02 15:45:55 momjian Exp $ * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.39 2001/09/06 02:56:32 momjian Exp $
* *
**********************************************************************/ **********************************************************************/
...@@ -59,6 +59,18 @@ ...@@ -59,6 +59,18 @@
#include "catalog/pg_language.h" #include "catalog/pg_language.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#if defined(ENABLE_PLTCL_UTF) && TCL_MAJOR_VERSION == 8 \
&& TCL_MINOR_VERSION > 0
# define UTF_BEGIN do { Tcl_DString _pltcl_ds_tmp
# define UTF_END Tcl_DStringFree(&_pltcl_ds_tmp); } while (0)
# define UTF_U2E(x) (Tcl_UtfToExternalDString(NULL,(x),-1,&_pltcl_ds_tmp))
# define UTF_E2U(x) (Tcl_ExternalToUtfDString(NULL,(x),-1,&_pltcl_ds_tmp))
#else /* ENABLE_PLTCL_UTF */
# define UTF_BEGIN
# define UTF_END
# define UTF_U2E(x) (x)
# define UTF_E2U(x) (x)
#endif /* ENABLE_PLTCL_UTF */
/********************************************************************** /**********************************************************************
* The information we cache about loaded procedures * The information we cache about loaded procedures
...@@ -333,7 +345,9 @@ pltcl_init_load_unknown(Tcl_Interp *interp) ...@@ -333,7 +345,9 @@ pltcl_init_load_unknown(Tcl_Interp *interp)
SPI_tuptable->tupdesc, fno); SPI_tuptable->tupdesc, fno);
if (part != NULL) if (part != NULL)
{ {
Tcl_DStringAppend(&unknown_src, part, -1); UTF_BEGIN;
Tcl_DStringAppend(&unknown_src, UTF_E2U(part), -1);
UTF_END;
pfree(part); pfree(part);
} }
} }
...@@ -613,7 +627,9 @@ pltcl_func_handler(PG_FUNCTION_ARGS) ...@@ -613,7 +627,9 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
} }
proc_source = DatumGetCString(DirectFunctionCall1(textout, proc_source = DatumGetCString(DirectFunctionCall1(textout,
PointerGetDatum(&procStruct->prosrc))); PointerGetDatum(&procStruct->prosrc)));
Tcl_DStringAppend(&proc_internal_body, proc_source, -1); UTF_BEGIN;
Tcl_DStringAppend(&proc_internal_body, UTF_E2U(proc_source), -1);
UTF_END;
pfree(proc_source); pfree(proc_source);
Tcl_DStringAppendElement(&proc_internal_def, Tcl_DStringAppendElement(&proc_internal_def,
Tcl_DStringValue(&proc_internal_body)); Tcl_DStringValue(&proc_internal_body));
...@@ -715,7 +731,9 @@ pltcl_func_handler(PG_FUNCTION_ARGS) ...@@ -715,7 +731,9 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
fcinfo->arg[i], fcinfo->arg[i],
ObjectIdGetDatum(prodesc->arg_out_elem[i]), ObjectIdGetDatum(prodesc->arg_out_elem[i]),
Int32GetDatum(prodesc->arg_out_len[i]))); Int32GetDatum(prodesc->arg_out_len[i])));
Tcl_DStringAppendElement(&tcl_cmd, tmp); UTF_BEGIN;
Tcl_DStringAppendElement(&tcl_cmd, UTF_E2U(tmp));
UTF_END;
pfree(tmp); pfree(tmp);
} }
} }
...@@ -777,13 +795,15 @@ pltcl_func_handler(PG_FUNCTION_ARGS) ...@@ -777,13 +795,15 @@ pltcl_func_handler(PG_FUNCTION_ARGS)
if (SPI_finish() != SPI_OK_FINISH) if (SPI_finish() != SPI_OK_FINISH)
elog(ERROR, "pltcl: SPI_finish() failed"); elog(ERROR, "pltcl: SPI_finish() failed");
UTF_BEGIN;
if (fcinfo->isnull) if (fcinfo->isnull)
retval = (Datum) 0; retval = (Datum) 0;
else else
retval = FunctionCall3(&prodesc->result_in_func, retval = FunctionCall3(&prodesc->result_in_func,
PointerGetDatum(interp->result), PointerGetDatum(UTF_U2E(interp->result)),
ObjectIdGetDatum(prodesc->result_in_elem), ObjectIdGetDatum(prodesc->result_in_elem),
Int32GetDatum(-1)); Int32GetDatum(-1));
UTF_END;
/************************************************************ /************************************************************
* Finally we may restore normal error handling. * Finally we may restore normal error handling.
...@@ -929,7 +949,9 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS) ...@@ -929,7 +949,9 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
proc_source = DatumGetCString(DirectFunctionCall1(textout, proc_source = DatumGetCString(DirectFunctionCall1(textout,
PointerGetDatum(&procStruct->prosrc))); PointerGetDatum(&procStruct->prosrc)));
Tcl_DStringAppend(&proc_internal_body, proc_source, -1); UTF_BEGIN;
Tcl_DStringAppend(&proc_internal_body, UTF_E2U(proc_source), -1);
UTF_END;
pfree(proc_source); pfree(proc_source);
Tcl_DStringAppendElement(&proc_internal_def, Tcl_DStringAppendElement(&proc_internal_def,
Tcl_DStringValue(&proc_internal_body)); Tcl_DStringValue(&proc_internal_body));
...@@ -1230,11 +1252,13 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS) ...@@ -1230,11 +1252,13 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
************************************************************/ ************************************************************/
modnulls[attnum - 1] = ' '; modnulls[attnum - 1] = ' ';
fmgr_info(typinput, &finfo); fmgr_info(typinput, &finfo);
UTF_BEGIN;
modvalues[attnum - 1] = modvalues[attnum - 1] =
FunctionCall3(&finfo, FunctionCall3(&finfo,
CStringGetDatum(ret_values[i++]), CStringGetDatum(UTF_U2E(ret_values[i++])),
ObjectIdGetDatum(typelem), ObjectIdGetDatum(typelem),
Int32GetDatum(tupdesc->attrs[attnum - 1]->atttypmod)); Int32GetDatum(tupdesc->attrs[attnum - 1]->atttypmod));
UTF_END;
} }
rettup = SPI_modifytuple(trigdata->tg_relation, rettup, tupdesc->natts, rettup = SPI_modifytuple(trigdata->tg_relation, rettup, tupdesc->natts,
...@@ -1558,7 +1582,9 @@ pltcl_SPI_exec(ClientData cdata, Tcl_Interp *interp, ...@@ -1558,7 +1582,9 @@ pltcl_SPI_exec(ClientData cdata, Tcl_Interp *interp,
/************************************************************ /************************************************************
* Execute the query and handle return codes * Execute the query and handle return codes
************************************************************/ ************************************************************/
spi_rc = SPI_exec(argv[query_idx], count); UTF_BEGIN;
spi_rc = SPI_exec(UTF_U2E(argv[query_idx]), count);
UTF_END;
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart)); memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
switch (spi_rc) switch (spi_rc)
...@@ -1794,7 +1820,9 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, ...@@ -1794,7 +1820,9 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp,
/************************************************************ /************************************************************
* Prepare the plan and check for errors * Prepare the plan and check for errors
************************************************************/ ************************************************************/
plan = SPI_prepare(argv[1], nargs, qdesc->argtypes); UTF_BEGIN;
plan = SPI_prepare(UTF_U2E(argv[1]), nargs, qdesc->argtypes);
UTF_END;
if (plan == NULL) if (plan == NULL)
{ {
...@@ -2078,11 +2106,13 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp, ...@@ -2078,11 +2106,13 @@ pltcl_SPI_execp(ClientData cdata, Tcl_Interp *interp,
************************************************************/ ************************************************************/
for (j = 0; j < callnargs; j++) for (j = 0; j < callnargs; j++)
{ {
UTF_BEGIN;
qdesc->argvalues[j] = qdesc->argvalues[j] =
FunctionCall3(&qdesc->arginfuncs[j], FunctionCall3(&qdesc->arginfuncs[j],
CStringGetDatum(callargs[j]), CStringGetDatum(UTF_U2E(callargs[j])),
ObjectIdGetDatum(qdesc->argtypelems[j]), ObjectIdGetDatum(qdesc->argtypelems[j]),
Int32GetDatum(qdesc->arglen[j])); Int32GetDatum(qdesc->arglen[j]));
UTF_END;
} }
/************************************************************ /************************************************************
...@@ -2377,7 +2407,9 @@ pltcl_set_tuple_values(Tcl_Interp *interp, char *arrayname, ...@@ -2377,7 +2407,9 @@ pltcl_set_tuple_values(Tcl_Interp *interp, char *arrayname,
attr, attr,
ObjectIdGetDatum(typelem), ObjectIdGetDatum(typelem),
Int32GetDatum(tupdesc->attrs[i]->attlen))); Int32GetDatum(tupdesc->attrs[i]->attlen)));
Tcl_SetVar2(interp, *arrptr, *nameptr, outputstr, 0); UTF_BEGIN;
Tcl_SetVar2(interp, *arrptr, *nameptr, UTF_E2U(outputstr), 0);
UTF_END;
pfree(outputstr); pfree(outputstr);
} }
else else
...@@ -2448,7 +2480,9 @@ pltcl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc, ...@@ -2448,7 +2480,9 @@ pltcl_build_tuple_argument(HeapTuple tuple, TupleDesc tupdesc,
ObjectIdGetDatum(typelem), ObjectIdGetDatum(typelem),
Int32GetDatum(tupdesc->attrs[i]->attlen))); Int32GetDatum(tupdesc->attrs[i]->attlen)));
Tcl_DStringAppendElement(retval, attname); Tcl_DStringAppendElement(retval, attname);
Tcl_DStringAppendElement(retval, outputstr); UTF_BEGIN;
Tcl_DStringAppendElement(retval, UTF_E2U(outputstr));
UTF_END;
pfree(outputstr); pfree(outputstr);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment