[Groonga-commit] ranguba/rroonga at eec3505 [master] Use grn_table_update() for renaming by key

Back to archive index

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,
+                                         &current_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����������������������������...
다운로드 



More information about the Groonga-commit mailing list
Back to archive index