void* unwrapTypedPtr(const VALUE &obj, rb_data_type_t* rbdata) { if(NIL_P(obj)) return NULL; if(!rbdata) { rb_raise(rb_eTypeError,"%" PRIsVALUE " unknown datatype", RB_OBJ_CLASSNAME(obj)); return NULL; } const rb_data_type_t* rbdata_obj = RTYPEDDATA_TYPE(obj); if(rbdata_obj != rbdata) { if(!rb_typeddata_inherited_p(rbdata_obj, rbdata)) { rb_warn("%s is not a %s but inherit from %s", rbdata_obj->wrap_struct_name, rbdata->wrap_struct_name, rbdata_obj->parent->wrap_struct_name ); } } void* data = Check_TypedStruct(obj, rbdata); if(!data) { rb_raise( rb_eRuntimeError, "destroyed object of %" PRIsVALUE, RB_OBJ_CLASSNAME(obj) ); return NULL; } return data; }
void *oci8_check_typeddata(VALUE obj, const oci8_handle_data_type_t *data_type, int error_if_closed) { #ifdef HAVE_RB_DATA_TYPE_T_FUNCTION oci8_base_t *hp = Check_TypedStruct(obj, &data_type->rb_data_type); #else oci8_base_t *hp; const char *expected_type_name = data_type->rb_data_type.wrap_struct_name; const rb_data_type_t *rb_data_type; const rb_data_type_t *expected_rb_data_type = &data_type->rb_data_type; if (TYPE(obj) != T_DATA || !rb_obj_is_kind_of(obj, oci8_cOCIHandle)) { rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", rb_obj_classname(obj), expected_type_name); } hp = DATA_PTR(obj); rb_data_type = &hp->data_type->rb_data_type; while (rb_data_type != expected_rb_data_type) { if (rb_data_type == NULL) { rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", rb_obj_classname(obj), expected_type_name); } rb_data_type = rb_data_type->parent; } #endif if (error_if_closed && hp->closed) { rb_raise(eOCIException, "%s was already closed.", rb_obj_classname(obj)); } return hp; }