* Sebastian Hammer, Adam Dickmeiss
*
* $Log: memory.c,v $
- * Revision 1.6 1995-09-04 12:33:47 adam
+ * 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
+ * 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
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--;
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;
{
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;
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;