[Groonga-commit] groonga/groonga at 54f89df [master] Load "expr.rb" script from mrb_expr.c

Back to archive index

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 



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