Kouhei Sutou
null+****@clear*****
Wed Mar 7 15:23:38 JST 2018
Kouhei Sutou 2018-03-07 15:23:38 +0900 (Wed, 07 Mar 2018) New Revision: b46a16be44572ac3e2366f6dd0f82c96f2c5d861 https://github.com/groonga/groonga/commit/b46a16be44572ac3e2366f6dd0f82c96f2c5d861 Message: ii: support vector and uvector combination of update Modified files: lib/ii.c Modified: lib/ii.c (+33 -8) =================================================================== --- lib/ii.c 2018-03-04 01:23:26 +0900 (ab154dbf0) +++ lib/ii.c 2018-03-07 15:23:38 +0900 (a82342560) @@ -6343,6 +6343,27 @@ grn_uvector2updspecs(grn_ctx *ctx, grn_ii *ii, grn_id rid, } } +static void +grn_ii_column_update_get_element_value(grn_ctx *ctx, + grn_obj *vector, + unsigned int i, + grn_obj *element_buffer) +{ + if (vector->header.type == GRN_UVECTOR) { + const unsigned int size = grn_uvector_element_size(ctx, vector); + grn_bulk_write_from(ctx, + element_buffer, + GRN_BULK_HEAD(vector) + (size * i), + 0, + size); + } else { + const char *value; + unsigned int size; + size = grn_vector_get_element(ctx, vector, i, &value, NULL, NULL); + GRN_TEXT_SET(ctx, element_buffer, value, size); + } +} + grn_rc grn_ii_column_update(grn_ctx *ctx, grn_ii *ii, grn_id rid, unsigned int section, grn_obj *oldvalue, grn_obj *newvalue, grn_obj *posting) @@ -6385,27 +6406,31 @@ grn_ii_column_update(grn_ctx *ctx, grn_ii *ii, grn_id rid, unsigned int section, unsigned int i, max_n; unsigned int old_n = 0, new_n = 0; if (old) { + grn_obj_flags flags = 0; old_n = grn_vector_size(ctx, old); - GRN_OBJ_INIT(&old_elem, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, old->header.domain); + if (old->header.type == GRN_VECTOR) { + flags |= GRN_OBJ_DO_SHALLOW_COPY; + } + GRN_OBJ_INIT(&old_elem, GRN_BULK, flags, old->header.domain); } if (new) { + grn_obj_flags flags = 0; new_n = grn_vector_size(ctx, new); - GRN_OBJ_INIT(&new_elem, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, new->header.domain); + if (old->header.type == GRN_VECTOR) { + flags |= GRN_OBJ_DO_SHALLOW_COPY; + } + GRN_OBJ_INIT(&new_elem, GRN_BULK, flags, new->header.domain); } max_n = (old_n > new_n) ? old_n : new_n; for (i = 0; i < max_n; i++) { grn_rc rc; grn_obj *old_p = NULL, *new_p = NULL; if (i < old_n) { - const char *str; - unsigned int size = grn_vector_get_element(ctx, old, i, &str, NULL, NULL); - GRN_TEXT_SET_REF(&old_elem, str, size); + grn_ii_column_update_get_element_value(ctx, old, i, &old_elem); old_p = &old_elem; } if (i < new_n) { - const char *str; - unsigned int size = grn_vector_get_element(ctx, new, i, &str, NULL, NULL); - GRN_TEXT_SET_REF(&new_elem, str, size); + grn_ii_column_update_get_element_value(ctx, new, i, &new_elem); new_p = &new_elem; } rc = grn_ii_column_update(ctx, ii, rid, section + i, old_p, new_p, posting); -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180307/6c8a594e/attachment-0001.htm