[Groonga-commit] groonga/groonga [master] implemented grn_obj_get_values()

Back to archive index

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




Groonga-commit メーリングリストの案内
Back to archive index