[Groonga-commit] groonga/groonga [command-version] check command version availability.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 9月 15日 (水) 11:58:53 JST


Kouhei Sutou	2010-09-15 02:58:53 +0000 (Wed, 15 Sep 2010)

  New Revision: 9f614d004ff0f41ddf57b8ed003a67708aee98da

  Log:
    check command version availability.

  Modified files:
    groonga.h
    lib/ctx.c
    lib/proc.c
    test/unit/gqtp/test-status.rb
    test/unit/lib/ruby/groonga-constants.rb

  Modified: groonga.h (+7 -3)
===================================================================
--- groonga.h    2010-09-15 02:32:46 +0000 (5f9ed65)
+++ groonga.h    2010-09-15 02:58:53 +0000 (4989aed)
@@ -109,7 +109,8 @@ typedef enum {
   GRN_TOO_SMALL_OFFSET = -67,
   GRN_TOO_LARGE_OFFSET = -68,
   GRN_TOO_SMALL_LIMIT = -69,
-  GRN_CAS_ERROR = -70
+  GRN_CAS_ERROR = -70,
+  GRN_UNSUPPORTED_COMMAND_VERSION = -71
 } grn_rc;
 
 GRN_API grn_rc grn_init(void);
@@ -128,10 +129,13 @@ typedef enum {
 typedef enum {
   GRN_COMMAND_VERSION_DEFAULT = 0,
   GRN_COMMAND_VERSION_1,
-  GRN_COMMAND_VERSION_2,
-  GRN_COMMAND_VERSION_MAX
+  GRN_COMMAND_VERSION_2
 } grn_command_version;
 
+#define GRN_COMMAND_VERSION_MIN GRN_COMMAND_VERSION_1
+#define GRN_COMMAND_VERSION_STABLE GRN_COMMAND_VERSION_1
+#define GRN_COMMAND_VERSION_MAX GRN_COMMAND_VERSION_2
+
 typedef enum {
   GRN_LOG_NONE = 0,
   GRN_LOG_EMERG,

  Modified: lib/ctx.c (+21 -7)
===================================================================
--- lib/ctx.c    2010-09-15 02:32:46 +0000 (bc9e5cb)
+++ lib/ctx.c    2010-09-15 02:58:53 +0000 (6de94a8)
@@ -264,7 +264,7 @@ grn_ctx_impl_init(grn_ctx *ctx)
   GRN_UINT32_INIT(&ctx->impl->levels, GRN_OBJ_VECTOR);
 
   if (ctx == &grn_gctx) {
-    ctx->impl->command_version = GRN_COMMAND_VERSION_MAX - 1;
+    ctx->impl->command_version = GRN_COMMAND_VERSION_STABLE;
   } else {
     ctx->impl->command_version = grn_get_default_command_version();
   }
@@ -769,7 +769,7 @@ grn_ctx_get_command_version(grn_ctx *ctx)
   if (ctx->impl) {
     return ctx->impl->command_version;
   } else {
-    return GRN_COMMAND_VERSION_MAX - 1;
+    return GRN_COMMAND_VERSION_STABLE;
   }
 }
 
@@ -778,15 +778,15 @@ grn_ctx_set_command_version(grn_ctx *ctx, grn_command_version version)
 {
   switch (version) {
   case GRN_COMMAND_VERSION_DEFAULT :
-    ctx->impl->command_version = GRN_COMMAND_VERSION_MAX - 1;
+    ctx->impl->command_version = GRN_COMMAND_VERSION_STABLE;
     return GRN_SUCCESS;
   default :
-    if (GRN_COMMAND_VERSION_DEFAULT < version &&
-        version < GRN_COMMAND_VERSION_MAX) {
+    if (GRN_COMMAND_VERSION_MIN <= version &&
+        version <= GRN_COMMAND_VERSION_MAX) {
       ctx->impl->command_version = version;
       return GRN_SUCCESS;
     } else {
-      return GRN_INVALID_ARGUMENT;
+      return GRN_UNSUPPORTED_COMMAND_VERSION;
     }
   }
 }
@@ -903,7 +903,17 @@ get_command_version(grn_ctx *ctx, const char *p, const char *pe)
 
   version = grn_atoui(p, pe, &rest);
   if (pe == rest) {
-    grn_ctx_set_command_version(ctx, version);
+    grn_rc rc;
+    rc = grn_ctx_set_command_version(ctx, version);
+    if (rc == GRN_UNSUPPORTED_COMMAND_VERSION) {
+      ERR(rc,
+          "unsupported command version is specified: %d: "
+          "stable command version: %d: "
+          "available command versions: %d-%d",
+          version,
+          GRN_COMMAND_VERSION_STABLE,
+          GRN_COMMAND_VERSION_MIN, GRN_COMMAND_VERSION_MAX);
+    }
   }
 }
 
@@ -950,6 +960,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
         GRN_BULK_REWIND(&buf);
         p = grn_text_cgidec(ctx, &buf, p, e, '&');
         get_command_version(ctx, GRN_TEXT_VALUE(&buf), GRN_BULK_CURR(&buf));
+        if (ctx->rc) { goto exit; }
       } else {
         if (!(val = grn_expr_get_or_add_var(ctx, expr, v, l))) {
           val = &buf;
@@ -969,6 +980,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
     ctx->impl->curr_expr = expr;
     grn_expr_exec(ctx, expr, 0);
   }
+exit :
   GRN_OBJ_FIN(ctx, &buf);
   return expr;
 }
@@ -1005,6 +1017,7 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
           GRN_BULK_REWIND(&buf);
           p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
           get_command_version(ctx, GRN_TEXT_VALUE(&buf), GRN_BULK_CURR(&buf));
+          if (ctx->rc) { goto exit; }
         } else if (expr && (val = grn_expr_get_or_add_var(ctx, expr, v, l))) {
           grn_obj_reinit(ctx, val, GRN_DB_TEXT, 0);
           p = grn_text_unesc_tok(ctx, val, p, e, &tok_type);
@@ -1036,6 +1049,7 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
           GRN_TEXT_LEN(&buf), GRN_TEXT_VALUE(&buf));
     }
   }
+exit :
   GRN_OBJ_FIN(ctx, &buf);
   return expr;
 }

  Modified: lib/proc.c (+1 -1)
===================================================================
--- lib/proc.c    2010-09-15 02:32:46 +0000 (e941f27)
+++ lib/proc.c    2010-09-15 02:58:53 +0000 (2faacad)
@@ -406,7 +406,7 @@ proc_status(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
   GRN_OUTPUT_CSTR("default_command_version");
   GRN_OUTPUT_INT32(grn_get_default_command_version());
   GRN_OUTPUT_CSTR("max_command_version");
-  GRN_OUTPUT_INT32(GRN_COMMAND_VERSION_MAX - 1);
+  GRN_OUTPUT_INT32(GRN_COMMAND_VERSION_MAX);
   GRN_OUTPUT_MAP_CLOSE();
   return NULL;
 }

  Modified: test/unit/gqtp/test-status.rb (+8 -1)
===================================================================
--- test/unit/gqtp/test-status.rb    2010-09-15 02:32:46 +0000 (97a8a92)
+++ test/unit/gqtp/test-status.rb    2010-09-15 02:58:53 +0000 (fac8e15)
@@ -33,6 +33,13 @@ class StatusTest < Test::Unit::TestCase
 
   def test_command_version
     output = run_groonga(@database_path, "status", "--command_version", "1")
-    assert_equal(1, JSON.parse(output)[1]["command_version"])
+    rc, result = JSON.parse(output)
+    assert_equal(1, result["command_version"])
+  end
+
+  def test_unsupported_command_version
+    output = run_groonga(@database_path, "status", "--command_version", "10000")
+    rc, result = JSON.parse(output)
+    assert_equal(Result::UNSUPPORTED_COMMAND_VERSION, rc[0])
   end
 end

  Modified: test/unit/lib/ruby/groonga-constants.rb (+6 -0)
===================================================================
--- test/unit/lib/ruby/groonga-constants.rb    2010-09-15 02:32:46 +0000 (3cc30fa)
+++ test/unit/lib/ruby/groonga-constants.rb    2010-09-15 02:58:53 +0000 (e4f4b6b)
@@ -84,6 +84,12 @@ module GroongaConstants
     SYNTAX_ERROR = -63
     RETRY_MAX = -64
     INCOMPATIBLE_FILE_FORMAT = -65
+    UPDATE_NOT_ALLOWED = -66
+    TOO_SMALL_OFFSET = -67
+    TOO_LARGE_OFFSET = -68
+    TOO_SMALL_LIMIT = -69
+    CAS_ERROR = -70
+    UNSUPPORTED_COMMAND_VERSION = -71
   end
 
   module Table




Groonga-commit メーリングリストの案内
Back to archive index