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����������������������������...ダウンロード