Kouhei Sutou
null+****@clear*****
Thu Apr 26 18:02:41 JST 2018
Kouhei Sutou 2018-04-26 18:02:41 +0900 (Thu, 26 Apr 2018) New Revision: 38fb330c13e37a8af898072155c7d52da58c49af https://github.com/groonga/groonga/commit/38fb330c13e37a8af898072155c7d52da58c49af Message: grn_obj_set_value: support key value uvector for reference column ID uvector support isn't broken with this change. Modified files: lib/db.c Modified: lib/db.c (+20 -9) =================================================================== --- lib/db.c 2018-04-26 11:37:21 +0900 (e84a3da53) +++ lib/db.c 2018-04-26 18:02:41 +0900 (d2d4fb205) @@ -7545,22 +7545,33 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column, uvector.header.flags |= uvector_flags; n = grn_uvector_size(ctx, value); if (need_cast) { - grn_obj value_record; + const char *raw_value; + unsigned int element_size; + grn_obj element; grn_obj casted_record; - GRN_VALUE_FIX_SIZE_INIT(&value_record, 0, value->header.domain); + raw_value = GRN_BULK_HEAD(value); + element_size = grn_uvector_element_size(ctx, value); + GRN_VALUE_FIX_SIZE_INIT(&element, 0, value->header.domain); GRN_VALUE_FIX_SIZE_INIT(&casted_record, 0, column_range_id); for (i = 0; i < n; i++) { - grn_id id; grn_id casted_id; unsigned int weight = 0; - GRN_BULK_REWIND(&value_record); + GRN_BULK_REWIND(&element); GRN_BULK_REWIND(&casted_record); - id = grn_uvector_get_element(ctx, value, i, NULL); - GRN_RECORD_SET(ctx, &value_record, id); - rc = grn_obj_cast(ctx, &value_record, &casted_record, GRN_TRUE); + if (IS_WEIGHT_UVECTOR(value)) { + grn_id raw_element; + raw_element = grn_uvector_get_element(ctx, value, i, NULL); + GRN_RECORD_SET(ctx, &element, raw_element); + } else { + grn_bulk_write(ctx, + &element, + raw_value + (element_size * i), + element_size); + } + rc = grn_obj_cast(ctx, &element, &casted_record, GRN_TRUE); if (rc != GRN_SUCCESS) { char column_name[GRN_TABLE_MAX_KEY_SIZE]; int column_name_size; @@ -7570,7 +7581,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column, column_name, GRN_TABLE_MAX_KEY_SIZE); GRN_TEXT_INIT(&inspected, 0); - grn_inspect(ctx, &inspected, &value_record); + grn_inspect(ctx, &inspected, &element); ERR(rc, "[column][set-value] failed to cast: <%.*s>: <%.*s>", column_name_size, @@ -7584,7 +7595,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column, grn_uvector_add_element(ctx, &uvector, casted_id, weight); } - GRN_OBJ_FIN(ctx, &value_record); + GRN_OBJ_FIN(ctx, &element); GRN_OBJ_FIN(ctx, &casted_record); } else { for (i = 0; i < n; i++) { -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180426/2a722ddf/attachment-0001.htm