X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=isamc%2Fmerge.c;h=27281942adc8afbe8cb6a13df0ee152e90734481;hb=154c6dacd76fe573d1d6ee3bc7284a05f0445bc6;hp=c2578a8072192eface8d87fa4d6d7f64cfdf89b4;hpb=5a4211916c8b14d4b0ec9cc717e613b88394affb;p=idzebra-moved-to-github.git diff --git a/isamc/merge.c b/isamc/merge.c index c2578a8..2728194 100644 --- a/isamc/merge.c +++ b/isamc/merge.c @@ -1,10 +1,16 @@ /* - * Copyright (c) 1996, Index Data. + * Copyright (c) 1996-1998, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: merge.c,v $ - * Revision 1.5 1997-02-12 20:42:43 adam + * Revision 1.7 1998-03-11 11:18:18 adam + * Changed the isc_merge to take into account the mfill (minimum-fill). + * + * Revision 1.6 1998/03/06 13:54:03 adam + * Fixed two nasty bugs in isc_merge. + * + * Revision 1.5 1997/02/12 20:42:43 adam * Bug fix: during isc_merge operations, some pages weren't marked dirty * even though they should be. At this point the merge operation marks * a page dirty if the previous page changed at all. A better approach is @@ -187,18 +193,18 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data) { /* the resulting output is of the same category as the the original - */ - if (mb[ptr].offset == r_offset) + */ + if (r_offset <= mb[ptr].offset +is->method->filecat[cat].mfill) { - /* the resulting output block is empty. Delete + /* the resulting output block is too small/empty. Delete the original (if any) - */ + */ if (is->method->debug > 3) logf (LOG_LOG, "isc: release A"); if (mb[ptr].block) isc_release_block (is, pp->cat, mb[ptr].block); mb[ptr].block = pp->pos; - mb[ptr].dirty = 2; + mb[ptr].dirty = 1; if (ptr > 0) mb[ptr-1].dirty = 1; } @@ -219,8 +225,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data) if (is->method->debug > 2) logf (LOG_LOG, "isc: flush A %d sections", ptr); flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat, - 0, &numKeys); - + 0, &pp->numKeys); mb[0].block = mb[ptr-1].block; mb[0].dirty = mb[ptr-1].dirty; memcpy (r_buf, r_buf + mb[ptr-1].offset, @@ -254,7 +259,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data) /* is next input item the same as current except for the delete flag? */ cmp = (*is->method->compare_item)(i_item, f_item); - if (!cmp && i_mode) + if (!cmp && i_mode) /* delete/insert nop? */ { /* yes! insert as if it was an insert only */ memcpy (r_item, i_item, i_item_ptr - i_item); @@ -333,8 +338,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data) if (is->method->debug > 2) logf (LOG_LOG, "isc: flush B %d sections", ptr-1); flush_blocks (is, mb, ptr-1, r_buf, &firstpos, cat, - 0, &numKeys); - + 0, &pp->numKeys); mb[0].block = mb[ptr-1].block; mb[0].dirty = mb[ptr-1].dirty; memcpy (r_buf, r_buf + mb[ptr-1].offset, @@ -409,7 +413,8 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I data) logf (LOG_LOG, "isc: release C"); isc_release_block (is, pp->cat, mb[ptr].block); mb[ptr].block = 0; - mb[ptr].dirty = 1; + if (ptr > 0) + mb[ptr-1].dirty = 1; } }