Fixed update bug. Repeated insertion in the same area sometimes caused
authorSebastian Hammer <quinn@indexdata.com>
Mon, 11 Mar 1996 14:52:23 +0000 (14:52 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Mon, 11 Mar 1996 14:52:23 +0000 (14:52 +0000)
problems.

isam/memory.c
isam/memory.h

index b5dcdfa..b57d2f9 100644 (file)
@@ -4,7 +4,11 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: memory.c,v $
- * Revision 1.11  1996-02-10 12:20:58  quinn
+ * Revision 1.12  1996-03-11 14:52:23  quinn
+ * Fixed update bug. Repeated insertion in the same area sometimes caused
+ * problems.
+ *
+ * Revision 1.11  1996/02/10  12:20:58  quinn
  * *** empty log message ***
  *
  * Revision 1.10  1995/12/12  14:12:47  quinn
@@ -154,6 +158,7 @@ void is_m_establish_tab(ISAM is, is_mtable *tab, ISAM_P pos)
        tab->data->data = 0;
        tab->cur_mblock = tab->data;
        tab->cur_mblock->cur_mbuf = 0;
+       tab->last_mbuf = 0;
     }
     else /* new block */
     {
@@ -166,6 +171,7 @@ void is_m_establish_tab(ISAM is, is_mtable *tab, ISAM_P pos)
        tab->cur_mblock = tab->data;
        tab->cur_mblock->cur_mbuf = tab->data->data;
        tab->cur_mblock->cur_mbuf->cur_record = 0;
+       tab->last_mbuf = 0;
     }
     tab->is = is;
 }
@@ -315,7 +321,10 @@ int is_m_write_record(is_mtable *tab, const void *rec)
 void is_m_unread_record(is_mtable *tab)
 {
     assert(tab->cur_mblock->cur_mbuf->cur_record);
-    tab->cur_mblock->cur_mbuf->cur_record--;
+    if (tab->last_mbuf)
+       tab->cur_mblock->cur_mbuf = tab->last_mbuf;
+    else
+       tab->cur_mblock->cur_mbuf->cur_record--;
 }
 
 /*
@@ -383,14 +392,20 @@ int is_m_read_record(is_mtable *tab, void *buf, int keep)
                    if (read_current_full(tab, tab->cur_mblock) < 0)
                        return -1;
                tab->cur_mblock->cur_mbuf = mbuf = tab->cur_mblock->data;
+               tab->last_mbuf = 0;
            }
            else
                return 0;   /* EOTable */
        }
        else
+       {
+           tab->last_mbuf = mbuf;
            tab->cur_mblock->cur_mbuf = mbuf = mbuf->next;
+       }
        mbuf->cur_record = 0;
     }
+    else
+       tab->last_mbuf = 0;
     memcpy(buf, mbuf->data + mbuf->offset + mbuf->cur_record *
        is_keysize(tab->is), is_keysize(tab->is));
     mbuf->cur_record++;
index d082556..e1bd1f0 100644 (file)
@@ -4,7 +4,11 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: memory.h,v $
- * Revision 1.4  1995-12-06 15:48:47  quinn
+ * Revision 1.5  1996-03-11 14:52:25  quinn
+ * Fixed update bug. Repeated insertion in the same area sometimes caused
+ * problems.
+ *
+ * Revision 1.4  1995/12/06  15:48:47  quinn
  * Fixed update-problem.
  *
  * Revision 1.3  1994/09/28  16:58:33  quinn
@@ -76,6 +80,7 @@ typedef struct is_mtable
     int num_records;               /* total number of records */
     int pos_type;                  /* blocktype */
     is_mblock *cur_mblock;
+    is_mbuf *last_mbuf;
     is_mblock *data;               /* blocks contained in this table */
     ISAM is;
 } is_mtable;