ext/groonga/rb-grn-accessor.c in rroonga-1.1.0 vs ext/groonga/rb-grn-accessor.c in rroonga-1.2.0

- old
+ new

@@ -16,11 +16,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "rb-grn.h" -#define SELF(object) (RVAL2GRNACCESSOR(object)) +#define SELF(object) ((RbGrnAccessor *)DATA_PTR(object)) VALUE rb_cGrnAccessor; grn_obj * rb_grn_accessor_from_ruby_object (VALUE object) @@ -37,16 +37,79 @@ grn_bool owner) { return GRNOBJECT2RVAL(rb_cGrnAccessor, context, table, owner); } +void +rb_grn_accessor_bind (RbGrnAccessor *rb_accessor, + grn_ctx *context, grn_obj *accessor) +{ + RbGrnObject *rb_grn_object; + RbGrnNamedObject *rb_grn_named_object; + char name[GRN_TABLE_MAX_KEY_SIZE]; + int name_size; + + rb_grn_object = RB_GRN_OBJECT(rb_accessor); + rb_grn_named_object = RB_GRN_NAMED_OBJECT(rb_accessor); + rb_grn_named_object_bind(rb_grn_named_object, context, accessor); + + name_size = grn_column_name(context, accessor, name, sizeof(name)); + if (name_size > 0) { + rb_grn_named_object_set_name(rb_grn_named_object, name, name_size); + } + + rb_accessor->value = grn_obj_open(context, GRN_BULK, 0, + rb_grn_object->range_id); +} + + +void +rb_grn_accessor_finalizer (grn_ctx *context, grn_obj *grn_object, + RbGrnAccessor *rb_accessor) +{ + rb_grn_named_object_finalizer(context, grn_object, + RB_GRN_NAMED_OBJECT(rb_accessor)); + if (context && rb_accessor->value) + grn_obj_unlink(context, rb_accessor->value); + rb_accessor->value = NULL; +} + /* + * call-seq: + * accessor.local_name + * + * アクセサ名を返す。 + * + * items = Groonga::Array.create(:name => "Items") + * id = items.column("_id") + * id.name # => nil + * id.local_name # => "_id" + */ +static VALUE +rb_grn_accessor_get_local_name (VALUE self) +{ + RbGrnAccessor *rb_grn_accessor; + RbGrnNamedObject *rb_grn_named_object; + + rb_grn_accessor = SELF(self); + rb_grn_named_object = RB_GRN_NAMED_OBJECT(rb_grn_accessor); + if (rb_grn_named_object->name_size == 0) + return Qnil; + + return rb_str_new(rb_grn_named_object->name, + rb_grn_named_object->name_size); +} + +/* * Document-class: Groonga::Accessor < Groonga::Object * * キー、値、スコアなど種々の値へのアクセスをカプセル化した * オブジェクト。Groonga::Table#columnで取得できる。 */ void rb_grn_init_accessor (VALUE mGrn) { rb_cGrnAccessor = rb_define_class_under(mGrn, "Accessor", rb_cGrnObject); + + rb_define_method(rb_cGrnAccessor, "local_name", + rb_grn_accessor_get_local_name, 0); }