X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isam%2Fphysical.c;h=9837e00aa4b3b8c66cdaca234dbb1dce9e369d9f;hb=5260b5390d8a1a36c66e52083e8ebb9d26b49f01;hp=6779a89473a81a781ae00ea595d96cdc1b98b9df;hpb=fc5b1ebd4b23c1c55514a973f35ee98f2207597e;p=idzebra-moved-to-github.git diff --git a/isam/physical.c b/isam/physical.c index 6779a89..9837e00 100644 --- a/isam/physical.c +++ b/isam/physical.c @@ -4,7 +4,22 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: physical.c,v $ - * Revision 1.9 1996-02-06 10:19:57 quinn + * Revision 1.14 1997-09-09 13:38:12 adam + * Partial port to WIN95/NT. + * + * Revision 1.13 1996/10/29 13:56:57 adam + * Include of zebrautl.h instead of alexutil.h. + * + * Revision 1.12 1996/03/20 16:17:11 quinn + * Bug hunting + * + * Revision 1.11 1996/03/20 13:29:17 quinn + * Bug-fix + * + * Revision 1.10 1996/03/19 19:22:44 quinn + * Fixed update-bug + * + * Revision 1.9 1996/02/06 10:19:57 quinn * Attempt at fixing bug. Not all blocks were read before they were unlinked * prior to a remap operation. * @@ -40,7 +55,9 @@ #include #include +#include +#include #include static int is_freestore_alloc(ISAM is, int type) @@ -103,6 +120,7 @@ int is_p_read_partial(is_mtable *tab, is_mblock *block) /* extract header info */ buf->offset = 0; memcpy(&block->num_records, buf->data, sizeof(block->num_records)); + assert(block->num_records > 0); buf->offset += sizeof(block->num_records); memcpy(&block->nextpos, buf->data + buf->offset, sizeof(block->nextpos)); @@ -113,6 +131,9 @@ int is_p_read_partial(is_mtable *tab, is_mblock *block) sizeof(tab->num_records)); buf->offset +=sizeof(tab->num_records); } + logf(LOG_DEBUG, "R: Block #%d: num %d nextpos %d total %d", + block->diskpos, block->num_records, block->nextpos, + block == tab->data ? tab->num_records : -1); buf->num = (toread - buf->offset) / is_keysize(tab->is); if (buf->num >= block->num_records) { @@ -204,10 +225,15 @@ void is_p_sync(is_mtable *tab) sizeof(tab->num_records)); sum += sizeof(tab->num_records); } + logf (LOG_DEBUG, "W: Block #%d contains %d records.", p->diskpos, + p->num_records); + assert(p->num_records > 0); for (b = p->data; b; b = b->next) { - memcpy(type->dbuf + sum, b->data + b->offset, v = b->num * - is_keysize(tab->is)); + logf(LOG_DEBUG, " buf: offset %d, keys %d, type %d, ref %d", + b->offset, b->num, b->type, b->refcount); + if ((v = b->num * is_keysize(tab->is)) > 0) + memcpy(type->dbuf + sum, b->data + b->offset, v); sum += v; assert(sum <= type->blocksize); @@ -217,7 +243,6 @@ void is_p_sync(is_mtable *tab) logf (LOG_FATAL, "Failed to write block."); exit(1); } - logf (LOG_DEBUG, "W: Block #%d contains %d records.", p->diskpos, p->num_records); } } @@ -297,9 +322,27 @@ void is_p_align(is_mtable *tab) } else { - tab->data = tab->data->next; - tab->data->state = IS_MBSTATE_DIRTY; - next = tab->data; + next = tab->data->next; + if (next) + { + if (next->state < IS_MBSTATE_CLEAN) + { + if (is_p_read_full(tab, next) < 0) + { + logf(LOG_FATAL, "Error during re-alignment"); + abort(); + } + if (next->nextpos && !next->next) + { + next->next = xmalloc_mblock(); + next->next->diskpos = next->nextpos; + next->next->state = IS_MBSTATE_UNREAD; + next->next->data = 0; + } + } + next->state = IS_MBSTATE_DIRTY; /* force re-process */ + tab->data = next; + } } if (mblock->diskpos >= 0) is_freestore_free(tab->is, tab->pos_type, mblock->diskpos);