/*
 * call-seq:
 *    res.values -> Array
 *
 * Returns all tuples as an array of arrays.
 */
static VALUE
pgresult_values(VALUE self, VALUE index)
{
        PGresult* result = (PGresult*) get_pgresult(self);
        int row;
        int field;
        int num_rows = PQntuples(result);
        int num_fields = PQnfields(result);
        VALUE ary = rb_ary_new2(num_rows);

        for ( row = 0; row < num_rows; row++ ) {
                /* create new row */
                VALUE new_row = rb_ary_new2(num_fields);

                /* add to return array */
                rb_ary_store( ary, row, new_row );

                /* populate it */
                for ( field = 0; field < num_fields; field++ ) {
                        if ( PQgetisnull(result, row, field) ) {
                                rb_ary_store( new_row, field, Qnil );
                        }
                        else {
                                VALUE val = rb_tainted_str_new( PQgetvalue(result, row, field), 
                                                                PQgetlength(result, row, field) );

                                /* associate client encoding for text format only */
                                if ( 0 == PQfformat(result, field) ) {
                                        ASSOCIATE_INDEX( val, self );
                                } else {
#ifdef M17N_SUPPORTED
                                        rb_enc_associate( val, rb_ascii8bit_encoding() );
#endif
                                }

                                rb_ary_store( new_row, field, val );
                        }
                }
        }
        return ary;
}