]> granicus.if.org Git - postgresql/commitdiff
Use Tcl ByteArray objects to avoid unwanted character set translation
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 31 Oct 2003 00:18:55 +0000 (00:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 31 Oct 2003 00:18:55 +0000 (00:18 +0000)
in libpgtcl's lo_read/lo_write commands.  Also, deal correctly with
failure return from lo_read().  ljb and Tom Lane.

doc/src/sgml/libpgtcl.sgml
src/interfaces/libpgtcl/pgtclCmds.c

index c0ffddebeeae208d7f143ac7b615f4f8fcd9ade3..f3f0112c4e3894280e7732db130126196f93a120 100644 (file)
@@ -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>
index 657a59fe89269a1d96b3c29fc520ec78965465ec..dad51c4dcfdb25592290ec4ab07000ab0ef36430 100644 (file)
@@ -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;