static VALUE rb_grn_uvector_from_ruby_object_body (VALUE user_data) { UVectorFromRubyData *data = (UVectorFromRubyData *)user_data; grn_obj *domain; domain = data->domain; switch (domain->header.type) { case GRN_TYPE: rb_grn_uvector_from_ruby_object_type(data); break; case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: rb_grn_uvector_from_ruby_object_reference(data); break; default: rb_raise(rb_eTypeError, "can't convert to unknown domain uvector: %s(%#x): <%s>", rb_grn_inspect_type(domain->header.type), domain->header.type, rb_grn_inspect(data->related_object)); break; } return Qnil; }
VALUE rb_grn_obj_to_ruby_object (VALUE klass, grn_ctx *context, grn_obj *obj, VALUE related_object) { if (!obj) return Qnil; /* if (NIL_P(klass)) */ /* klass = GRNOBJECT2RCLASS(obj); */ switch (obj->header.type) { case GRN_VOID: if (GRN_BULK_VSIZE(obj) > 0) return rb_str_new(GRN_BULK_HEAD(obj), GRN_BULK_VSIZE(obj)); else return Qnil; break; case GRN_BULK: return GRNBULK2RVAL(context, obj, NULL, related_object); break; /* case GRN_PTR: */ /* case GRN_UVECTOR: */ /* case GRN_PVECTOR: */ case GRN_VECTOR: return GRNVECTOR2RVAL(context, obj); break; /* case GRN_MSG: */ /* case GRN_QUERY: */ /* case GRN_ACCESSOR: */ /* case GRN_SNIP: */ /* case GRN_PATSNIP: */ /* case GRN_CURSOR_TABLE_HASH_KEY: */ /* case GRN_CURSOR_TABLE_PAT_KEY: */ /* case GRN_CURSOR_TABLE_NO_KEY: */ /* case GRN_CURSOR_COLUMN_INDEX: */ /* case GRN_TYPE: */ /* case GRN_PROC: */ /* case GRN_EXPR: */ /* case GRN_TABLE_HASH_KEY: */ /* case GRN_TABLE_PAT_KEY: */ /* case GRN_TABLE_DAT_KEY: */ /* case GRN_TABLE_NO_KEY: */ /* case GRN_DB: */ /* case GRN_COLUMN_FIX_SIZE: */ /* case GRN_COLUMN_VAR_SIZE: */ /* case GRN_COLUMN_INDEX: */ default: rb_raise(rb_eTypeError, "unsupported groonga object: %s(%#x): <%s>", rb_grn_inspect_type(obj->header.type), obj->header.type, rb_grn_inspect(related_object)); break; } return Qnil; }
VALUE rb_grn_value_to_ruby_object (grn_ctx *context, grn_obj *value, grn_obj *range, VALUE related_object) { if (!value) return Qnil; switch (value->header.type) { case GRN_VOID: return Qnil; break; case GRN_BULK: if (GRN_BULK_EMPTYP(value)) return Qnil; if (value->header.domain == GRN_ID_NIL && range) value->header.domain = grn_obj_id(context, range); return GRNBULK2RVAL(context, value, range, related_object); break; case GRN_UVECTOR: { VALUE rb_value, rb_range = Qnil; grn_id *uvector, *uvector_end; rb_value = rb_ary_new(); if (range) rb_range = GRNTABLE2RVAL(context, range, GRN_FALSE); uvector = (grn_id *)GRN_BULK_HEAD(value); uvector_end = (grn_id *)GRN_BULK_CURR(value); for (; uvector < uvector_end; uvector++) { VALUE record = Qnil; if (*uvector != GRN_ID_NIL) record = rb_grn_record_new(rb_range, *uvector, Qnil); rb_ary_push(rb_value, record); } return rb_value; } break; case GRN_VECTOR: return GRNVECTOR2RVAL(context, value); break; default: rb_raise(rb_eGrnError, "unsupported value type: %s(%#x): %s", rb_grn_inspect_type(value->header.type), value->header.type, rb_grn_inspect(related_object)); break; } if (!range) return GRNOBJECT2RVAL(Qnil, context, value, GRN_FALSE); return Qnil; }
VALUE rb_grn_value_to_ruby_object (grn_ctx *context, grn_obj *value, grn_obj *range, VALUE related_object) { if (!value) return Qnil; switch (value->header.type) { case GRN_VOID: return Qnil; break; case GRN_BULK: if (GRN_BULK_EMPTYP(value)) return Qnil; if (value->header.domain == GRN_ID_NIL && range) value->header.domain = grn_obj_id(context, range); return GRNBULK2RVAL(context, value, range, related_object); break; case GRN_UVECTOR: return GRNUVECTOR2RVAL(context, value, range, related_object); break; case GRN_VECTOR: return GRNVECTOR2RVAL(context, value); break; default: rb_raise(rb_eGrnError, "unsupported value type: %s(%#x): %s", rb_grn_inspect_type(value->header.type), value->header.type, rb_grn_inspect(related_object)); break; } if (!range) return GRNOBJECT2RVAL(Qnil, context, value, GRN_FALSE); return Qnil; }
VALUE rb_grn_uvector_to_ruby_object (grn_ctx *context, grn_obj *uvector, grn_obj *range, VALUE related_object) { VALUE array = Qnil; if (!uvector) return Qnil; if (!range) { rb_raise(rb_eTypeError, "unknown range uvector can't be converted: <%s>", rb_grn_inspect(related_object)); } switch (range->header.type) { case GRN_TYPE: { const char *current, *end; grn_id range_id; grn_obj value; int value_size; value_size = grn_obj_get_range(context, range); array = rb_ary_new(); current = GRN_BULK_HEAD(uvector); end = GRN_BULK_CURR(uvector); range_id = grn_obj_id(context, range); GRN_OBJ_INIT(&value, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, range_id); while (current < end) { VALUE rb_value; GRN_TEXT_SET(context, &value, current, value_size); rb_value = GRNBULK2RVAL(context, &value, range, related_object); rb_ary_push(array, rb_value); current += value_size; } GRN_OBJ_FIN(context, &value); break; } case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: { grn_id *current, *end; VALUE rb_range = Qnil; array = rb_ary_new(); rb_range = GRNTABLE2RVAL(context, range, GRN_FALSE); current = (grn_id *)GRN_BULK_HEAD(uvector); end = (grn_id *)GRN_BULK_CURR(uvector); while (current < end) { VALUE record = Qnil; if (*current != GRN_ID_NIL) { record = rb_grn_record_new(rb_range, *current, Qnil); } rb_ary_push(array, record); current++; } break; } default: rb_raise(rb_eTypeError, "unknown range uvector can't be converted: %s(%#x): <%s>", rb_grn_inspect_type(range->header.type), range->header.type, rb_grn_inspect(related_object)); break; } return array; }