/*
* call-seq:
* conn.lo_open( oid, [mode] ) -> PGlarge
*
* Open a large object of _oid_. Returns a PGlarge instance on success.
* The _mode_ argument specifies the mode for the opened large object,
* which is either +INV_READ+, or +INV_WRITE+.
* * If _mode_ On failure, it raises a PGError exception.
* * If _mode_ is omitted, the default is +INV_READ+.
*/
static VALUE
pgconn_loopen(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
{
Oid lo_oid;
int fd, mode;
VALUE nmode, objid;
PGconn *conn = get_pgconn(obj);
switch (rb_scan_args(argc, argv, "02", &objid, &nmode)) {
case 1:
lo_oid = NUM2INT(objid);
mode = INV_READ;
break;
case 2:
lo_oid = NUM2INT(objid);
mode = FIX2INT(nmode);
break;
default:
mode = INV_READ;
lo_oid = lo_creat(conn, mode);
if (lo_oid == 0){
rb_raise(rb_ePGError, "can't creat large object");
}
}
if((fd = lo_open(conn, lo_oid, mode)) < 0) {
rb_raise(rb_ePGError, "can't open large object");
}
return pglarge_new(conn, lo_oid, fd);
}