Use Tcl ByteArray objects to avoid unwanted character set translation
in libpgtcl's lo_read/lo_write commands. Also, deal correctly with failure return from lo_read(). ljb and Tom Lane.
This commit is contained in:
parent
e84487f67a
commit
ede9b68e03
@ -1,5 +1,5 @@
|
||||
<!--
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpgtcl.sgml,v 1.38 2003/09/29 18:18:35 momjian Exp $
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpgtcl.sgml,v 1.39 2003/10/31 00:18:55 tgl Exp $
|
||||
-->
|
||||
|
||||
<chapter id="pgtcl">
|
||||
@ -1217,7 +1217,7 @@ pg_lo_creat <parameter>conn</parameter> <parameter>mode</parameter>
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which to create the large
|
||||
The handle of a connection to the database in which to create the large
|
||||
object.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1284,8 +1284,8 @@ pg_lo_open <parameter>conn</parameter> <parameter>loid</parameter> <parameter>mo
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object to
|
||||
be opened exists.
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -1354,7 +1354,7 @@ pg_lo_close <parameter>conn</parameter> <parameter>descriptor</parameter>
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1417,7 +1417,7 @@ pg_lo_read <parameter>conn</parameter> <parameter>descriptor</parameter> <parame
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1458,7 +1458,9 @@ pg_lo_read <parameter>conn</parameter> <parameter>descriptor</parameter> <parame
|
||||
<title>Return Value</title>
|
||||
|
||||
<para>
|
||||
None
|
||||
The number of bytes actually read is returned; this could be less than
|
||||
the number requested if the end of the large object is reached first.
|
||||
In event of an error, the return value is negative.
|
||||
</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
@ -1499,7 +1501,7 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1519,7 +1521,8 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
|
||||
<term><parameter>buf</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The string to write to the large object (not a variable name).
|
||||
The string to write to the large object (not a variable name,
|
||||
but the value itself).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -1528,7 +1531,8 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
|
||||
<term><parameter>len</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The maximum number of bytes to write.
|
||||
The maximum number of bytes to write. The number written will
|
||||
be the smaller of this value and the length of the string.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -1539,7 +1543,9 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
|
||||
<title>Return Value</title>
|
||||
|
||||
<para>
|
||||
None
|
||||
The number of bytes actually written is returned; this will ordinarily
|
||||
be the same as the number requested.
|
||||
In event of an error, the return value is negative.
|
||||
</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
@ -1580,7 +1586,7 @@ pg_lo_lseek <parameter>conn</parameter> <parameter>descriptor</parameter> <param
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1664,7 +1670,7 @@ pg_lo_tell <parameter>conn</parameter> <parameter>descriptor</parameter>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1727,7 +1733,7 @@ pg_lo_unlink <parameter>conn</parameter> <parameter>loid</parameter>
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1788,7 +1794,7 @@ pg_lo_import <parameter>conn</parameter> <parameter>filename</parameter>
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which to create the large
|
||||
The handle of a connection to the database in which to create the large
|
||||
object.
|
||||
</para>
|
||||
</listitem>
|
||||
@ -1858,7 +1864,7 @@ pg_lo_export <parameter>conn</parameter> <parameter>loid</parameter> <parameter>
|
||||
<term><parameter>conn</parameter></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The handle of a database connection in which the large object
|
||||
The handle of a connection to the database in which the large object
|
||||
exists.
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.73 2003/08/04 02:40:16 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.74 2003/10/31 00:18:55 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1215,17 +1215,21 @@ Pg_lo_read(ClientData cData, Tcl_Interp *interp, int objc,
|
||||
buf = ckalloc(len + 1);
|
||||
|
||||
nbytes = lo_read(conn, fd, buf, len);
|
||||
bufObj = Tcl_NewStringObj(buf, nbytes);
|
||||
|
||||
if (Tcl_ObjSetVar2(interp, bufVar, NULL, bufObj,
|
||||
TCL_LEAVE_ERR_MSG | TCL_PARSE_PART1) == NULL)
|
||||
rc = TCL_ERROR;
|
||||
else
|
||||
if (nbytes >= 0)
|
||||
{
|
||||
bufObj = Tcl_NewByteArrayObj(buf, nbytes);
|
||||
|
||||
if (Tcl_ObjSetVar2(interp, bufVar, NULL, bufObj,
|
||||
TCL_LEAVE_ERR_MSG | TCL_PARSE_PART1) == NULL)
|
||||
rc = TCL_ERROR;
|
||||
}
|
||||
|
||||
if (rc == TCL_OK)
|
||||
Tcl_SetObjResult(interp, Tcl_NewIntObj(nbytes));
|
||||
|
||||
ckfree(buf);
|
||||
return rc;
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
@ -1265,7 +1269,9 @@ Pg_lo_read(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[])
|
||||
|
||||
nbytes = lo_read(conn, fd, buf, len);
|
||||
|
||||
Tcl_SetVar(interp, bufVar, buf, TCL_LEAVE_ERR_MSG);
|
||||
if (nbytes >= 0)
|
||||
Tcl_SetVar(interp, bufVar, buf, TCL_LEAVE_ERR_MSG);
|
||||
|
||||
sprintf(interp->result, "%d", nbytes);
|
||||
ckfree(buf);
|
||||
return TCL_OK;
|
||||
@ -1307,7 +1313,7 @@ Pg_lo_write(ClientData cData, Tcl_Interp *interp, int objc,
|
||||
if (Tcl_GetIntFromObj(interp, objv[2], &fd) != TCL_OK)
|
||||
return TCL_ERROR;
|
||||
|
||||
buf = Tcl_GetStringFromObj(objv[3], &nbytes);
|
||||
buf = Tcl_GetByteArrayFromObj(objv[3], &nbytes);
|
||||
|
||||
if (Tcl_GetIntFromObj(interp, objv[4], &len) != TCL_OK)
|
||||
return TCL_ERROR;
|
||||
|
Loading…
x
Reference in New Issue
Block a user