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\""); }