Use Tcl ByteArray objects to avoid unwanted character set translation
authorTom Lane
Fri, 31 Oct 2003 00:18:55 +0000 (00:18 +0000)
committerTom Lane
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 @@
 
 
 
@@ -1217,7 +1217,7 @@ pg_lo_creat conn mode
     conn
     
      
-      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.
      
     
@@ -1284,8 +1284,8 @@ pg_lo_open conn loid mo
 
     
      
-      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.
      
     
    
@@ -1354,7 +1354,7 @@ pg_lo_close conn descriptor
     conn
     
      
-      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.
      
     
@@ -1417,7 +1417,7 @@ pg_lo_read conn descriptor 
     conn
     
      
-      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.
      
     
@@ -1458,7 +1458,9 @@ pg_lo_read conn descriptor 
   Return Value
 
   
-   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.
   
  
 
@@ -1499,7 +1501,7 @@ pg_lo_write conn descriptor 
     conn
     
      
-      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.
      
     
@@ -1519,7 +1521,8 @@ pg_lo_write conn descriptor 
     buf
     
      
-      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).
      
     
    
@@ -1528,7 +1531,8 @@ pg_lo_write conn descriptor 
     len
     
      
-      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.
      
     
    
@@ -1539,7 +1543,9 @@ pg_lo_write conn descriptor 
   Return Value
 
   
-   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.
   
  
 
@@ -1580,7 +1586,7 @@ pg_lo_lseek conn descriptor 
     conn
     
      
-      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.
      
     
@@ -1664,7 +1670,7 @@ pg_lo_tell conn descriptor
 
     
      
-      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.
      
     
@@ -1727,7 +1733,7 @@ pg_lo_unlink conn loid
     conn
     
      
-      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.
      
     
@@ -1788,7 +1794,7 @@ pg_lo_import conn filename
     conn
     
      
-      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.
      
     
@@ -1858,7 +1864,7 @@ pg_lo_export conn loid 
     conn
     
      
-      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.
      
     
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;