[Groonga-commit] groonga/groonga at 2f13bd9 [master] mrb: bind new experimental command APIs

アーカイブの一覧に戻る

Kouhei Sutou null+****@clear*****
Mon Jan 5 00:51:20 JST 2015


Kouhei Sutou	2015-01-05 00:51:20 +0900 (Mon, 05 Jan 2015)

  New Revision: 2f13bd99725d7ea45f8e10ce04dd78a9479b4fdc
  https://github.com/groonga/groonga/commit/2f13bd99725d7ea45f8e10ce04dd78a9479b4fdc

  Message:
    mrb: bind new experimental command APIs

  Added files:
    lib/mrb/mrb_command.c
    lib/mrb/mrb_command.h
    lib/mrb/mrb_command_input.c
    lib/mrb/mrb_command_input.h
    lib/mrb/scripts/command.rb
  Modified files:
    lib/ctx_impl_mrb.c
    lib/mrb/scripts/initialize/post.rb
    lib/mrb/sources.am

  Modified: lib/ctx_impl_mrb.c (+4 -0)
===================================================================
--- lib/ctx_impl_mrb.c    2015-01-05 00:40:31 +0900 (85e164a)
+++ lib/ctx_impl_mrb.c    2015-01-05 00:51:20 +0900 (80d1bdd)
@@ -44,6 +44,8 @@
 #include "mrb/mrb_expr.h"
 #include "mrb/mrb_accessor.h"
 #include "mrb/mrb_procedure.h"
+#include "mrb/mrb_command.h"
+#include "mrb/mrb_command_input.h"
 #include "mrb/mrb_table_cursor.h"
 #include "mrb/mrb_table_cursor_flags.h"
 
@@ -119,6 +121,8 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx)
   grn_mrb_expr_init(ctx);
   grn_mrb_accessor_init(ctx);
   grn_mrb_procedure_init(ctx);
+  grn_mrb_command_init(ctx);
+  grn_mrb_command_input_init(ctx);
   grn_mrb_table_cursor_init(ctx);
   grn_mrb_table_cursor_flags_init(ctx);
 

  Added: lib/mrb/mrb_command.c (+180 -0) 100644
===================================================================
--- /dev/null
+++ lib/mrb/mrb_command.c    2015-01-05 00:51:20 +0900 (f0a49d2)
@@ -0,0 +1,180 @@
+/* -*- c-basic-offset: 2 -*- */
+/*
+  Copyright(C) 2015 Brazil
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License version 2.1 as published by the Free Software Foundation.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include "../grn_ctx_impl.h"
+#include <groonga/command.h>
+
+#ifdef GRN_WITH_MRUBY
+#include <mruby.h>
+#include <mruby/class.h>
+#include <mruby/data.h>
+#include <mruby/value.h>
+#include <mruby/string.h>
+
+#include "mrb_ctx.h"
+#include "mrb_command.h"
+
+static struct mrb_data_type mrb_grn_command_type = {
+  "Groonga::Command",
+  NULL
+};
+
+mrb_value
+mrb_grn_command_instantiate(grn_ctx *ctx, grn_obj *command)
+{
+  grn_mrb_data *data = &(ctx->impl->mrb);
+  mrb_state *mrb = data->state;
+  struct RClass *module = data->module;
+  char name[GRN_TABLE_MAX_KEY_SIZE];
+  int name_size;
+  mrb_value mrb_name;
+  struct RClass *command_class;
+  struct RClass *target_command_class;
+  mrb_value mrb_target_command_class;
+  mrb_value mrb_arguments[1];
+
+  name_size = grn_obj_name(ctx, command, name, GRN_TABLE_MAX_KEY_SIZE);
+  mrb_name = mrb_str_new(mrb, name, name_size);
+
+  command_class = mrb_class_get_under(mrb, module, "Command");
+  mrb_target_command_class = mrb_funcall(mrb,
+                                         mrb_obj_value(command_class),
+                                         "find_class", 1, mrb_name);
+  if (mrb_nil_p(mrb_target_command_class)) {
+    target_command_class = command_class;
+  } else {
+    target_command_class = mrb_class_ptr(mrb_target_command_class);
+  }
+  mrb_arguments[0] = mrb_cptr_value(mrb, command);
+  return mrb_obj_new(mrb, target_command_class, 1, mrb_arguments);
+}
+
+static void
+mrb_grn_command_run_wrapper(grn_ctx *ctx,
+                            grn_obj *command,
+                            grn_command_input *input,
+                            void *user_data)
+{
+  grn_mrb_data *data = &(ctx->impl->mrb);
+  mrb_state *mrb = data->state;
+  struct RClass *module = data->module;
+  int arena_index;
+  mrb_value mrb_command;
+  mrb_value mrb_input;
+
+  arena_index = mrb_gc_arena_save(mrb);
+  mrb_command = mrb_grn_command_instantiate(ctx, command);
+  {
+    struct RClass *command_input_class;
+    mrb_value mrb_arguments[1];
+    command_input_class = mrb_class_get_under(mrb, module, "CommandInput");
+    mrb_arguments[0] = mrb_cptr_value(mrb, input);
+    mrb_input = mrb_obj_new(mrb, command_input_class, 1, mrb_arguments);
+  }
+  mrb_funcall(mrb, mrb_command, "run_internal", 1, mrb_input);
+  mrb_gc_arena_restore(mrb, arena_index);
+}
+
+static mrb_value
+mrb_grn_command_singleton_register(mrb_state *mrb, mrb_value klass)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  mrb_value mrb_name;
+  mrb_value *mrb_arguments;
+  mrb_int n_arguments;
+
+  mrb_get_args(mrb, "Sa", &mrb_name, &mrb_arguments, &n_arguments);
+
+  {
+    grn_expr_var *vars;
+    mrb_int i;
+
+    for (i = 0; i < n_arguments; i++) {
+      mrb_arguments[i] = mrb_convert_type(mrb, mrb_arguments[i],
+                                          MRB_TT_STRING, "String", "to_str");
+    }
+    vars = GRN_MALLOCN(grn_expr_var, n_arguments);
+    for (i = 0; i < n_arguments; i++) {
+      mrb_value mrb_argument = mrb_arguments[i];
+      grn_expr_var *var = &vars[i];
+      var->name = RSTRING_PTR(mrb_argument);
+      var->name_size = RSTRING_LEN(mrb_argument);
+      GRN_TEXT_INIT(&(var->value), 0);
+    }
+
+    grn_command_register(ctx,
+                         RSTRING_PTR(mrb_name),
+                         RSTRING_LEN(mrb_name),
+                         mrb_grn_command_run_wrapper,
+                         vars,
+                         n_arguments,
+                         NULL);
+
+    for (i = 0; i < n_arguments; i++) {
+      grn_expr_var *var = &vars[i];
+      GRN_OBJ_FIN(ctx, &(var->value));
+    }
+    GRN_FREE(vars);
+  }
+
+  grn_mrb_ctx_check(mrb);
+
+  {
+    grn_mrb_data *data = &(ctx->impl->mrb);
+    struct RClass *command_class;
+    command_class = mrb_class_get_under(mrb, data->module, "Command");
+    mrb_funcall(mrb,
+                mrb_obj_value(command_class),
+                "register_class", 2, mrb_name, klass);
+  }
+
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_grn_command_initialize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value mrb_command_ptr;
+
+  mrb_get_args(mrb, "o", &mrb_command_ptr);
+  DATA_TYPE(self) = &mrb_grn_command_type;
+  DATA_PTR(self) = mrb_cptr(mrb_command_ptr);
+  return self;
+}
+
+void
+grn_mrb_command_init(grn_ctx *ctx)
+{
+  grn_mrb_data *data = &(ctx->impl->mrb);
+  mrb_state *mrb = data->state;
+  struct RClass *module = data->module;
+  struct RClass *procedure_class;
+  struct RClass *klass;
+
+  procedure_class = mrb_class_get_under(mrb, module, "Procedure");
+  klass = mrb_define_class_under(mrb, module, "Command", procedure_class);
+  MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);
+
+  mrb_define_singleton_method(mrb, (struct RObject *)klass, "register",
+                              mrb_grn_command_singleton_register,
+                              MRB_ARGS_REQ(5));
+
+  mrb_define_method(mrb, klass, "initialize",
+                    mrb_grn_command_initialize, MRB_ARGS_REQ(1));
+}
+#endif

  Added: lib/mrb/mrb_command.h (+38 -0) 100644
===================================================================
--- /dev/null
+++ lib/mrb/mrb_command.h    2015-01-05 00:51:20 +0900 (b5098fd)
@@ -0,0 +1,38 @@
+/* -*- c-basic-offset: 2 -*- */
+/*
+  Copyright(C) 2015 Brazil
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License version 2.1 as published by the Free Software Foundation.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#ifndef GRN_MRB_COMMAND_H
+#define GRN_MRB_COMMAND_H
+
+#include "../grn_ctx.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void grn_mrb_command_init(grn_ctx *ctx);
+
+#ifdef GRN_WITH_MRUBY
+mrb_value grn_mrb_command_instantiate(grn_ctx *ctx, grn_obj *command);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GRN_MRB_COMMAND_H */

  Added: lib/mrb/mrb_command_input.c (+62 -0) 100644
===================================================================
--- /dev/null
+++ lib/mrb/mrb_command_input.c    2015-01-05 00:51:20 +0900 (59b3e27)
@@ -0,0 +1,62 @@
+/* -*- c-basic-offset: 2 -*- */
+/*
+  Copyright(C) 2015 Brazil
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License version 2.1 as published by the Free Software Foundation.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include "../grn_ctx_impl.h"
+#include <groonga/command.h>
+
+#ifdef GRN_WITH_MRUBY
+#include <mruby.h>
+#include <mruby/class.h>
+#include <mruby/data.h>
+#include <mruby/value.h>
+#include <mruby/string.h>
+
+#include "mrb_ctx.h"
+#include "mrb_command_input.h"
+
+static struct mrb_data_type mrb_grn_command_input_type = {
+  "Groonga::CommandInput",
+  NULL
+};
+
+static mrb_value
+mrb_grn_command_input_initialize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value mrb_command_input_ptr;
+
+  mrb_get_args(mrb, "o", &mrb_command_input_ptr);
+  DATA_TYPE(self) = &mrb_grn_command_input_type;
+  DATA_PTR(self) = mrb_cptr(mrb_command_input_ptr);
+  return self;
+}
+
+void
+grn_mrb_command_input_init(grn_ctx *ctx)
+{
+  grn_mrb_data *data = &(ctx->impl->mrb);
+  mrb_state *mrb = data->state;
+  struct RClass *module = data->module;
+  struct RClass *klass;
+
+  klass = mrb_define_class_under(mrb, module, "CommandInput", mrb->object_class);
+  MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);
+
+  mrb_define_method(mrb, klass, "initialize",
+                    mrb_grn_command_input_initialize, MRB_ARGS_REQ(1));
+}
+#endif

  Added: lib/mrb/mrb_command_input.h (+34 -0) 100644
===================================================================
--- /dev/null
+++ lib/mrb/mrb_command_input.h    2015-01-05 00:51:20 +0900 (a4eb097)
@@ -0,0 +1,34 @@
+/* -*- c-basic-offset: 2 -*- */
+/*
+  Copyright(C) 2015 Brazil
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License version 2.1 as published by the Free Software Foundation.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#ifndef GRN_MRB_COMMAND_INPUT_H
+#define GRN_MRB_COMMAND_INPUT_H
+
+#include "../grn_ctx.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void grn_mrb_command_input_init(grn_ctx *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GRN_MRB_COMMAND_INPUT_H */

  Added: lib/mrb/scripts/command.rb (+24 -0) 100644
===================================================================
--- /dev/null
+++ lib/mrb/scripts/command.rb    2015-01-05 00:51:20 +0900 (a88f34a)
@@ -0,0 +1,24 @@
+module Groonga
+  class Command
+    @@classes = {}
+    class << self
+      def register_class(name, klass)
+        @@classes[name] = klass
+      end
+
+      def find_class(name)
+        @@classes[name]
+      end
+    end
+
+    private
+    def run_internal(input)
+      begin
+        run_body(input)
+      rescue => error
+        Context.instance.record_error(:command_error, error)
+        nil
+      end
+    end
+  end
+end

  Modified: lib/mrb/scripts/initialize/post.rb (+1 -0)
===================================================================
--- lib/mrb/scripts/initialize/post.rb    2015-01-05 00:40:31 +0900 (95f71b8)
+++ lib/mrb/scripts/initialize/post.rb    2015-01-05 00:51:20 +0900 (bfbee07)
@@ -1,6 +1,7 @@
 require "error"
 
 require "database"
+require "command"
 require "table_cursor"
 
 require "eval_context"

  Modified: lib/mrb/sources.am (+4 -0)
===================================================================
--- lib/mrb/sources.am    2015-01-05 00:40:31 +0900 (c19d2ff)
+++ lib/mrb/sources.am    2015-01-05 00:51:20 +0900 (f29d7e5)
@@ -7,6 +7,10 @@ libgrnmrb_la_SOURCES =				\
 	mrb_bulk.h				\
 	mrb_column.c				\
 	mrb_column.h				\
+	mrb_command.c				\
+	mrb_command.h				\
+	mrb_command_input.c			\
+	mrb_command_input.h			\
 	mrb_converter.c				\
 	mrb_converter.h				\
 	mrb_ctx.c				\
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る