Kouhei Sutou
null+****@clear*****
Wed Jul 9 22:58:41 JST 2014
Kouhei Sutou 2014-07-09 22:58:41 +0900 (Wed, 09 Jul 2014) New Revision: 59e5a66662f177878e8fb96dfb43585ef3ca7414 https://github.com/groonga/groonga/commit/59e5a66662f177878e8fb96dfb43585ef3ca7414 Merged 9442a12: Merge pull request #181 from groonga/support-uvector-with-weight Message: Really support weight in uvector The current bulk stores its value size into flags field when value embedded mode (= !GRN_BULK_OUTP(bulk)). We can't use flags field to store GRN_OBJ_WITH_WEIGHT flag when the bulk is value embedded mode. This commit changes flags behavior in value embedded mode. The current GRN_BULK_BUFSIZE is 24 bytes. So we can use higher order bits in flags field. To use higher order bits in flags field, this change use mask to get value size in value embedded mode. This change will not break API and ABI. But we need to rebuild related codes that use uvector with weight. Rroonga will be the code. It will not be a problem because there are no these codes for now. Newer codes must be built. TODO: * Support outputting uvector with weight in select command and dump command. Modified files: include/groonga.h lib/db.c lib/str.c Modified: include/groonga.h (+8 -5) =================================================================== --- include/groonga.h 2014-07-09 22:32:15 +0900 (1f10ac3) +++ include/groonga.h 2014-07-09 22:58:41 +0900 (ca0562c) @@ -1141,6 +1141,9 @@ GRN_API const char *grn_default_query_logger_get_path(void); /* grn_bulk */ #define GRN_BULK_BUFSIZE (sizeof(grn_obj) - sizeof(grn_obj_header)) +/* This assumes that GRN_BULK_BUFSIZE is less than 32 (= 0x20). */ +#define GRN_BULK_BUFSIZE_MAX 0x1f +#define GRN_BULK_SIZE_IN_FLAGS(flags) ((flags) & GRN_BULK_BUFSIZE_MAX) #define GRN_BULK_OUTP(bulk) ((bulk)->header.impl_flags & GRN_OBJ_OUTPLACE) #define GRN_BULK_REWIND(bulk) do {\ if ((bulk)->header.type == GRN_VECTOR) {\ @@ -1149,7 +1152,7 @@ GRN_API const char *grn_default_query_logger_get_path(void); if (GRN_BULK_OUTP(_body)) {\ (_body)->u.b.curr = (_body)->u.b.head;\ } else {\ - (_body)->header.flags = 0;\ + (_body)->header.flags &= ~GRN_BULK_BUFSIZE_MAX;\ }\ }\ (bulk)->u.v.n_sections = 0;\ @@ -1157,7 +1160,7 @@ GRN_API const char *grn_default_query_logger_get_path(void); if (GRN_BULK_OUTP(bulk)) {\ (bulk)->u.b.curr = (bulk)->u.b.head;\ } else {\ - (bulk)->header.flags = 0;\ + (bulk)->header.flags &= ~GRN_BULK_BUFSIZE_MAX;\ }\ }\ } while (0) @@ -1172,11 +1175,11 @@ GRN_API const char *grn_default_query_logger_get_path(void); #define GRN_BULK_VSIZE(bulk) \ (GRN_BULK_OUTP(bulk)\ ? ((bulk)->u.b.curr - (bulk)->u.b.head)\ - : (bulk)->header.flags) + : GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags)) #define GRN_BULK_EMPTYP(bulk) \ (GRN_BULK_OUTP(bulk)\ ? ((bulk)->u.b.curr == (bulk)->u.b.head)\ - : !((bulk)->header.flags)) + : !(GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags))) #define GRN_BULK_HEAD(bulk) \ (GRN_BULK_OUTP(bulk)\ ? ((bulk)->u.b.head)\ @@ -1184,7 +1187,7 @@ GRN_API const char *grn_default_query_logger_get_path(void); #define GRN_BULK_CURR(bulk) \ (GRN_BULK_OUTP(bulk)\ ? ((bulk)->u.b.curr)\ - : (char *)&((bulk)->u.b.head) + (bulk)->header.flags) + : (char *)&((bulk)->u.b.head) + GRN_BULK_SIZE_IN_FLAGS((bulk)->header.flags)) #define GRN_BULK_TAIL(bulk) \ (GRN_BULK_OUTP(bulk)\ ? ((bulk)->u.b.tail)\ Modified: lib/db.c (+6 -6) =================================================================== --- lib/db.c 2014-07-09 22:32:15 +0900 (0bc37b8) +++ lib/db.c 2014-07-09 22:58:41 +0900 (93b32af) @@ -37,7 +37,7 @@ typedef struct { unsigned int weight; } weight_uvector_entry; -#define IS_WEIGHT_UVECTOR(obj) ((obj)->header.impl_flags & GRN_OBJ_WITH_WEIGHT) +#define IS_WEIGHT_UVECTOR(obj) ((obj)->header.flags & GRN_OBJ_WITH_WEIGHT) #define NEXT_ADDR(p) (((byte *)(p)) + sizeof(*(p))) @@ -5625,7 +5625,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column, if (need_convert) { unsigned int i, n; GRN_VALUE_FIX_SIZE_INIT(&uvector, GRN_OBJ_VECTOR, value->header.domain); - uvector.header.impl_flags |= uvector_flags; + uvector.header.flags |= uvector_flags; n = grn_uvector_size(ctx, value); for (i = 0; i < n; i++) { grn_id id; @@ -5982,9 +5982,9 @@ grn_obj_get_value_column_vector(grn_ctx *ctx, grn_obj *obj, grn_ja_get_value(ctx, (grn_ja *)obj, id, value); value->header.type = GRN_UVECTOR; if (obj->header.flags & GRN_OBJ_WITH_WEIGHT) { - value->header.impl_flags |= GRN_OBJ_WITH_WEIGHT; + value->header.flags |= GRN_OBJ_WITH_WEIGHT; } else { - value->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT; + value->header.flags &= ~GRN_OBJ_WITH_WEIGHT; } } @@ -8099,7 +8099,7 @@ grn_obj_ensure_vector(grn_ctx *ctx, grn_obj *obj) { if (obj->header.type != GRN_VECTOR) { grn_bulk_fin(ctx, obj); } obj->header.type = GRN_VECTOR; - obj->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT; + obj->header.flags &= ~GRN_OBJ_WITH_WEIGHT; } static void @@ -8107,7 +8107,7 @@ grn_obj_ensure_bulk(grn_ctx *ctx, grn_obj *obj) { if (obj->header.type == GRN_VECTOR) { VECTOR_CLEAR(ctx, obj); } obj->header.type = GRN_BULK; - obj->header.impl_flags &= ~GRN_OBJ_WITH_WEIGHT; + obj->header.flags &= ~GRN_OBJ_WITH_WEIGHT; } grn_rc Modified: lib/str.c (+2 -1) =================================================================== --- lib/str.c 2014-07-09 22:32:15 +0900 (08cdbe0) +++ lib/str.c 2014-07-09 22:58:41 +0900 (111e881) @@ -2000,7 +2000,8 @@ grn_bulk_truncate(grn_ctx *ctx, grn_obj *bulk, unsigned int len) if (GRN_BULK_BUFSIZE < len) { return grn_bulk_space_clear(ctx, bulk, len); } else { - bulk->header.flags = len; + bulk->header.flags &= ~GRN_BULK_BUFSIZE_MAX; + bulk->header.flags += len; } } return GRN_SUCCESS; -------------- next part -------------- HTML����������������������������...Download