wanabe
null+****@clear*****
Tue Oct 8 19:20:20 JST 2013
wanabe 2013-10-08 19:20:20 +0900 (Tue, 08 Oct 2013) New Revision: 54f89dfa3ee1a473965b26dc021aeebecda8397f https://github.com/groonga/groonga/commit/54f89dfa3ee1a473965b26dc021aeebecda8397f Merged 8afb10c: Merge pull request #111 from wanabe/load-script Message: Load "expr.rb" script from mrb_expr.c Added files: lib/mrb/ruby_scripts/expr.rb Modified files: CMakeLists.txt configure.ac lib/mrb.c lib/mrb.h lib/mrb/Makefile.am lib/mrb/mrb_expr.c test/command/run-test.sh test/unit/run-test.sh Modified: CMakeLists.txt (+4 -0) =================================================================== --- CMakeLists.txt 2013-10-08 12:37:57 +0900 (67fc0fe) +++ CMakeLists.txt 2013-10-08 19:20:20 +0900 (f5a5bf8) @@ -77,6 +77,10 @@ set(GRN_DLL_FILENAME set(GRN_QUERY_EXPANDER_TSV_RELATIVE_SYNONYMS_FILE "synonyms.tsv") set(GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE "${CMAKE_INSTALL_PREFIX}/${GRN_DATA_DIR}/${GRN_QUERY_EXPANDER_TSV_RELATIVE_SYNONYMS_FILE}") +set(GRN_RELATIVE_RUBY_SCRIPTS_DIR + "${LIB_DIR}/${GRN_PROJECT_NAME}/ruby_scripts") +set(GRN_RUBY_SCRIPTS_DIR + "${CMAKE_INSTALL_PREFIX}/${GRN_RELATIVE_RUBY_SCRIPTS_DIR}") if(CMAKE_COMPILER_IS_GNUCXX) set(GRN_NO_WARNING_COMPILE_FLAGS Modified: configure.ac (+8 -0) =================================================================== --- configure.ac 2013-10-08 12:37:57 +0900 (d508fac) +++ configure.ac 2013-10-08 19:20:20 +0900 (335e4db) @@ -1213,6 +1213,12 @@ AC_SUBST(examplesdir) examples_dictionarydir="\$(examplesdir)/dictionary" AC_SUBST(examples_dictionarydir) +# for ruby script +relative_ruby_scriptsdir_base="\$(PACKAGE)/ruby_scripts" +AC_SUBST(relative_ruby_scriptsdir_base) +ruby_scriptsdir="\${libdir}/\$(relative_ruby_scriptsdir_base)" +AC_SUBST(ruby_scriptsdir) + # for document root GRN_DEFAULT_DOCUMENT_ROOT_BASE="html/admin" GRN_DEFAULT_DOCUMENT_ROOT="\${pkgdatadir}/\${GRN_DEFAULT_DOCUMENT_ROOT_BASE}" @@ -1230,6 +1236,8 @@ GRN_DEFS="" GRN_DEFS="$GRN_DEFS -DGRN_DLL_FILENAME=L\\\"\"\$(GRN_DLL_FILENAME)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_PLUGINS_DIR=\\\"\"\$(pluginsdir)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_RELATIVE_PLUGINS_DIR=\\\"\"\$(relative_pluginsdir)\"\\\"" +GRN_DEFS="$GRN_DEFS -DGRN_RUBY_SCRIPTS_DIR=\\\"\"\$(ruby_scriptsdir)\"\\\"" +GRN_DEFS="$GRN_DEFS -DGRN_RELATIVE_RUBY_SCRIPTS_DIR=\\\"\"\$(relative_ruby_scriptsdir)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_LOG_PATH=\\\"\"\$(grn_log_path)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_DEFAULT_DOCUMENT_ROOT=\\\"\"\$(GRN_DEFAULT_DOCUMENT_ROOT)\"\\\"" GRN_DEFS="$GRN_DEFS -DGRN_DEFAULT_RELATIVE_DOCUMENT_ROOT=\\\"\"\$(GRN_DEFAULT_RELATIVE_DOCUMENT_ROOT)\"\\\"" Modified: lib/mrb.c (+97 -0) =================================================================== --- lib/mrb.c 2013-10-08 12:37:57 +0900 (607772e) +++ lib/mrb.c 2013-10-08 19:20:20 +0900 (231bd1b) @@ -26,6 +26,103 @@ #endif #ifdef GRN_WITH_MRUBY +#ifdef WIN32 +static char *win32_ruby_scripts_dir = NULL; +static char win32_ruby_scripts_dir_buffer[PATH_MAX]; +static const char * +grn_mrb_get_system_ruby_scripts_dir(void) +{ + if (!win32_ruby_scripts_dir) { + const char *base_dir; + const char *relative_path = GRN_RELATIVE_RUBY_SCRIPTS_DIR; + char *path; + size_t base_dir_length; + + base_dir = grn_win32_base_dir(); + base_dir_length = strlen(base_dir); + strcpy(win32_ruby_scripts_dir_buffer, base_dir); + strcat(win32_ruby_scripts_dir_buffer, "/"); + strcat(win32_ruby_scripts_dir_buffer, relative_path); + win32_ruby_scripts_dir = win32_ruby_scripts_dir_buffer; + } + return win32_ruby_scripts_dir; +} + +#else /* WIN32 */ +static const char * +grn_mrb_get_system_ruby_scripts_dir(void) +{ + return GRN_RUBY_SCRIPTS_DIR; +} +#endif /* WIN32 */ + +static FILE * +grn_mrb_open_script(grn_ctx *ctx, const char *name) +{ + const char *ruby_scripts_dir; + char dir_last_char; + char path[PATH_MAX]; + int name_length, max_name_length; + FILE *script_file; + + GRN_API_ENTER; + if (name[0] == '/') { + path[0] = '\0'; + } else { + ruby_scripts_dir = getenv("GRN_RUBY_SCRIPTS_DIR"); + if (!ruby_scripts_dir) { + ruby_scripts_dir = grn_mrb_get_system_ruby_scripts_dir(); + } + strcpy(path, ruby_scripts_dir); + + dir_last_char = ruby_scripts_dir[strlen(path) - 1]; + if (dir_last_char != '/') { + strcat(path, "/"); + } + } + + name_length = strlen(name); + max_name_length = PATH_MAX - strlen(path) - 1; + if (name_length > max_name_length) { + ERR(GRN_INVALID_ARGUMENT, + "script name is too long: %d (max: %d) <%s%s>", + name_length, max_name_length, + path, name); + } else { + strcat(path, name); + script_file = fopen(path, "r"); + } + + GRN_API_RETURN(script_file); +} + +mrb_value +grn_mrb_load(grn_ctx *ctx, const char *name) +{ + mrb_state *mrb = ctx->impl->mrb.state; + int n; + FILE *fp; + mrb_value result; + struct mrb_parser_state *parser; + + if (!mrb) { + return mrb_nil_value(); + } + if (!(fp = grn_mrb_open_script(ctx, name))) { + return mrb_nil_value(); + } + + parser = mrb_parse_file(mrb, fp, NULL); + n = mrb_generate_code(mrb, parser); + result = mrb_run(mrb, + mrb_proc_new(mrb, mrb->irep[n]), + mrb_top_self(mrb)); + mrb_parser_free(parser); + fclose(fp); + + return result; +} + mrb_value grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length) { Modified: lib/mrb.h (+1 -0) =================================================================== --- lib/mrb.h 2013-10-08 12:37:57 +0900 (8733df0) +++ lib/mrb.h 2013-10-08 19:20:20 +0900 (fa1440e) @@ -32,6 +32,7 @@ extern "C" { #ifdef GRN_WITH_MRUBY mrb_value grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length); +mrb_value grn_mrb_load(grn_ctx *ctx, const char *name); grn_rc grn_mrb_to_grn(grn_ctx *ctx, mrb_value mrb_object, grn_obj *grn_object); #endif Modified: lib/mrb/Makefile.am (+1 -0) =================================================================== --- lib/mrb/Makefile.am 2013-10-08 12:37:57 +0900 (c1666a9) +++ lib/mrb/Makefile.am 2013-10-08 19:20:20 +0900 (3d6be9e) @@ -10,6 +10,7 @@ AM_CFLAGS = \ $(MRUBY_CFLAGS) noinst_LTLIBRARIES = libgrnmrb.la +ruby_scripts_DATA = ruby_scripts/expr.rb include sources.am Modified: lib/mrb/mrb_expr.c (+2 -0) =================================================================== --- lib/mrb/mrb_expr.c 2013-10-08 12:37:57 +0900 (ae98b83) +++ lib/mrb/mrb_expr.c 2013-10-08 19:20:20 +0900 (1d9cd73) @@ -24,6 +24,7 @@ #include "../expr.h" #include "../util.h" +#include "../mrb.h" #include "mrb_expr.h" static scan_info ** @@ -347,6 +348,7 @@ grn_mrb_expr_init(grn_ctx *ctx) mrb_define_class_method(mrb, module, "build", mrb_grn_expr_build, MRB_ARGS_REQ(4)); + grn_mrb_load(ctx, "expr.rb"); } scan_info ** Added: lib/mrb/ruby_scripts/expr.rb (+4 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/ruby_scripts/expr.rb 2013-10-08 19:20:20 +0900 (058fee3) @@ -0,0 +1,4 @@ +module Groonga + class Expr + end +end Modified: test/command/run-test.sh (+3 -0) =================================================================== --- test/command/run-test.sh 2013-10-08 12:37:57 +0900 (40dcc7b) +++ test/command/run-test.sh 2013-10-08 19:20:20 +0900 (f52be41) @@ -38,6 +38,9 @@ export GRN_PLUGINS_DIR GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE="$top_dir/test/command/tmp/synonyms.tsv" export GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE +GRN_RUBY_SCRIPTS_DIR="$top_dir/lib/mrb/ruby_scripts" +export GRN_RUBY_SCRIPTS_DIR + case `uname` in Darwin) DYLD_LIBRARY_PATH="$top_dir/lib/.libs:$DYLD_LIBRARY_PATH" Modified: test/unit/run-test.sh (+3 -0) =================================================================== --- test/unit/run-test.sh 2013-10-08 12:37:57 +0900 (039ee06) +++ test/unit/run-test.sh 2013-10-08 19:20:20 +0900 (3ee2e22) @@ -58,6 +58,9 @@ CUTTER_ARGS="$CUTTER_ARGS --exclude-file test-performance.so" GRN_PLUGINS_DIR="$top_dir/plugins" export GRN_PLUGINS_DIR +GRN_RUBY_SCRIPTS_DIR="$top_dir/lib/mrb/ruby_scripts" +export GRN_RUBY_SCRIPTS_DIR + case `uname` in Darwin) DYLD_LIBRARY_PATH="$top_dir/lib/.libs:$DYLD_LIBRARY_PATH" -------------- next part -------------- HTML����������������������������...Download