Kouhei Sutou
null+****@clear*****
Mon Sep 29 21:56:13 JST 2014
Kouhei Sutou 2014-09-29 21:56:13 +0900 (Mon, 29 Sep 2014) New Revision: eec35050ad96cd09ba412ff35b62465a2c3e4d0d https://github.com/ranguba/rroonga/commit/eec35050ad96cd09ba412ff35b62465a2c3e4d0d Message: Use grn_table_update() for renaming by key Fix #22 Modified files: ext/groonga/rb-grn-double-array-trie.c ext/groonga/rb-grn-object.c ext/groonga/rb-grn.h Modified: ext/groonga/rb-grn-double-array-trie.c (+111 -12) =================================================================== --- ext/groonga/rb-grn-double-array-trie.c 2014-09-29 21:08:08 +0900 (0e2099a) +++ ext/groonga/rb-grn-double-array-trie.c 2014-09-29 21:56:13 +0900 (b596395) @@ -2,7 +2,7 @@ /* vim: set sts=4 sw=4 ts=8 noet: */ /* Copyright (C) 2014 Masafumi Yokoyama <myokoym �� gmail.com> - Copyright (C) 2011 Kouhei Sutou <kou �� clear-code.com> + Copyright (C) 2011-2014 Kouhei Sutou <kou �� clear-code.com> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "rb-grn.h" -#define SELF(object) ((RbGrnTableKeySupport *)DATA_PTR(object)) +#define SELF(object) ((RbGrnDoubleArrayTrie *)DATA_PTR(object)) VALUE rb_cGrnDoubleArrayTrie; @@ -43,6 +43,74 @@ VALUE rb_cGrnDoubleArrayTrie; * {Groonga::PatriciaTrie} . It also supports cursor API. */ +static void +rb_grn_double_array_trie_deconstruct (RbGrnDoubleArrayTrie *rb_grn_double_array_trie, + grn_obj **double_array_trie, + grn_ctx **context, + grn_obj **key, + grn_obj **new_key, + grn_id *domain_id, + grn_obj **domain, + grn_obj **value, + grn_id *range_id, + grn_obj **range, + VALUE *columns) +{ + RbGrnTableKeySupport *rb_grn_table_key_support; + + rb_grn_table_key_support = + RB_GRN_TABLE_KEY_SUPPORT(rb_grn_double_array_trie); + + rb_grn_table_key_support_deconstruct(rb_grn_table_key_support, + double_array_trie, context, + key, domain_id, domain, + value, range_id, range, + columns); + + if (new_key) + *new_key = rb_grn_double_array_trie->new_key; +} + +void +rb_grn_double_array_trie_finalizer (grn_ctx *context, + grn_obj *grn_object, + RbGrnDoubleArrayTrie *rb_grn_double_array_trie) +{ + RbGrnTableKeySupport *rb_grn_table_key_support; + + if (!context) + return; + + if (rb_grn_double_array_trie->new_key) + grn_obj_unlink(context, rb_grn_double_array_trie->new_key); + rb_grn_double_array_trie->new_key = NULL; + + rb_grn_table_key_support = + RB_GRN_TABLE_KEY_SUPPORT(rb_grn_double_array_trie); + rb_grn_table_key_support_finalizer(context, grn_object, + rb_grn_table_key_support); +} + +void +rb_grn_double_array_trie_bind (RbGrnDoubleArrayTrie *rb_grn_double_array_trie, + grn_ctx *context, + grn_obj *double_array_trie) +{ + RbGrnObject *rb_grn_object; + RbGrnTableKeySupport *rb_grn_table_key_support; + + rb_grn_object = RB_GRN_OBJECT(rb_grn_double_array_trie); + + rb_grn_table_key_support = + RB_GRN_TABLE_KEY_SUPPORT(rb_grn_double_array_trie); + rb_grn_table_key_support_bind(rb_grn_table_key_support, + context, + double_array_trie); + + rb_grn_double_array_trie->new_key = + grn_obj_open(context, GRN_BULK, 0, rb_grn_object->domain_id); +} + /* * It creates a table that manages records by double array trie. * ブロックを指定すると、そのブロックに生成したテーブルが渡さ @@ -308,8 +376,8 @@ rb_grn_double_array_trie_search (int argc, VALUE *argv, VALUE self) grn_bool search_options_is_set = GRN_FALSE; VALUE rb_key, options, rb_result, rb_operator, rb_type; - rb_grn_table_key_support_deconstruct(SELF(self), &table, &context, - &key, &domain_id, &domain, + rb_grn_double_array_trie_deconstruct(SELF(self), &table, &context, + &key, NULL, &domain_id, &domain, NULL, NULL, NULL, NULL); @@ -505,8 +573,8 @@ rb_grn_double_array_trie_update_by_id (VALUE self, VALUE rb_id, VALUE rb_new_key grn_obj *new_key, *domain; grn_rc rc; - rb_grn_table_key_support_deconstruct(SELF(self), &table, &context, - &new_key, &domain_id, &domain, + rb_grn_double_array_trie_deconstruct(SELF(self), &table, &context, + NULL, &new_key, &domain_id, &domain, NULL, NULL, NULL, NULL); @@ -519,6 +587,35 @@ rb_grn_double_array_trie_update_by_id (VALUE self, VALUE rb_id, VALUE rb_new_key return Qnil; } +static VALUE +rb_grn_double_array_trie_update_by_key (VALUE self, + VALUE rb_current_key, + VALUE rb_new_key) +{ + grn_ctx *context; + grn_obj *table; + grn_id domain_id; + grn_obj *current_key, *new_key, *domain; + grn_rc rc; + + rb_grn_double_array_trie_deconstruct(SELF(self), &table, &context, + ¤t_key, &new_key, + &domain_id, &domain, + NULL, NULL, NULL, + NULL); + + RVAL2GRNKEY(rb_current_key, context, current_key, domain_id, domain, self); + RVAL2GRNKEY(rb_new_key, context, new_key, domain_id, domain, self); + rc = grn_table_update(context, table, + GRN_BULK_HEAD(current_key), + GRN_BULK_VSIZE(current_key), + GRN_BULK_HEAD(new_key), + GRN_BULK_VSIZE(new_key)); + rb_grn_rc_check(rc, self); + + return Qnil; +} + /* * Renames key of a record. * @@ -530,9 +627,8 @@ rb_grn_double_array_trie_update_by_id (VALUE self, VALUE rb_id, VALUE rb_new_key static VALUE rb_grn_double_array_trie_update (int argc, VALUE *argv, VALUE self) { - grn_id id; VALUE rb_current_key_or_id, rb_new_key, rb_options; - VALUE rb_option_id, rb_id; + VALUE rb_option_id; rb_scan_args(argc, argv, "21", &rb_current_key_or_id, &rb_new_key, &rb_options); @@ -540,13 +636,16 @@ rb_grn_double_array_trie_update (int argc, VALUE *argv, VALUE self) "id", &rb_option_id, NULL); if (RVAL2CBOOL(rb_option_id)) { + VALUE rb_id; rb_id = rb_current_key_or_id; return rb_grn_double_array_trie_update_by_id(self, rb_id, rb_new_key); + } else { + VALUE rb_current_key; + rb_current_key = rb_current_key_or_id; + return rb_grn_double_array_trie_update_by_key(self, + rb_current_key, + rb_new_key); } - - id = rb_grn_table_key_support_get(self, rb_current_key_or_id); - rb_id = UINT2NUM(id); - return rb_grn_double_array_trie_update_by_id(self, rb_id, rb_new_key); } void Modified: ext/groonga/rb-grn-object.c (+10 -1) =================================================================== --- ext/groonga/rb-grn-object.c 2014-09-29 21:08:08 +0900 (a1a157d) +++ ext/groonga/rb-grn-object.c 2014-09-29 21:56:13 +0900 (0bf0927) @@ -135,10 +135,13 @@ rb_grn_object_run_finalizer (grn_ctx *context, grn_obj *grn_object, break; case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: - case GRN_TABLE_DAT_KEY: rb_grn_table_key_support_finalizer(context, grn_object, RB_GRN_TABLE_KEY_SUPPORT(rb_grn_object)); break; + case GRN_TABLE_DAT_KEY: + rb_grn_double_array_trie_finalizer(context, grn_object, + RB_GRN_DOUBLE_ARRAY_TRIE(rb_grn_object)); + break; case GRN_TABLE_NO_KEY: rb_grn_table_finalizer(context, grn_object, RB_GRN_TABLE(rb_grn_object)); @@ -441,6 +444,12 @@ rb_grn_object_assign (VALUE klass, VALUE self, VALUE rb_context, rb_grn_object = ALLOC(RbGrnObject); rb_grn_object_bind_common(klass, self, rb_context, rb_grn_object, context, object); + } else if (klass == rb_cGrnDoubleArrayTrie) { + rb_grn_object = ALLOC(RbGrnDoubleArrayTrie); + rb_grn_object_bind_common(klass, self, rb_context, rb_grn_object, + context, object); + rb_grn_double_array_trie_bind(RB_GRN_DOUBLE_ARRAY_TRIE(rb_grn_object), + context, object); } else if (RVAL2CBOOL(rb_obj_is_kind_of(self, rb_mGrnTableKeySupport))) { rb_grn_object = ALLOC(RbGrnTableKeySupport); rb_grn_object_bind_common(klass, self, rb_context, rb_grn_object, Modified: ext/groonga/rb-grn.h (+15 -0) =================================================================== --- ext/groonga/rb-grn.h 2014-09-29 21:08:08 +0900 (4675850) +++ ext/groonga/rb-grn.h 2014-09-29 21:56:13 +0900 (a07795c) @@ -104,6 +104,7 @@ RB_GRN_BEGIN_DECLS #define RB_GRN_NAMED_OBJECT(object) ((RbGrnNamedObject *)(object)) #define RB_GRN_TABLE(object) ((RbGrnTable *)(object)) #define RB_GRN_TABLE_KEY_SUPPORT(object) ((RbGrnTableKeySupport *)(object)) +#define RB_GRN_DOUBLE_ARRAY_TRIE(object) ((RbGrnDoubleArrayTrie *)(object)) #define RB_GRN_TABLE_CURSOR(object) ((RbGrnTableCursort *)(object)) #define RB_GRN_COLUMN(object) ((RbGrnColumn *)(object)) #define RB_GRN_VARIABLE_SIZE_COLUMN(object) ((RbGrnVariableSizeColumn *)(object)) @@ -163,6 +164,13 @@ struct _RbGrnTableKeySupport grn_obj *key; }; +typedef struct _RbGrnDoubleArrayTrie RbGrnDoubleArrayTrie; +struct _RbGrnDoubleArrayTrie +{ + RbGrnTableKeySupport parent; + grn_obj *new_key; +}; + typedef struct _RbGrnColumn RbGrnColumn; struct _RbGrnColumn { @@ -496,6 +504,13 @@ void rb_grn_table_key_support_deconstruct (RbGrnTableKeySupport *rb_gr grn_id rb_grn_table_key_support_get (VALUE self, VALUE rb_key); +void rb_grn_double_array_trie_bind (RbGrnDoubleArrayTrie *rb_grn_double_array_trie, + grn_ctx *context, + grn_obj *double_array_trie); +void rb_grn_double_array_trie_finalizer (grn_ctx *context, + grn_obj *grn_object, + RbGrnDoubleArrayTrie *rb_grn_double_array_trie); + void rb_grn_column_bind (RbGrnColumn *rb_grn_column, grn_ctx *context, grn_obj *column); -------------- next part -------------- HTML����������������������������... 다운로드