X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isam%2Fmemory.c;h=afb788775211a8948906f62cd72d5a9d119dedda;hb=e39158d4c6147865c129d2524f1b910e4e7921ed;hp=7962a0eb26fe7dae1832ea3995e4428a75a88d52;hpb=a5545de18b5d3762a1f29569a4b10ca5017506db;p=idzebra-moved-to-github.git diff --git a/isam/memory.c b/isam/memory.c index 7962a0e..afb7887 100644 --- a/isam/memory.c +++ b/isam/memory.c @@ -4,7 +4,23 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: memory.c,v $ - * Revision 1.4 1994-09-27 20:03:52 quinn + * 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 + * Fixed memory-consumption bug in memory.c + * Added more blocksizes to the default ISAM configuration. + * + * Revision 1.6 1995/09/04 12:33:47 adam + * Various cleanup. YAZ util used instead. + * + * Revision 1.5 1994/09/28 16:58:33 quinn + * Small mod. + * + * Revision 1.4 1994/09/27 20:03:52 quinn * Seems relatively bug-free. * * Revision 1.3 1994/09/26 17:11:30 quinn @@ -23,8 +39,9 @@ */ #include +#include -#include +#include #include int is_mbuf_size[3] = { 0, 1024, 4096 }; @@ -268,7 +285,7 @@ int is_m_write_record(is_mtable *tab, const void *rec) mbuf = tab->cur_mblock->cur_mbuf = mbuf->next; mbuf->cur_record = 0; } - log(LOG_DEBUG, "is_m_write_rec(rec == %d)", mbuf->cur_record); + 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++; @@ -323,7 +340,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; @@ -336,6 +353,13 @@ int is_m_read_record(is_mtable *tab, void *buf) { if (!mbuf->next) /* end of mblock */ { + if (!keep && tab->cur_mblock->state == IS_MBSTATE_CLEAN && + tab->cur_mblock->diskpos > 0) + { + xfree_mbufs(tab->cur_mblock->data); + tab->cur_mblock->data = 0; + tab->cur_mblock->state = IS_MBSTATE_UNREAD; + } if (tab->cur_mblock->next) { tab->cur_mblock = tab->cur_mblock->next; @@ -367,7 +391,7 @@ 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) { @@ -378,3 +402,14 @@ int is_m_seek_record(is_mtable *tab, const void *rec) return 0; } } + +int is_m_num_records(is_mtable *tab) +{ + if (tab->data->state < IS_MBSTATE_PARTIAL) + if (read_current_full(tab, tab->data) < 0) + { + logf (LOG_FATAL, "read full failed"); + exit(1); + } + return tab->num_records; +}