From ede9b68e03ec9288e85b2847b27793782c0cf5da Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 31 Oct 2003 00:18:55 +0000 Subject: [PATCH] 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. --- doc/src/sgml/libpgtcl.sgml | 38 +++++++++++++++++------------ src/interfaces/libpgtcl/pgtclCmds.c | 24 +++++++++++------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/doc/src/sgml/libpgtcl.sgml b/doc/src/sgml/libpgtcl.sgml index c0ffddebee..f3f0112c4e 100644 --- a/doc/src/sgml/libpgtcl.sgml +++ b/doc/src/sgml/libpgtcl.sgml @@ -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. diff --git a/src/interfaces/libpgtcl/pgtclCmds.c b/src/interfaces/libpgtcl/pgtclCmds.c index 657a59fe89..dad51c4dcf 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; -- 2.40.0