Susumu Yata
null+****@clear*****
Thu Mar 3 17:51:01 JST 2016
Susumu Yata 2016-03-03 17:51:01 +0900 (Thu, 03 Mar 2016) New Revision: 44841a7847a14af8157abefe5512429b2d99571d https://github.com/groonga/groonga/commit/44841a7847a14af8157abefe5512429b2d99571d Message: load: save the first fatal error and skip remaining values GitHub: #495 Modified files: lib/ctx.c lib/db.c lib/grn_ctx_impl.h lib/proc.c test/unit/core/test-command-load.c Modified: lib/ctx.c (+2 -0) =================================================================== --- lib/ctx.c 2016-03-03 13:43:13 +0900 (cb52f48) +++ lib/ctx.c 2016-03-03 17:51:01 +0900 (8ffcba9) @@ -515,6 +515,8 @@ grn_loader_init(grn_loader *loader) loader->values_size = 0; loader->nrecords = 0; loader->stat = GRN_LOADER_BEGIN; + loader->rc = GRN_SUCCESS; + loader->errbuf[0] = '\0'; } void Modified: lib/db.c (+20 -9) =================================================================== --- lib/db.c 2016-03-03 13:43:13 +0900 (bd592a9) +++ lib/db.c 2016-03-03 17:51:01 +0900 (643bd9f) @@ -12661,6 +12661,13 @@ report_set_column_value_failure(grn_ctx *ctx, } static void +grn_loader_save_error(grn_ctx *ctx, grn_loader *loader) +{ + loader->rc = ctx->rc; + strcpy(loader->errbuf, ctx->errbuf); +} + +static void bracket_close(grn_ctx *ctx, grn_loader *loader) { grn_id id = GRN_ID_NIL; @@ -12682,7 +12689,7 @@ bracket_close(grn_ctx *ctx, grn_loader *loader) return; } nvalues = values_len(ctx, value, value_end); - if (!loader->table) { + if (!loader->table || loader->rc != GRN_SUCCESS) { goto exit; } @@ -12711,12 +12718,13 @@ bracket_close(grn_ctx *ctx, grn_loader *loader) name_equal(column_name, column_name_size, GRN_COLUMN_NAME_ID))) { /* _id or _key must appear just once. */ if (loader->key_offset != -1) { - GRN_LOG(ctx, GRN_LOG_ERROR, - "duplicated key columns: <%.*s> at %d and <%.*s> at %d", - (int)GRN_TEXT_LEN(key_column_name), - GRN_TEXT_VALUE(key_column_name), - loader->key_offset, - column_name_size, column_name, i); + ERR(GRN_INVALID_ARGUMENT, + "duplicated key columns: <%.*s> at %d and <%.*s> at %d", + (int)GRN_TEXT_LEN(key_column_name), + GRN_TEXT_VALUE(key_column_name), + loader->key_offset, + column_name_size, column_name, i); + grn_loader_save_error(ctx, loader); goto exit; } key_column_name = value; @@ -12728,6 +12736,7 @@ bracket_close(grn_ctx *ctx, grn_loader *loader) ERR(GRN_INVALID_ARGUMENT, "nonexistent column: <%.*s>", column_name_size, column_name); + grn_loader_save_error(ctx, loader); goto exit; } GRN_PTR_PUT(ctx, &loader->columns, col); @@ -12759,7 +12768,8 @@ bracket_close(grn_ctx *ctx, grn_loader *loader) ERR(GRN_INVALID_ARGUMENT, "nonexistent column: <%.*s>", column_name_size, column_name); - return; + grn_loader_save_error(ctx, loader); + goto exit; } GRN_PTR_PUT(ctx, &loader->columns, col); value++; @@ -12770,8 +12780,9 @@ bracket_close(grn_ctx *ctx, grn_loader *loader) ERR(GRN_INVALID_ARGUMENT, "column name must be string: <%.*s>", (int)GRN_TEXT_LEN(&buffer), GRN_TEXT_VALUE(&buffer)); + grn_loader_save_error(ctx, loader); GRN_OBJ_FIN(ctx, &buffer); - return; + goto exit; } } nvalues = 0; Modified: lib/grn_ctx_impl.h (+2 -0) =================================================================== --- lib/grn_ctx_impl.h 2016-03-03 13:43:13 +0900 (09df0ca) +++ lib/grn_ctx_impl.h 2016-03-03 17:51:01 +0900 (0258b96) @@ -74,6 +74,8 @@ typedef struct { uint32_t nrecords; grn_loader_stat stat; grn_content_type input_type; + grn_rc rc; + char errbuf[GRN_CTX_MSGSIZE]; } grn_loader; #define GRN_CTX_N_SEGMENTS 512 Modified: lib/proc.c (+4 -0) =================================================================== --- lib/proc.c 2016-03-03 13:43:13 +0900 (29524cd) +++ lib/proc.c 2016-03-03 17:51:01 +0900 (259aac3) @@ -142,6 +142,10 @@ proc_load(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) if (ctx->impl->loader.stat != GRN_LOADER_END) { grn_ctx_set_next_expr(ctx, grn_proc_get_info(ctx, user_data, NULL, NULL, NULL)); } else { + if (ctx->impl->loader.rc != GRN_SUCCESS) { + ctx->rc = ctx->impl->loader.rc; + strcpy(ctx->errbuf, ctx->impl->loader.errbuf); + } GRN_OUTPUT_INT64(ctx->impl->loader.nrecords); if (ctx->impl->loader.table) { grn_db_touch(ctx, DB_OBJ(ctx->impl->loader.table)->db); Modified: test/unit/core/test-command-load.c (+1 -1) =================================================================== --- test/unit/core/test-command-load.c 2016-03-03 13:43:13 +0900 (9c14563) +++ test/unit/core/test-command-load.c 2016-03-03 17:51:01 +0900 (9ee626a) @@ -407,7 +407,7 @@ test_no_key_table_without_columns(void) assert_send_command("table_create Numbers TABLE_NO_KEY"); grn_test_assert_send_command_error(context, GRN_INVALID_ARGUMENT, - "column name must be string: <[1]>", + "column name must be string: <1>", "load --table Numbers\n" "[\n" "[1],\n" -------------- next part -------------- HTML����������������������������... ダウンロード