/*
 * call-seq:
 *    conn.lo_read( lo_desc, len ) -> String
 *
 * Attempts to read _len_ bytes from large object _lo_desc_,
 * returns resulting data.
 */
static VALUE
pgconn_loread(VALUE self, VALUE in_lo_desc, VALUE in_len)
{
        int ret;
  PGconn *conn = get_pgconn(self);
        int len = NUM2INT(in_len);
        int lo_desc = NUM2INT(in_lo_desc);
        VALUE str;
        char *buffer;

  buffer = ALLOC_N(char, len);
        if(buffer == NULL)
                rb_raise(rb_eNoMemError, "ALLOC failed!");

        if (len < 0){
                rb_raise(rb_ePGError,"nagative length %d given", len);
        }

        if((ret = lo_read(conn, lo_desc, buffer, len)) < 0)
                rb_raise(rb_ePGError, "lo_read failed");

        if(ret == 0) {
                xfree(buffer);
                return Qnil;
        }

        str = rb_tainted_str_new(buffer, len);
        xfree(buffer);

        return str;
}