null+****@clear*****
null+****@clear*****
2011年 12月 22日 (木) 00:39:34 JST
Daijiro MORI 2011-12-21 15:39:34 +0000 (Wed, 21 Dec 2011) New Revision: 8b87c190a1696c61f17d75a9cf48e4f7c3b06d00 Log: implemented grn_obj_get_values() Modified files: lib/db.c Modified: lib/db.c (+19 -8) =================================================================== --- lib/db.c 2011-12-21 09:39:35 +0000 (a11d602) +++ lib/db.c 2011-12-21 15:39:34 +0000 (20f2ea1) @@ -5531,16 +5531,27 @@ grn_obj_get_values(grn_ctx *ctx, grn_obj *obj, grn_id offset, void **values) int nrecords = -1; GRN_API_ENTER; if (obj->header.type == GRN_COLUMN_FIX_SIZE) { - grn_ra *ra = (grn_ra *)obj; grn_obj *domain = grn_column_table(ctx, obj); - -table_size - - void *p = grn_ra_ref(ctx, ra, offset); - if (p) { - nrecords = ra->element_mask + 1 - (offset & ra->element_mask); + if (domain) { + int table_size = (int)grn_table_size(ctx, domain); + if (0 < offset && offset <= table_size) { + grn_ra *ra = (grn_ra *)obj; + void *p = grn_ra_ref(ctx, ra, offset); + if (p) { + if ((offset >> ra->element_width) == (table_size >> ra->element_width)) { + nrecords = (table_size & ra->element_mask) + 1 - (offset & ra->element_mask); + } else { + nrecords = ra->element_mask + 1 - (offset & ra->element_mask); + } + if (values) { *values = p; } + } else { + ERR(GRN_NO_MEMORY_AVAILABLE, "ra get failed"); + } + } else { + nrecords = 0; + } } else { - ERR(GRN_NO_MEMORY_AVAILABLE, "ra get failed"); + ERR(GRN_INVALID_ARGUMENT, "no domain found"); } } else { ERR(GRN_INVALID_ARGUMENT, "obj is not a fix sized column");