summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2003-10-31 00:18:55 +0000
committerTom Lane2003-10-31 00:18:55 +0000
commitede9b68e03ec9288e85b2847b27793782c0cf5da (patch)
tree333dc1665eae857649e2e649936335db71ac7364
parente84487f67a0d216f3db87b2558f1edd322a09e48 (diff)
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.
-rw-r--r--doc/src/sgml/libpgtcl.sgml38
-rw-r--r--src/interfaces/libpgtcl/pgtclCmds.c24
2 files changed, 37 insertions, 25 deletions
diff --git a/doc/src/sgml/libpgtcl.sgml b/doc/src/sgml/libpgtcl.sgml
index c0ffddebeea..f3f0112c4e3 100644
--- a/doc/src/sgml/libpgtcl.sgml
+++ b/doc/src/sgml/libpgtcl.sgml
@@ -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>
diff --git a/src/interfaces/libpgtcl/pgtclCmds.c b/src/interfaces/libpgtcl/pgtclCmds.c
index 657a59fe892..dad51c4dcfd 100644
--- a/src/interfaces/libpgtcl/pgtclCmds.c
+++ b/src/interfaces/libpgtcl/pgtclCmds.c
@@ -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;