Bug fix for deletes (max_item 2)
[idzebra-moved-to-github.git] / rset / rsbetween.c
index 8758795..83867fb 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.
  * Heikki Levanto
  *
- * $Id: rsbetween.c,v 1.2 2002-04-12 14:51:34 heikki Exp $
+ * $Id: rsbetween.c,v 1.5 2002-04-12 15:25:03 heikki Exp $
  */
 
 #include <stdio.h>
@@ -46,7 +46,7 @@ struct rset_between_info {
     RSET rset_r;
     int term_index_s;
     int (*cmp)(const void *p1, const void *p2);
-    char *(*printer)(void *p1, char *buf);
+    char *(*printer)(const void *p1, char *buf);
     struct rset_between_rfd *rfd_list;
 };
 
@@ -191,6 +191,18 @@ static int r_count_between (RSET ct)
     return 0;
 }
 
+static void logit( struct rset_between_info *info, char *prefix, void *l, void *m, void *r)
+{
+    char buf_l[32];
+    char buf_m[32];
+    char buf_r[32];
+    logf(LOG_DEBUG,"btw: %s l=%s m=%s r=%s",
+      prefix, 
+      (*info->printer)(l, buf_l),
+      (*info->printer)(m, buf_m),
+      (*info->printer)(r, buf_r) );
+}
+
 static int r_read_between (RSFD rfd, void *buf, int *term_index)
 {
     struct rset_between_rfd *p = (struct rset_between_rfd *) rfd;
@@ -200,12 +212,15 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
 
     while (p->more_m)
     {
+        logit( info, "start of loop", p->buf_l, p->buf_m, p->buf_r);
 
        /* forward L until past m, count levels, note rec boundaries */
        if (p->more_l)
            cmp_l= (*info->cmp)(p->buf_l, p->buf_m);
        else
            cmp_l=2; /* past this record */
+        logf(LOG_DEBUG, "cmp_l=%d", cmp_l);
+
         while (cmp_l < 0)   /* l before m */
        {
             if (cmp_l == -2)
@@ -217,6 +232,8 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
                 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l,
                                   &p->term_index_l);
                cmp_l= (*info->cmp)(p->buf_l, p->buf_m);
+                logit( info, "forwarded L", p->buf_l, p->buf_m, p->buf_r);
+                logf(LOG_DEBUG, "  cmp_l=%d", cmp_l);
             }
             else
                cmp_l=2; 
@@ -227,6 +244,7 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
            cmp_r= (*info->cmp)(p->buf_r, p->buf_m);
        else
            cmp_r=2; 
+        logf(LOG_DEBUG, "cmp_r=%d", cmp_r);
         while (cmp_r < 0)   /* r before m */
        {
            /* -2, earlier record, doesn't matter */
@@ -237,6 +255,8 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
                 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r,
                                   &p->term_index_r);
                cmp_r= (*info->cmp)(p->buf_r, p->buf_m);
+                logit( info, "forwarded R", p->buf_l, p->buf_m, p->buf_r);
+                logf(LOG_DEBUG, "  cmp_r=%d", cmp_r);
             }
             else
                cmp_r=2; 
@@ -249,6 +269,9 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
        {
            memcpy (buf, p->buf_m, info->key_size);
             *term_index = p->term_index_m;
+            logit( info, "Returning a hit (m)", p->buf_l, p->buf_m, p->buf_r);
+            p->more_m = rset_read (info->rset_m, p->rfd_m, p->buf_m,
+                                   &p->term_index_m);
            return 1;  
        }
        else
@@ -259,8 +282,10 @@ static int r_read_between (RSFD rfd, void *buf, int *term_index)
                                &p->term_index_m);
     } /* while more_m */
       
+    logf(LOG_DEBUG,"Exiting, no more stuff in m");
     return 0;  /* no more data possible */
 
+
 }  /* r_read */