X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=isam%2Fmemory.c;h=d6e3a62d34fb533e585d542c00d4b6249aa3d2ed;hp=d7a327cd0cc4b342f00562942442809c0e32c15a;hb=ef696645cc3b7e0f4027008d1dc589c0f0f90c1f;hpb=c4d2b754d90faad6cf76b0c380113b5a78b1d889 diff --git a/isam/memory.c b/isam/memory.c index d7a327c..d6e3a62 100644 --- a/isam/memory.c +++ b/isam/memory.c @@ -1,10 +1,32 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: memory.c,v $ - * Revision 1.10 1995-12-12 14:12:47 quinn + * Revision 1.17 1999-05-26 07:49:14 adam + * C++ compilation. + * + * Revision 1.16 1999/02/02 14:51:20 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.15 1997/09/09 13:38:11 adam + * Partial port to WIN95/NT. + * + * Revision 1.14 1996/10/29 13:56:56 adam + * Include of zebrautl.h instead of alexutil.h. + * + * 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 @@ -43,8 +65,10 @@ #include #include +#include +#include -#include +#include #include int is_mbuf_size[3] = { 0, 1024, 4096 }; @@ -61,7 +85,8 @@ is_mblock *xmalloc_mblock() if (!mblock_freelist) { - mblock_freelist = xmalloc(sizeof(is_mblock) * MALLOC_CHUNK); + mblock_freelist = (is_mblock *) + xmalloc(sizeof(is_mblock) * MALLOC_CHUNK); for (i = 0; i < MALLOC_CHUNK - 1; i++) mblock_freelist[i].next = &mblock_freelist[i+1]; mblock_freelist[i].next = 0; @@ -85,7 +110,7 @@ is_mbuf *xmalloc_mbuf(int type) } else { - tmp = xmalloc(sizeof(is_mbuf) + is_mbuf_size[type]); + tmp = (is_mbuf*) xmalloc(sizeof(is_mbuf) + is_mbuf_size[type]); tmp->type = type; } tmp->refcount = type ? 1 : 0; @@ -151,6 +176,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 */ { @@ -163,6 +189,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; } @@ -225,7 +252,7 @@ void is_m_replace_record(is_mtable *tab, const void *rec) */ void is_m_delete_record(is_mtable *tab) { - is_mbuf *mbuf, *new; + is_mbuf *mbuf, *inew; mbuf = tab->cur_mblock->cur_mbuf; if (mbuf->cur_record >= mbuf->num) /* top of mbuf */ @@ -233,18 +260,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 */ { - new = xmalloc_mbuf(IS_MBUF_TYPE_SMALL); - new->next = mbuf->next; - mbuf->next = new; - new->data = mbuf->data; + mbuf->num--; + mbuf->offset +=is_keysize(tab->is); + mbuf->cur_record = 0; + } + else /* middle of mbuf */ + { + /* insert block after current one */ + inew = xmalloc_mbuf(IS_MBUF_TYPE_SMALL); + inew->next = mbuf->next; + mbuf->next = inew; + + /* virtually transfer everything after current record to new one. */ + inew->data = mbuf->data; mbuf->refcount++; - new->offset = mbuf->offset + mbuf->cur_record * is_keysize(tab->is); - new->num = mbuf->num - mbuf->cur_record; + inew->offset = mbuf->offset + mbuf->cur_record * is_keysize(tab->is); + inew->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 = inew; } tab->num_records--; tab->cur_mblock->num_records--; @@ -288,7 +325,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++; @@ -302,7 +341,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--; } /* @@ -370,14 +412,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++;