[Groonga-commit] groonga/groonga [master] ii inspector also shows unavailable entreies.

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2010年 9月 24日 (金) 15:13:35 JST


Kouhei Sutou	2010-09-24 06:13:35 +0000 (Fri, 24 Sep 2010)

  New Revision: abda249d462ad7299b160293f4197a7439fdf70e

  Log:
    ii inspector also shows unavailable entreies.

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+197 -7)
===================================================================
--- lib/ii.c    2010-09-24 02:10:54 +0000 (00174f0)
+++ lib/ii.c    2010-09-24 06:13:35 +0000 (98148d6)
@@ -6001,6 +6001,190 @@ grn_ii_resolve_sel_and(grn_ctx *ctx, grn_hash *s, grn_operator op)
   }
 }
 
+/* just for inspect */
+static grn_ii_posting *
+grn_ii_cursor_next_all(grn_ctx *ctx, grn_ii_cursor *c)
+{
+  if (c->buf) {
+    for (;;) {
+      if (c->stat & CHUNK_USED) {
+        for (;;) {
+          if (c->crp < c->cdp + c->cdf) {
+            uint32_t dgap = *c->crp++;
+            c->pc.rid += dgap;
+            if (dgap) { c->pc.sid = 0; }
+            if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
+              c->pc.sid += 1 + *c->csp++;
+            } else {
+              c->pc.sid = 1;
+            }
+            c->cpp += c->pc.rest;
+            c->pc.rest = c->pc.tf = 1 + *c->ctp++;
+            if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
+              c->pc.weight = *c->cwp++;
+            } else {
+              c->pc.weight = 0;
+            }
+            c->pc.pos = 0;
+            /*
+            {
+              static int count = 0;
+              int tf = c->pc.tf, pos = 0, *pp = (int *)c->cpp;
+              grn_obj buf;
+              GRN_TEXT_INIT(&buf, 0);
+              grn_text_itoa(ctx, &buf, c->pc.rid);
+              GRN_TEXT_PUTC(ctx, &buf, ':');
+              grn_text_itoa(ctx, &buf, c->pc.sid);
+              GRN_TEXT_PUTC(ctx, &buf, ':');
+              grn_text_itoa(ctx, &buf, c->pc.tf);
+              GRN_TEXT_PUTC(ctx, &buf, '(');
+              while (tf--) {
+                pos += *pp++;
+                count++;
+                grn_text_itoa(ctx, &buf, pos);
+                if (tf) { GRN_TEXT_PUTC(ctx, &buf, ':'); }
+              }
+              GRN_TEXT_PUTC(ctx, &buf, ')');
+              GRN_TEXT_PUTC(ctx, &buf, '\0');
+              GRN_LOG(ctx, GRN_LOG_NOTICE, "posting(%d):%s", count, GRN_TEXT_VALUE(&buf));
+              GRN_OBJ_FIN(ctx, &buf);
+            }
+            */
+          } else {
+            if (c->curr_chunk <= c->nchunks) {
+              if (c->curr_chunk == c->nchunks) {
+                if (c->cp < c->cpe) {
+                  grn_p_decv(ctx, c->cp, c->cpe - c->cp, c->rdv, c->ii->n_elements);
+                } else {
+                  c->pc.rid = 0;
+                  break;
+                }
+              } else {
+                uint8_t *cp;
+                grn_io_win iw;
+                uint32_t size = c->cinfo[c->curr_chunk].size;
+                if (size && (cp = WIN_MAP2(c->ii->chunk, ctx, &iw,
+                                           c->cinfo[c->curr_chunk].segno, 0,
+                                           size, grn_io_rdonly))) {
+                  grn_p_decv(ctx, cp, size, c->rdv, c->ii->n_elements);
+                  grn_io_win_unmap2(&iw);
+                } else {
+                  c->pc.rid = 0;
+                  break;
+                }
+              }
+              {
+                int j = 0;
+                c->cdf = c->rdv[j].data_size;
+                c->crp = c->cdp = c->rdv[j++].data;
+                if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
+                  c->csp = c->rdv[j++].data;
+                }
+                c->ctp = c->rdv[j++].data;
+                if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
+                  c->cwp = c->rdv[j++].data;
+                }
+                c->cpp = c->rdv[j].data;
+              }
+              c->pc.rid = 0;
+              c->pc.sid = 0;
+              c->pc.rest = 0;
+              c->curr_chunk++;
+              continue;
+            } else {
+              c->pc.rid = 0;
+            }
+          }
+          break;
+        }
+      }
+      if (c->stat & BUFFER_USED) {
+        if (c->nextb) {
+          uint32_t lrid = c->pb.rid, lsid = c->pb.sid; /* for check */
+          buffer_rec *br = BUFFER_REC_AT(c->buf, c->nextb);
+          if (buffer_is_reused(ctx, c->ii, c)) {
+            GRN_LOG(ctx, GRN_LOG_NOTICE, "buffer reused(%d,%d)", c->buffer_pseg, *c->ppseg);
+            // todo : rewind;
+          }
+          c->bp = NEXT_ADDR(br);
+          GRN_B_DEC(c->pb.rid, c->bp);
+          if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
+            GRN_B_DEC(c->pb.sid, c->bp);
+          } else {
+            c->pb.sid = 1;
+          }
+          if (lrid > c->pb.rid || (lrid == c->pb.rid && lsid >= c->pb.sid)) {
+            ERR(GRN_FILE_CORRUPT, "brokend!! (%d:%d) -> (%d:%d) (%d->%d)", lrid, lsid, c->pb.rid, c->pb.sid, c->buffer_pseg, *c->ppseg);
+          }
+          c->nextb = br->step;
+          GRN_B_DEC(c->pb.tf, c->bp);
+          if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
+            GRN_B_DEC(c->pb.weight, c->bp);
+          } else {
+            c->pb.weight = 0;
+          }
+          c->pb.rest = c->pb.tf;
+          c->pb.pos = 0;
+        } else {
+          c->pb.rid = 0;
+        }
+      }
+      if (c->pb.rid) {
+        if (c->pc.rid) {
+          if (c->pc.rid < c->pb.rid) {
+            c->stat = CHUNK_USED;
+            c->post = &c->pc;
+            break;
+          } else {
+            if (c->pb.rid < c->pc.rid) {
+              c->stat = BUFFER_USED;
+              c->post = &c->pb;
+              break;
+            } else {
+              if (c->pb.sid) {
+                if (c->pc.sid < c->pb.sid) {
+                  c->stat = CHUNK_USED;
+                  c->post = &c->pc;
+                  break;
+                } else {
+                  c->stat = BUFFER_USED;
+                  if (c->pb.sid == c->pc.sid) { c->stat |= CHUNK_USED; }
+                  c->post = &c->pb;
+                  break;
+                }
+              } else {
+                c->stat = CHUNK_USED;
+              }
+            }
+          }
+        } else {
+          c->stat = BUFFER_USED;
+          c->post = &c->pb;
+          break;
+        }
+      } else {
+        if (c->pc.rid) {
+          c->stat = CHUNK_USED;
+          c->post = &c->pc;
+          break;
+        } else {
+          c->post = NULL;
+          return NULL;
+        }
+      }
+    }
+  } else {
+    if (c->stat & SOLE_DOC_USED) {
+      c->post = NULL;
+      return NULL;
+    } else {
+      c->post = &c->pb;
+      c->stat |= SOLE_DOC_USED;
+    }
+  }
+  return c->post;
+}
+
 void
 grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
 {
@@ -6009,7 +6193,7 @@ grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
   int key_size;
   int i = 0;
 
-  GRN_TEXT_PUTS(ctx, buf, "#<");
+  GRN_TEXT_PUTS(ctx, buf, "  #<");
   key_size = grn_table_get_key(ctx, c->ii->lexicon, c->id,
                                key, GRN_TABLE_MAX_KEY_SIZE);
   GRN_OBJ_INIT(&key_buf, GRN_BULK, 0, c->ii->lexicon->header.domain);
@@ -6017,14 +6201,20 @@ grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
   grn_inspect(ctx, buf, &key_buf);
   GRN_OBJ_FIN(ctx, &key_buf);
 
-  GRN_TEXT_PUTS(ctx, buf, " elements:[");
-  while (grn_ii_cursor_next(ctx, c)) {
+  GRN_TEXT_PUTS(ctx, buf, "\n    elements:[\n      ");
+  while (grn_ii_cursor_next_all(ctx, c)) {
     grn_ii_posting *pos = c->post;
     if (i > 0) {
-      GRN_TEXT_PUTS(ctx, buf, ", ");
+      GRN_TEXT_PUTS(ctx, buf, ",\n      ");
     }
     i++;
-    GRN_TEXT_PUTS(ctx, buf, "{rid:");
+    GRN_TEXT_PUTS(ctx, buf, "{status:");
+    if (pos->tf && pos->sid) {
+      GRN_TEXT_PUTS(ctx, buf, "available");
+    } else {
+      GRN_TEXT_PUTS(ctx, buf, "garbage");
+    }
+    GRN_TEXT_PUTS(ctx, buf, ", rid:");
     grn_text_lltoa(ctx, buf, pos->rid);
     GRN_TEXT_PUTS(ctx, buf, ", sid:");
     grn_text_lltoa(ctx, buf, pos->sid);
@@ -6038,7 +6228,7 @@ grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
     grn_text_lltoa(ctx, buf, pos->rest);
     GRN_TEXT_PUTS(ctx, buf, "}");
   }
-  GRN_TEXT_PUTS(ctx, buf, "]>");
+  GRN_TEXT_PUTS(ctx, buf, "\n    ]\n  >");
 }
 
 void
@@ -6056,7 +6246,7 @@ grn_ii_inspect_elements(grn_ctx *ctx, grn_ii *ii, grn_obj *buf)
         GRN_TEXT_PUTS(ctx, buf, ",");
       }
       i++;
-      GRN_TEXT_PUTS(ctx, buf, "\n  ");
+      GRN_TEXT_PUTS(ctx, buf, "\n");
       if ((c = grn_ii_cursor_open(ctx, ii, tid, GRN_ID_NIL, GRN_ID_MAX,
                                   ii->n_elements,
                                   GRN_OBJ_WITH_POSITION|GRN_OBJ_WITH_SECTION))) {




Groonga-commit メーリングリストの案内
Zurück zum Archiv-Index