/*
 * 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( argc, argv, self )
        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;
}