/*
 * call-seq:
 *    res.each{ |tuple| ... }
 *
 * Invokes the block for each tuple (row) in the result.
 *
 * Equivalent to <tt>res.result.each{ |tuple| ... }</tt>.
 */
static VALUE
pgresult_each(self)
    VALUE self;
{
    int i, j;

    PGresult *result = get_pgresult(self);
    int nt = PQntuples(result);
    int nf = PQnfields(result);
    VALUE fields[1] = { rb_ary_new2(nf) };

    for (i = 0; i < nf; i++)
        rb_ary_push(fields[0], rb_tainted_str_new2(PQfname(result, i)));

    for (i=0; i<nt; i++) {
        VALUE row = rb_funcall2(rb_cPGrow, rb_intern("new"), 1, fields);
        for (j=0; j<nf; j++) {
            rb_ary_store(row, j, fetch_pgresult(result, i, j));
        }
        rb_yield(row);
    }

    return self;
}