/*
* call-seq:
* conn.get_copy_data( [ async = false ] ) -> String
*
* Return a string containing one row of data, +nil+
* if the copy is done, or +false+ if the call would
* block (only possible if _async_ is true).
*
*/
static VALUE
pgconn_get_copy_data(int argc, VALUE *argv, VALUE self )
{
VALUE async_in;
VALUE error;
VALUE result_str;
int ret;
int async;
char *buffer;
PGconn *conn = get_pgconn(self);
if (rb_scan_args(argc, argv, "01", &async_in) == 0)
async = 0;
else
async = (async_in == Qfalse || async_in == Qnil) ? 0 : 1;
ret = PQgetCopyData(conn, &buffer, async);
if(ret == -2) { // error
error = rb_exc_new2(rb_ePGError, PQerrorMessage(conn));
rb_iv_set(error, "@connection", self);
rb_exc_raise(error);
}
if(ret == -1) { // No data left
return Qnil;
}
if(ret == 0) { // would block
return Qfalse;
}
result_str = rb_tainted_str_new(buffer, ret);
PQfreemem(buffer);
return result_str;
}