/*
 * 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 str;
  VALUE length;
  
  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);
  }
  str = rb_tainted_str_new(0,len);

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