[Groonga-commit] groonga/groonga [master] [delte] cleanup.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 2月 3日 (金) 11:34:19 JST


Kouhei Sutou	2012-02-03 11:34:19 +0900 (Fri, 03 Feb 2012)

  New Revision: cd69c5667bdb36d06db146e156ffc67839223df9

  Log:
    [delte] cleanup.

  Modified files:
    lib/proc.c
    test/unit/core/test-command-delete.c

  Modified: lib/proc.c (+53 -30)
===================================================================
--- lib/proc.c    2012-02-03 11:23:38 +0900 (6cc4a74)
+++ lib/proc.c    2012-02-03 11:34:19 +0900 (d8c20a2)
@@ -1706,31 +1706,18 @@ proc_get(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
   return NULL;
 }
 
-static grn_obj *
-proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
+static grn_rc
+proc_delete_validate_selector(grn_ctx *ctx, grn_obj *table, grn_obj *table_name,
+                              grn_obj *key, grn_obj *id, grn_obj *filter)
 {
-  grn_rc rc = GRN_INVALID_ARGUMENT;
-  grn_obj *table_name = VAR(0);
-  grn_obj *key = VAR(1);
-  grn_obj *id = VAR(2);
-  grn_obj *filter = VAR(3);
-  grn_obj *table = NULL;
-
-  if (GRN_TEXT_LEN(table_name) == 0) {
-    rc = GRN_INVALID_ARGUMENT;
-    ERR(rc, "[table][record][delete] table name isn't specified");
-    goto exit;
-  }
+  grn_rc rc = GRN_SUCCESS;
 
-  table = grn_ctx_get(ctx,
-                      GRN_TEXT_VALUE(table_name),
-                      GRN_TEXT_LEN(table_name));
   if (!table) {
     rc = GRN_INVALID_ARGUMENT;
     ERR(rc,
         "[table][record][delete] table doesn't exist: <%.*s>",
         GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name));
-    goto exit;
+    return rc;
   }
 
   if (GRN_TEXT_LEN(key) == 0 &&
@@ -1738,8 +1725,10 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
       GRN_TEXT_LEN(filter) == 0) {
     rc = GRN_INVALID_ARGUMENT;
     ERR(rc,
-        "[table][record][delete] either key, id or filter must be specified");
-    goto exit;
+        "[table][record][delete] either key, id or filter must be specified: "
+        "table: <%.*s>",
+        GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name));
+    return rc;
   }
 
   if (GRN_TEXT_LEN(key) && GRN_TEXT_LEN(id) && GRN_TEXT_LEN(filter)) {
@@ -1747,43 +1736,74 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
     ERR(rc,
         "[table][record][delete] "
         "record selector must be one of key, id and filter: "
-        "key: <%.*s>, id: <%.*s>, filter: <%.*s>",
+        "table: <%.*s>, key: <%.*s>, id: <%.*s>, filter: <%.*s>",
+        GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
         GRN_TEXT_LEN(key), GRN_TEXT_VALUE(key),
         GRN_TEXT_LEN(id), GRN_TEXT_VALUE(id),
         GRN_TEXT_LEN(filter), GRN_TEXT_VALUE(filter));
-    goto exit;
+    return rc;
   }
 
   if (GRN_TEXT_LEN(key) && GRN_TEXT_LEN(id) && GRN_TEXT_LEN(filter) == 0) {
     rc = GRN_INVALID_ARGUMENT;
     ERR(rc,
         "[table][record][delete] "
-        "can't use both key and id: key: <%.*s>, id: <%.*s>",
+        "can't use both key and id: table: <%.*s>, key: <%.*s>, id: <%.*s>",
+        GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
         GRN_TEXT_LEN(key), GRN_TEXT_VALUE(key),
         GRN_TEXT_LEN(id), GRN_TEXT_VALUE(id));
-    goto exit;
+    return rc;
   }
 
   if (GRN_TEXT_LEN(key) && GRN_TEXT_LEN(id) == 0 && GRN_TEXT_LEN(filter)) {
     rc = GRN_INVALID_ARGUMENT;
     ERR(rc,
         "[table][record][delete] "
-        "can't use both key and filter: key: <%.*s>, filter: <%.*s>",
+        "can't use both key and filter: "
+        "table: <%.*s>, key: <%.*s>, filter: <%.*s>",
+        GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
         GRN_TEXT_LEN(key), GRN_TEXT_VALUE(key),
         GRN_TEXT_LEN(filter), GRN_TEXT_VALUE(filter));
-    goto exit;
+    return rc;
   }
 
   if (GRN_TEXT_LEN(key) == 0 && GRN_TEXT_LEN(id) && GRN_TEXT_LEN(filter)) {
     rc = GRN_INVALID_ARGUMENT;
     ERR(rc,
         "[table][record][delete] "
-        "can't use both id and filter: id: <%.*s>, filter: <%.*s>",
+        "can't use both id and filter: "
+        "table: <%.*s>, id: <%.*s>, filter: <%.*s>",
+        GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
         GRN_TEXT_LEN(id), GRN_TEXT_VALUE(id),
         GRN_TEXT_LEN(filter), GRN_TEXT_VALUE(filter));
+    return rc;
+  }
+
+  return rc;
+}
+
+static grn_obj *
+proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
+{
+  grn_rc rc = GRN_INVALID_ARGUMENT;
+  grn_obj *table_name = VAR(0);
+  grn_obj *key = VAR(1);
+  grn_obj *id = VAR(2);
+  grn_obj *filter = VAR(3);
+  grn_obj *table = NULL;
+
+  if (GRN_TEXT_LEN(table_name) == 0) {
+    rc = GRN_INVALID_ARGUMENT;
+    ERR(rc, "[table][record][delete] table name isn't specified");
     goto exit;
   }
 
+  table = grn_ctx_get(ctx,
+                      GRN_TEXT_VALUE(table_name),
+                      GRN_TEXT_LEN(table_name));
+  rc = proc_delete_validate_selector(ctx, table, table_name, key, id, filter);
+  if (rc != GRN_SUCCESS) { goto exit; }
+
   if (GRN_TEXT_LEN(key)) {
     grn_obj casted_key;
     if (key->header.domain != table->header.domain) {
@@ -1807,8 +1827,9 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
     } else {
       rc = GRN_INVALID_ARGUMENT;
       ERR(rc,
-          "[table][record][delete] id should be number: id: <%.*s>, "
-          "detail: <%.*s|%c|%.*s>",
+          "[table][record][delete] id should be number: "
+          "table: <%.*s>, id: <%.*s>, detail: <%.*s|%c|%.*s>",
+          GRN_TEXT_LEN(table_name), GRN_TEXT_VALUE(table_name),
           GRN_TEXT_LEN(id), GRN_TEXT_VALUE(id),
           end - GRN_TEXT_VALUE(id), GRN_TEXT_VALUE(id),
           end[0],
@@ -1823,7 +1844,9 @@ proc_delete(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
                    GRN_TEXT_LEN(filter),
                    NULL, GRN_OP_MATCH, GRN_OP_AND,
                    GRN_EXPR_SYNTAX_SCRIPT);
-    if (!ctx->rc) {
+    if (ctx->rc) {
+      rc = ctx->rc;
+    } else {
       grn_obj *records;
 
       records = grn_table_select(ctx, table, cond, NULL, GRN_OP_OR);

  Modified: test/unit/core/test-command-delete.c (+9 -6)
===================================================================
--- test/unit/core/test-command-delete.c    2012-02-03 11:23:38 +0900 (84fa421)
+++ test/unit/core/test-command-delete.c    2012-02-03 11:34:19 +0900 (9738a31)
@@ -333,7 +333,8 @@ test_no_selector(void)
   grn_test_assert_send_command_error(
     context,
     GRN_INVALID_ARGUMENT,
-    "[table][record][delete] either key, id or filter must be specified",
+    "[table][record][delete] either key, id or filter must be specified: "
+    "table: <Users>",
     "delete Users");
 }
 
@@ -345,7 +346,7 @@ test_all_selector(void)
     GRN_INVALID_ARGUMENT,
     "[table][record][delete] "
     "record selector must be one of key, id and filter: "
-    "key: <mori>, id: <1>, filter: <true>",
+    "table: <Users>, key: <mori>, id: <1>, filter: <true>",
     "delete Users --key mori --id 1 --filter \"true\"");
 }
 
@@ -355,7 +356,8 @@ test_key_and_id(void)
   grn_test_assert_send_command_error(
     context,
     GRN_INVALID_ARGUMENT,
-    "[table][record][delete] can't use both key and id: key: <mori>, id: <1>",
+    "[table][record][delete] can't use both key and id: "
+    "table: <Users>, key: <mori>, id: <1>",
     "delete Users --key mori --id 1");
 }
 
@@ -366,7 +368,7 @@ test_key_and_filter(void)
     context,
     GRN_INVALID_ARGUMENT,
     "[table][record][delete] can't use both key and filter: "
-    "key: <mori>, filter: <true>",
+    "table: <Users>, key: <mori>, filter: <true>",
     "delete Users --key mori --filter true");
 }
 
@@ -377,7 +379,7 @@ test_id_and_filter(void)
     context,
     GRN_INVALID_ARGUMENT,
     "[table][record][delete] can't use both id and filter: "
-    "id: <1>, filter: <true>",
+    "table: <Users>, id: <1>, filter: <true>",
     "delete Users --id 1 --filter true");
 }
 
@@ -387,7 +389,8 @@ test_invalid_id(void)
   grn_test_assert_send_command_error(
     context,
     GRN_INVALID_ARGUMENT,
-    "[table][record][delete] id should be number: id: <1x2>, detail: <1|x|2>",
+    "[table][record][delete] id should be number: "
+    "table: <Users>, id: <1x2>, detail: <1|x|2>",
     "delete Users --id \"1x2\"");
 }
 




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