/*
 * call-seq:
 *    lrg.read( [length] )
 *
 * Attempts to read _length_ bytes from large object.
 * If no _length_ is given, reads all data.
 */
static VALUE
pglarge_read(argc, argv, obj)
    int argc;
    VALUE *argv;
    VALUE obj;
{
        int len;
        PGlarge *pglarge = get_pglarge(obj);
        VALUE length;
        char *buffer;

        rb_scan_args(argc, argv, "01", &length);
        if (NIL_P(length)) {
                return loread_all(obj);
        }

        len = NUM2INT(length);
        if (len < 0){
                rb_raise(rb_ePGError,"nagative length %d given", len);
        }
        buffer = ALLOCA_N(char, len);

        if((len = lo_read(pglarge->pgconn, pglarge->lo_fd, buffer, len)) < 0) {
                rb_raise(rb_ePGError, "error while reading");
        }
        if (len == 0) return Qnil;
        return rb_str_new(buffer,len);
}