Listing 1
static VALUE Record_subscript(VALUE self, VALUE index) { VALUE ret; switch(rb_type(index)) { case T_STRING: ret = Record_subscript_string(self, StringValuePtr(index), 1); break; case T_FIXNUM: ret = Record_subscript_fixnum(self, FIX2INT(index), 1); break; default: rb_raise(rb_eTypeError, "field index / name must be integer or string"); break; } return ret; } static VALUE Record_subscript_string(VALUE self, char const *index, int bThrowOnFail) { ORJRecord const *record = Record_get_record_(self); ORJFieldA const *field = ORJ_Record_FindFieldByNameA(record, index, NULL); if(NULL == field) { if(bThrowOnFail) { rb_raise(cFieldNameError, "record does not contain field named: %s", index); } return Qnil; } else { return rb_str_from_ORJStringA(&field->value); } } static VALUE Record_subscript_fixnum(VALUE self, int index, int bThrowOnFail) { ORJRecord const *record = Record_get_record_(self); size_t cFields = ORJ_Record_GetNumFieldsA(record); if( 0 <= index && index < cFields) { VALUE __database__ = rb_iv_get(self, "@__database__"); return Field_create_(__database__, self, &record->fields[index]); } else { if(bThrowOnFail) { rb_raise(rb_eIndexError, "record does not contain field at index: %d", index); } return Qnil; } }