[Groonga-commit] groonga/groonga at 72d3a7b [master] loader: reduce the nesting depth

Back to archive index

Susumu Yata null+****@clear*****
Fri Mar 4 18:11:10 JST 2016


Susumu Yata	2016-03-04 18:11:10 +0900 (Fri, 04 Mar 2016)

  New Revision: 72d3a7b410dba58e481b4e007212e765ce396bc1
  https://github.com/groonga/groonga/commit/72d3a7b410dba58e481b4e007212e765ce396bc1

  Message:
    loader: reduce the nesting depth

  Modified files:
    lib/db.c

  Modified: lib/db.c (+144 -141)
===================================================================
--- lib/db.c    2016-03-04 18:10:37 +0900 (bf19def)
+++ lib/db.c    2016-03-04 18:11:10 +0900 (ca58545)
@@ -12898,164 +12898,167 @@ exit:
 static void
 brace_close(grn_ctx *ctx, grn_loader *loader)
 {
-  uint32_t begin;
-  grn_obj *key_value = NULL;
-  grn_obj *value, *ve;
   grn_id id = GRN_ID_NIL;
+  grn_obj *value, *value_end, *key_value = NULL;
+  uint32_t begin;
+
   GRN_UINT32_POP(&loader->level, begin);
-  value = ((grn_obj *)(GRN_TEXT_VALUE(&loader->values))) + begin;
-  ve = ((grn_obj *)(GRN_TEXT_VALUE(&loader->values))) + loader->values_size;
+  value = (grn_obj *)GRN_TEXT_VALUE(&loader->values) + begin;
+  value_end = (grn_obj *)GRN_TEXT_VALUE(&loader->values) + loader->values_size;
   GRN_ASSERT(value->header.domain == GRN_JSON_LOAD_OPEN_BRACE);
   GRN_UINT32_SET(ctx, value, loader->values_size - begin - 1);
   value++;
-  if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t) * loader->emit_level) {
-    if (loader->table) {
-      switch (loader->table->header.type) {
-      case GRN_TABLE_HASH_KEY :
-      case GRN_TABLE_PAT_KEY :
-      case GRN_TABLE_DAT_KEY :
-        {
-          grn_obj *v, *key_column_name = NULL;
-          for (v = value; v + 1 < ve; v = values_next(ctx, v)) {
-            char *column_name = GRN_TEXT_VALUE(v);
-            unsigned int column_name_size = GRN_TEXT_LEN(v);
-            if (v->header.domain == GRN_DB_TEXT &&
-                (name_equal(column_name, column_name_size,
-                            GRN_COLUMN_NAME_KEY) ||
-                 name_equal(column_name, column_name_size,
-                            GRN_COLUMN_NAME_ID))) {
-              if (key_column_name) {
-                GRN_LOG(ctx, GRN_LOG_ERROR, "duplicated key columns: %.*s and %.*s",
-                        (int)GRN_TEXT_LEN(key_column_name),
-                        GRN_TEXT_VALUE(key_column_name),
-                        column_name_size, column_name);
-                goto exit;
-              }
-              key_column_name = value;
-              v++;
-              key_value = v;
-              id = loader_add(ctx, key_value);
-            } else {
-              v = values_next(ctx, v);
-            }
+  if (GRN_BULK_VSIZE(&loader->level) > sizeof(uint32_t) * loader->emit_level) {
+    return;
+  }
+  if (!loader->table) {
+    goto exit;
+  }
+
+  switch (loader->table->header.type) {
+  case GRN_TABLE_HASH_KEY :
+  case GRN_TABLE_PAT_KEY :
+  case GRN_TABLE_DAT_KEY :
+    {
+      grn_obj *v, *key_column_name = NULL;
+      for (v = value; v + 1 < value_end; v = values_next(ctx, v)) {
+        char *column_name = GRN_TEXT_VALUE(v);
+        unsigned int column_name_size = GRN_TEXT_LEN(v);
+        if (v->header.domain == GRN_DB_TEXT &&
+            (name_equal(column_name, column_name_size, GRN_COLUMN_NAME_KEY) ||
+             name_equal(column_name, column_name_size, GRN_COLUMN_NAME_ID))) {
+          if (key_column_name) {
+            GRN_LOG(ctx, GRN_LOG_ERROR, "duplicated key columns: %.*s and %.*s",
+                    (int)GRN_TEXT_LEN(key_column_name),
+                    GRN_TEXT_VALUE(key_column_name),
+                    column_name_size, column_name);
+            goto exit;
           }
+          key_column_name = value;
+          v++;
+          key_value = v;
+          id = loader_add(ctx, key_value);
+        } else {
+          v = values_next(ctx, v);
         }
-        break;
-      case GRN_TABLE_NO_KEY :
-        {
-          grn_obj *v;
-          grn_bool found_id_column = GRN_FALSE;
-          for (v = value; v + 1 < ve; v = values_next(ctx, v)) {
-            char *column_name = GRN_TEXT_VALUE(v);
-            unsigned int column_name_size = GRN_TEXT_LEN(v);
-            if (v->header.domain == GRN_DB_TEXT &&
-                (name_equal(column_name, column_name_size,
-                            GRN_COLUMN_NAME_ID))) {
-              grn_obj *id_value;
-              if (found_id_column) {
-                GRN_LOG(ctx, GRN_LOG_ERROR, "duplicated '_id' column");
+      }
+    }
+    break;
+  case GRN_TABLE_NO_KEY :
+    {
+      grn_obj *v;
+      grn_bool found_id_column = GRN_FALSE;
+      for (v = value; v + 1 < value_end; v = values_next(ctx, v)) {
+        char *column_name = GRN_TEXT_VALUE(v);
+        unsigned int column_name_size = GRN_TEXT_LEN(v);
+        if (v->header.domain == GRN_DB_TEXT &&
+            (name_equal(column_name, column_name_size,
+                        GRN_COLUMN_NAME_ID))) {
+          grn_obj *id_value;
+          if (found_id_column) {
+            GRN_LOG(ctx, GRN_LOG_ERROR, "duplicated '_id' column");
+            goto exit;
+          }
+          found_id_column = GRN_TRUE;
+          v = values_next(ctx, v);
+          id_value = v;
+          switch (id_value->header.type) {
+          case GRN_DB_UINT32 :
+            id = GRN_UINT32_VALUE(id_value);
+            break;
+          case GRN_DB_INT32 :
+            id = GRN_INT32_VALUE(id_value);
+            break;
+          default :
+            {
+              grn_obj casted_id_value;
+              GRN_UINT32_INIT(&casted_id_value, 0);
+              if (grn_obj_cast(ctx, id_value, &casted_id_value, GRN_FALSE)) {
+                grn_obj inspected;
+                GRN_TEXT_INIT(&inspected, 0);
+                grn_inspect(ctx, &inspected, id_value);
+                ERR(GRN_INVALID_ARGUMENT,
+                    "<%.*s>: failed to cast to <UInt32>: <%.*s>",
+                    (int)column_name_size, column_name,
+                    (int)GRN_TEXT_LEN(&inspected),
+                    GRN_TEXT_VALUE(&inspected));
+                grn_obj_unlink(ctx, &inspected);
                 goto exit;
+              } else {
+                id = GRN_UINT32_VALUE(&casted_id_value);
               }
-              found_id_column = GRN_TRUE;
-              v = values_next(ctx, v);
-              id_value = v;
-              switch (id_value->header.type) {
-              case GRN_DB_UINT32 :
-                id = GRN_UINT32_VALUE(id_value);
-                break;
-              case GRN_DB_INT32 :
-                id = GRN_INT32_VALUE(id_value);
-                break;
-              default :
-                {
-                  grn_obj casted_id_value;
-                  GRN_UINT32_INIT(&casted_id_value, 0);
-                  if (grn_obj_cast(ctx, id_value, &casted_id_value, GRN_FALSE)) {
-                    grn_obj inspected;
-                    GRN_TEXT_INIT(&inspected, 0);
-                    grn_inspect(ctx, &inspected, id_value);
-                    ERR(GRN_INVALID_ARGUMENT,
-                        "<%.*s>: failed to cast to <UInt32>: <%.*s>",
-                        (int)column_name_size, column_name,
-                        (int)GRN_TEXT_LEN(&inspected),
-                        GRN_TEXT_VALUE(&inspected));
-                    grn_obj_unlink(ctx, &inspected);
-                    goto exit;
-                  } else {
-                    id = GRN_UINT32_VALUE(&casted_id_value);
-                  }
-                  GRN_OBJ_FIN(ctx, &casted_id_value);
-                }
-                break;
-              }
-            } else {
-              v = values_next(ctx, v);
+              GRN_OBJ_FIN(ctx, &casted_id_value);
             }
+            break;
           }
+        } else {
+          v = values_next(ctx, v);
         }
-        if (id == GRN_ID_NIL) {
-          id = grn_table_add(ctx, loader->table, NULL, 0, NULL);
-        }
-        break;
-      default :
-        break;
       }
-      if (id) {
-        grn_obj *col;
-        const char *name;
-        unsigned int name_size;
-        while (value + 1 < ve) {
-          if (value->header.domain != GRN_DB_TEXT) { break; /* error */ }
-          name = GRN_TEXT_VALUE(value);
-          name_size = GRN_TEXT_LEN(value);
-          col = grn_obj_column(ctx, loader->table, name, name_size);
-          value++;
-          /* auto column create
-          if (!col) {
-            if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACKET) {
-              grn_obj *v = value + 1;
-              col = grn_column_create(ctx, loader->table, name, name_size,
-                                      NULL, GRN_OBJ_PERSISTENT|GRN_OBJ_COLUMN_VECTOR,
-                                      grn_ctx_at(ctx, v->header.domain));
-            } else {
-              col = grn_column_create(ctx, loader->table, name, name_size,
-                                      NULL, GRN_OBJ_PERSISTENT,
-                                      grn_ctx_at(ctx, value->header.domain));
-            }
-          }
-          */
-          if (col) {
-            if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACKET) {
-              set_vector(ctx, col, id, value);
-            } else if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACE) {
-              set_weight_vector(ctx, col, id, value);
-            } else {
-              grn_obj_set_value(ctx, col, id, value, GRN_OBJ_SET);
-            }
-            if (ctx->rc != GRN_SUCCESS) {
-              report_set_column_value_failure(ctx, key_value,
-                                              name, name_size, value);
-              ERRCLR(ctx);
-            }
-            grn_obj_unlink(ctx, col);
-          } else {
-            GRN_LOG(ctx, GRN_LOG_ERROR, "invalid column('%.*s')", (int)name_size, name);
-          }
-          value = values_next(ctx, value);
-        }
-        if (loader->each) {
-          grn_obj *v = grn_expr_get_var_by_offset(ctx, loader->each, 0);
-          GRN_RECORD_SET(ctx, v, id);
-          grn_expr_exec(ctx, loader->each, 0);
-        }
-        loader->nrecords++;
+    }
+    if (id == GRN_ID_NIL) {
+      id = grn_table_add(ctx, loader->table, NULL, 0, NULL);
+    }
+    break;
+  default :
+    break;
+  }
+
+  if (id == GRN_ID_NIL) {
+    GRN_LOG(ctx, GRN_LOG_ERROR, "neither _key nor _id is assigned");
+    goto exit;
+  }
+
+  while (value + 1 < value_end) {
+    grn_obj *col;
+    const char *name = GRN_TEXT_VALUE(value);
+    unsigned int name_size = GRN_TEXT_LEN(value);
+    if (value->header.domain != GRN_DB_TEXT) { break; /* error */ }
+    name = GRN_TEXT_VALUE(value);
+    name_size = GRN_TEXT_LEN(value);
+    col = grn_obj_column(ctx, loader->table, name, name_size);
+    value++;
+    /* auto column create
+    if (!col) {
+      if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACKET) {
+        grn_obj *v = value + 1;
+        col = grn_column_create(ctx, loader->table, name, name_size,
+                                NULL, GRN_OBJ_PERSISTENT|GRN_OBJ_COLUMN_VECTOR,
+                                grn_ctx_at(ctx, v->header.domain));
+      } else {
+        col = grn_column_create(ctx, loader->table, name, name_size,
+                                NULL, GRN_OBJ_PERSISTENT,
+                                grn_ctx_at(ctx, value->header.domain));
+      }
+    }
+    */
+    if (col) {
+      if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACKET) {
+        set_vector(ctx, col, id, value);
+      } else if (value->header.domain == GRN_JSON_LOAD_OPEN_BRACE) {
+        set_weight_vector(ctx, col, id, value);
       } else {
-        GRN_LOG(ctx, GRN_LOG_ERROR, "neither _key nor _id is assigned");
+        grn_obj_set_value(ctx, col, id, value, GRN_OBJ_SET);
       }
+      if (ctx->rc != GRN_SUCCESS) {
+        report_set_column_value_failure(ctx, key_value,
+                                        name, name_size, value);
+        ERRCLR(ctx);
+      }
+      grn_obj_unlink(ctx, col);
+    } else {
+      GRN_LOG(ctx, GRN_LOG_ERROR, "invalid column('%.*s')", (int)name_size, name);
     }
-  exit:
-    loader->values_size = begin;
+    value = values_next(ctx, value);
+  }
+  if (loader->each) {
+    grn_obj *v = grn_expr_get_var_by_offset(ctx, loader->each, 0);
+    GRN_RECORD_SET(ctx, v, id);
+    grn_expr_exec(ctx, loader->each, 0);
   }
+  loader->nrecords++;
+exit:
+  loader->values_size = begin;
 }
 
 #define JSON_READ_OPEN_BRACKET() do {\
-------------- next part --------------
HTML����������������������������...
Download 



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