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");