[Groonga-commit] groonga/groonga at 44841a7 [master] load: save the first fatal error and skip remaining values

Back to archive index

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����������������������������...
Descargar 



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