Beispiel #1
0
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;

}
Beispiel #2
0
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;
}