[Groonga-commit] groonga/groonga at ebf29f4 [master] mrb: add Groonga::Indexable#indexes

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Jan 25 19:07:29 JST 2016


Kouhei Sutou	2016-01-25 19:07:29 +0900 (Mon, 25 Jan 2016)

  New Revision: ebf29f4f618b5ed6d702a87e98926d8fb2c0723c
  https://github.com/groonga/groonga/commit/ebf29f4f618b5ed6d702a87e98926d8fb2c0723c

  Message:
    mrb: add Groonga::Indexable#indexes

  Modified files:
    lib/mrb/mrb_indexable.c

  Modified: lib/mrb/mrb_indexable.c (+49 -0)
===================================================================
--- lib/mrb/mrb_indexable.c    2016-01-25 18:37:57 +0900 (5c2a415)
+++ lib/mrb/mrb_indexable.c    2016-01-25 19:07:29 +0900 (b1afa24)
@@ -20,6 +20,7 @@
 
 #ifdef GRN_WITH_MRUBY
 #include <mruby.h>
+#include <mruby/array.h>
 #include <mruby/data.h>
 
 #include "mrb_ctx.h"
@@ -60,6 +61,52 @@ indexable_find_index(mrb_state *mrb, mrb_value self)
   }
 }
 
+static mrb_value
+indexable_indexes(mrb_state *mrb, mrb_value self)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  grn_obj *object;
+  grn_index_datum index_datum;
+  grn_index_datum *index_data;
+  int i, n_index_data;
+  mrb_value mrb_indexes;
+
+  object = DATA_PTR(self);
+  n_index_data = grn_column_get_all_index_data(ctx, object, &index_datum, 1);
+  if (n_index_data == 0) {
+    return mrb_ary_new(mrb);
+  }
+
+  if (n_index_data == 1) {
+    index_data = &index_datum;
+  } else {
+    index_data = GRN_MALLOCN(grn_index_datum, n_index_data);
+    n_index_data = grn_column_get_all_index_data(ctx,
+                                                 object,
+                                                 index_data,
+                                                 n_index_data);
+  }
+
+  mrb_indexes = mrb_ary_new_capa(mrb, n_index_data);
+  for (i = 0; i < n_index_data; i++) {
+    grn_mrb_data *data;
+    struct RClass *klass;
+    mrb_value args[2];
+
+    data = &(ctx->impl->mrb);
+    klass = mrb_class_get_under(mrb, data->module, "IndexInfo");
+    args[0] = grn_mrb_value_from_grn_obj(mrb, index_data[i].index);
+    args[1] = mrb_fixnum_value(index_data[i].section);
+    mrb_ary_push(mrb, mrb_indexes, mrb_obj_new(mrb, klass, 2, args));
+  }
+
+  if (index_data != &index_datum) {
+    GRN_FREE(index_data);
+  }
+
+  return mrb_indexes;
+}
+
 void
 grn_mrb_indexable_init(grn_ctx *ctx)
 {
@@ -71,5 +118,7 @@ grn_mrb_indexable_init(grn_ctx *ctx)
 
   mrb_define_method(mrb, module, "find_index",
                     indexable_find_index, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, module, "indexes",
+                    indexable_indexes, MRB_ARGS_NONE());
 }
 #endif
-------------- next part --------------
HTML����������������������������...
Download 



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