/* * 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; }