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