/*
 * call-seq:
 *    res[ n ] -> Hash
 *
 * Returns tuple _n_ as a hash. 
 */
static VALUE
pgresult_aref(VALUE self, VALUE index)
{
    PGresult *result = get_pgresult(self);
    int tuple_num = NUM2INT(index);
    int field_num;
    VALUE fname,val;
    VALUE tuple;

    if(tuple_num < 0 || tuple_num >= PQntuples(result))
        rb_raise(rb_eIndexError, "Index %d is out of range", tuple_num);
    tuple = rb_hash_new();
    for(field_num = 0; field_num < PQnfields(result); field_num++) {
        fname = rb_tainted_str_new2(PQfname(result,field_num));
        ASSOCIATE_INDEX(fname, self);
        if(PQgetisnull(result, tuple_num, field_num)) {
            rb_hash_aset(tuple, fname, Qnil);
        }
        else {
            val = rb_tainted_str_new(PQgetvalue(result, tuple_num, field_num),
                PQgetlength(result, tuple_num, field_num));

            /* associate client encoding for text format only */
            if(0 == PQfformat(result, field_num)) {
                fflush( stdout );
                ASSOCIATE_INDEX(val, self);
            } else {
#ifdef M17N_SUPPORTED
                fflush( stdout );
                rb_enc_associate(val, rb_ascii8bit_encoding());
#endif
            }
            rb_hash_aset(tuple, fname, val);
        }
    }
    return tuple;
}