From 1d81c32c736b0b108f1739b25cd46efec0cec34c Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 6 Mar 1998 13:54:02 +0000 Subject: [PATCH] Fixed two nasty bugs in isc_merge. --- CHANGELOG | 2 ++ index/invstat.c | 9 ++++++--- isamc/isamc.c | 32 ++++++++++++++++++++++++-------- isamc/merge.c | 16 +++++++++------- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index dcdc5c1..449a947 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +Fixed two bugs in ISAMC system. + Changed the way Zebra keeps its maintenance information. Records in "SGML" notation using an EXPLAIN schema is now used when appropriate. diff --git a/index/invstat.c b/index/invstat.c index 2e14ede..fedd31d 100644 --- a/index/invstat.c +++ b/index/invstat.c @@ -1,10 +1,13 @@ /* - * Copyright (C) 1994-1997, Index Data I/S + * Copyright (C) 1994-1998, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: invstat.c,v $ - * Revision 1.5 1997-09-17 12:19:13 adam + * Revision 1.6 1998-03-06 13:54:02 adam + * Fixed two nasty bugs in isc_merge. + * + * Revision 1.5 1997/09/17 12:19:13 adam * Zebra version corresponds to YAZ version 1.4. * Changed Zebra server so that it doesn't depend on global common_resource. * @@ -108,7 +111,7 @@ void inv_prstat (BFiles bfs) logf (LOG_FATAL, "dict_open fail"); exit (1); } - if (res_get_match (common_resource, "isam", "c", NULL)) + if (!res_get_match (common_resource, "isam", "i", NULL)) { isamc = isc_open (bfs, FNAME_ISAMC, 0, key_isamc_m (common_resource)); if (!isamc) diff --git a/isamc/isamc.c b/isamc/isamc.c index 6d64d79..b1e8fe2 100644 --- a/isamc/isamc.c +++ b/isamc/isamc.c @@ -1,10 +1,13 @@ /* - * Copyright (c) 1995-1996, Index Data. + * Copyright (c) 1995-1998, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: isamc.c,v $ - * Revision 1.8 1997-09-17 12:19:20 adam + * Revision 1.9 1998-03-06 13:54:02 adam + * Fixed two nasty bugs in isc_merge. + * + * Revision 1.8 1997/09/17 12:19:20 adam * Zebra version corresponds to YAZ version 1.4. * Changed Zebra server so that it doesn't depend on global common_resource. * @@ -53,13 +56,20 @@ static void release_fc (ISAMC is, int cat); static void init_fc (ISAMC is, int cat); +#define SMALL_TEST 0 + ISAMC_M isc_getmethod (void) { static struct ISAMC_filecat_s def_cat[] = { +#if SMALL_TEST + { 32, 28, 0, 3 }, + { 64, 54, 30, 0 }, +#else { 32, 28, 0, 20 }, { 512, 490, 100, 20 }, { 4096, 3950, 1000, 20 }, {32768, 32000, 10000, 0 }, +#endif }; ISAMC_M m = xmalloc (sizeof(*m)); m->filecat = def_cat; @@ -334,8 +344,8 @@ ISAMC_PP isc_pp_open (ISAMC is, ISAMC_P ipos) pp->offset = src - pp->buf; assert (pp->offset == ISAMC_BLOCK_OFFSET_1); if (is->method->debug > 2) - logf (LOG_LOG, "isc: read_block size=%d %d %d", - pp->size, pp->cat, pp->pos); + logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d", + pp->size, pp->cat, pp->pos, pp->next); } return pp; } @@ -346,7 +356,11 @@ int isc_pp_read (ISAMC_PP pp, void *buf) return isc_read_item (pp, (char **) &buf); } -/* returns non-zero if item could be read; 0 otherwise */ +/* read one item from file - decode and store it in *dst. + Returns + 0 if end-of-file + 1 if item could be read ok and NO boundary + 2 if item could be read ok and boundary */ int isc_read_item (ISAMC_PP pp, char **dst) { ISAMC is = pp->is; @@ -354,10 +368,12 @@ int isc_read_item (ISAMC_PP pp, char **dst) if (pp->offset >= pp->size) { + /* out new block position */ pp->pos = pp->next; if (!pp->pos) - return 0; + return 0; /* end of file */ src = pp->buf; + /* read block and save 'next' and 'size' entry */ isc_read_block (is, pp->cat, pp->pos, src); memcpy (&pp->next, src, sizeof(pp->next)); src += sizeof(pp->next); @@ -371,8 +387,8 @@ int isc_read_item (ISAMC_PP pp, char **dst) (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src); pp->offset = src - pp->buf; if (is->method->debug > 2) - logf (LOG_LOG, "isc: read_block size=%d %d %d", - pp->size, pp->cat, pp->pos); + logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d", + pp->size, pp->cat, pp->pos, pp->next); return 2; } (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src); diff --git a/isamc/merge.c b/isamc/merge.c index c2578a8..b2092c1 100644 --- a/isamc/merge.c +++ b/isamc/merge.c @@ -1,10 +1,13 @@ /* - * 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.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 @@ -219,8 +222,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, @@ -333,8 +335,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 +410,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; } } -- 1.7.10.4