diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-10-31 00:18:55 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-10-31 00:18:55 +0000 |
commit | ede9b68e03ec9288e85b2847b27793782c0cf5da (patch) | |
tree | 333dc1665eae857649e2e649936335db71ac7364 /src | |
parent | e84487f67a0d216f3db87b2558f1edd322a09e48 (diff) | |
download | postgresql-ede9b68e03ec9288e85b2847b27793782c0cf5da.tar.gz postgresql-ede9b68e03ec9288e85b2847b27793782c0cf5da.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/libpgtcl/pgtclCmds.c | 24 |
1 files changed, 15 insertions, 9 deletions
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; |