X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isam%2Fmemory.c;h=027b72cb87efdf0383b82c9e71f0d6dca00be944;hb=b8d492961ba89859e02543581d097b75a59b546c;hp=475b5fc01a7ab8a1eedd1808a3a13e5d92f696d4;hpb=fa2e85c18627b18737723d91e08c752d9931f589;p=idzebra-moved-to-github.git diff --git a/isam/memory.c b/isam/memory.c index 475b5fc..027b72c 100644 --- a/isam/memory.c +++ b/isam/memory.c @@ -4,7 +4,23 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: memory.c,v $ - * Revision 1.8 1995-12-06 14:48:27 quinn + * Revision 1.13 1996-03-20 13:29:16 quinn + * Bug-fix + * + * 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 + * *** empty log message *** + * + * Revision 1.9 1995/12/06 15:48:46 quinn + * Fixed update-problem. + * + * Revision 1.8 1995/12/06 14:48:27 quinn * Fixed some strange bugs. * * Revision 1.7 1995/12/06 09:59:46 quinn @@ -145,6 +161,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 */ { @@ -157,6 +174,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; } @@ -227,18 +245,28 @@ void is_m_delete_record(is_mtable *tab) mbuf->num--; mbuf->cur_record--; } - else /* middle of a block */ + else if (mbuf->cur_record == 1) /* beginning of mbuf */ + { + mbuf->num--; + mbuf->offset +=is_keysize(tab->is); + mbuf->cur_record = 0; + } + else /* middle of mbuf */ { + /* insert block after current one */ new = xmalloc_mbuf(IS_MBUF_TYPE_SMALL); new->next = mbuf->next; mbuf->next = new; + + /* virtually transfer everything after current record to new one. */ new->data = mbuf->data; mbuf->refcount++; new->offset = mbuf->offset + mbuf->cur_record * is_keysize(tab->is); new->num = mbuf->num - mbuf->cur_record; + + /* old buf now only contains stuff before current record */ mbuf->num = mbuf->cur_record -1; - mbuf = mbuf->next; - mbuf->cur_record = 0; + tab->cur_mblock->cur_mbuf = new; } tab->num_records--; tab->cur_mblock->num_records--; @@ -282,7 +310,9 @@ int is_m_write_record(is_mtable *tab, const void *rec) mbuf = tab->cur_mblock->cur_mbuf = mbuf->next; mbuf->cur_record = 0; } + /* logf (LOG_DEBUG, "is_m_write_rec(rec == %d)", mbuf->cur_record); + */ memcpy(mbuf->data + mbuf->offset + mbuf->cur_record * is_keysize(tab->is), rec, is_keysize(tab->is)); mbuf->num++; @@ -296,7 +326,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--; } /* @@ -337,7 +370,7 @@ int is_m_peek_record(is_mtable *tab, void *rec) return 1; } -int is_m_read_record(is_mtable *tab, void *buf) +int is_m_read_record(is_mtable *tab, void *buf, int keep) { is_mbuf *mbuf; @@ -350,7 +383,7 @@ int is_m_read_record(is_mtable *tab, void *buf) { if (!mbuf->next) /* end of mblock */ { - if (tab->cur_mblock->state == IS_MBSTATE_CLEAN && + if (!keep && tab->cur_mblock->state == IS_MBSTATE_CLEAN && tab->cur_mblock->diskpos > 0) { xfree_mbufs(tab->cur_mblock->data); @@ -364,14 +397,20 @@ int is_m_read_record(is_mtable *tab, void *buf) 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++; @@ -388,12 +427,12 @@ int is_m_seek_record(is_mtable *tab, const void *rec) for (;;) { - if (is_m_read_record(tab, &peek) <= 0) + if (is_m_read_record(tab, &peek, 1) <= 0) return 1; if ((rs = (*tab->is->cmp)(peek, rec)) > 0) { is_m_unread_record(tab); - return 1; + return rs; } else if (rs == 0) return 0;