X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=isamc%2Fmerge.c;h=4fa46d49c29ecd071680b73e78fd8fc98d8bea1d;hp=e0abc2fb1c2421aa73d684609938d65565303291;hb=4478d785b7769691261005c98063b98a5a5971b3;hpb=6c9fcd3b5d3108702fa1ffc92dab4ab6060f9a19 diff --git a/isamc/merge.c b/isamc/merge.c index e0abc2f..4fa46d4 100644 --- a/isamc/merge.c +++ b/isamc/merge.c @@ -1,5 +1,5 @@ -/* $Id: merge.c,v 1.29 2005-01-15 19:38:31 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: merge.c,v 1.32 2006-08-14 10:40:19 adam Exp $ + Copyright (C) 1995-2006 Index Data ApS This file is part of the Zebra server. @@ -15,9 +15,9 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with Zebra; see the file LICENSE.zebra. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include @@ -27,14 +27,14 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "isamc-p.h" -struct isc_merge_block { - int offset; /* offset in r_buf */ - zint block; /* block number of file (0 if none) */ - int dirty; /* block is different from that on file */ +struct isamc_merge_block { + int offset; /* offset in r_buf */ + zint block; /* block number of file (0 if none) */ + int dirty; /* block is different from that on file */ }; #if 0 -static void opt_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, +static void opt_blocks (ISAMC is, struct isamc_merge_block *mb, int ptr, int last) { int i, no_dirty = 0; @@ -63,7 +63,7 @@ static void opt_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, } #endif -static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, +static void flush_blocks (ISAMC is, struct isamc_merge_block *mb, int ptr, char *r_buf, zint *firstpos, int cat, int last, zint *numkeys) { @@ -74,7 +74,7 @@ static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, /* consider this block number */ if (!mb[i].block) { - mb[i].block = isc_alloc_block (is, cat); + mb[i].block = isamc_alloc_block (is, cat); mb[i].dirty = 1; } @@ -83,7 +83,7 @@ static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, mb[i+1].block = 0; else if (!mb[i+1].block) { - mb[i+1].block = isc_alloc_block (is, cat); + mb[i+1].block = isamc_alloc_block (is, cat); mb[i+1].dirty = 1; mb[i].dirty = 1; } @@ -131,11 +131,11 @@ static void flush_blocks (ISAMC is, struct isc_merge_block *mb, int ptr, } memcpy (src, &mb[i+1].block, sizeof(zint)); memcpy (src+sizeof(zint), &ssize, sizeof(ssize)); - isc_write_block (is, cat, mb[i].block, src); + isamc_write_block (is, cat, mb[i].block, src); } } -static int get_border (ISAMC is, struct isc_merge_block *mb, zint ptr, +static int get_border (ISAMC is, struct isamc_merge_block *mb, zint ptr, int cat, zint firstpos) { /* Border set to initial fill or block size depending on @@ -151,7 +151,7 @@ static int get_border (ISAMC is, struct isc_merge_block *mb, zint ptr, return mb[ptr].offset + fill - off; } -ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) +void isamc_merge (ISAMC is, ISAM_P *ipos, ISAMC_I *data) { char i_item[128], *i_item_ptr; @@ -163,7 +163,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) int last_dirty = 0; int debug = is->method->debug; - struct isc_merge_block mb[200]; + struct isamc_merge_block mb[200]; zint firstpos = 0; int cat = 0; @@ -178,16 +178,16 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) r_clientData = (*is->method->codec.start)(); r_buf = is->merge_buf + 128; - pp = isc_pp_open (is, ipos); + pp = isamc_pp_open (is, *ipos); /* read first item from file. make sure f_more indicates no boundary */ f_item_ptr = f_item; - f_more = isc_read_item (pp, &f_item_ptr); + f_more = isamc_read_item (pp, &f_item_ptr); if (f_more > 0) f_more = 1; cat = pp->cat; if (debug > 1) - yaz_log (YLOG_LOG, "isc: isc_merge begin %d " ZINT_FORMAT, cat, pp->pos); + yaz_log (YLOG_LOG, "isc: isamc_merge begin %d " ZINT_FORMAT, cat, pp->pos); /* read first item from i */ i_item_ptr = i_item; @@ -220,7 +220,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) if (debug > 3) yaz_log (YLOG_LOG, "isc: release A"); if (mb[ptr].block) - isc_release_block (is, pp->cat, mb[ptr].block); + isamc_release_block (is, pp->cat, mb[ptr].block); mb[ptr].block = pp->pos; if (!mb[ptr].dirty) mb[ptr].dirty = 1; @@ -306,14 +306,14 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) } /* move f */ f_item_ptr = f_item; - f_more = isc_read_item (pp, &f_item_ptr); + f_more = isamc_read_item (pp, &f_item_ptr); } else if (cmp > 0) /* insert f */ { memcpy (r_item, f_item, f_item_ptr - f_item); /* move f */ f_item_ptr = f_item; - f_more = isc_read_item (pp, &f_item_ptr); + f_more = isamc_read_item (pp, &f_item_ptr); } else /* insert i */ { @@ -391,7 +391,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) /* delete all original block(s) read so far */ for (i = 0; i < ptr; i++) if (mb[i].block) - isc_release_block (is, pp->cat, mb[i].block); + isamc_release_block (is, pp->cat, mb[i].block); /* also delete all block to be read in the future */ pp->deleteFlag = 1; @@ -438,7 +438,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) { if (debug > 3) yaz_log (YLOG_LOG, "isc: release C"); - isc_release_block (is, pp->cat, mb[ptr].block); + isamc_release_block (is, pp->cat, mb[ptr].block); mb[ptr].block = 0; if (ptr > 0) mb[ptr-1].dirty = 1; @@ -452,7 +452,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) { /* we have to patch initial block with num keys if that has changed */ - if (numKeys != isc_pp_num (pp)) + if (numKeys != isamc_pp_num (pp)) { if (debug > 2) yaz_log (YLOG_LOG, "isc: patch num keys firstpos=" ZINT_FORMAT " num=" ZINT_FORMAT, @@ -464,7 +464,7 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) else if (ptr > 0) { /* we haven't flushed initial block yet and there surely are some blocks to flush. Make first block dirty if numKeys differ */ - if (numKeys != isc_pp_num (pp)) + if (numKeys != isamc_pp_num (pp)) mb[0].dirty = 1; } /* flush rest of block(s) in r_buf */ @@ -474,8 +474,16 @@ ISAMC_P isc_merge (ISAMC is, ISAMC_P ipos, ISAMC_I *data) if (!firstpos) cat = 0; if (debug > 1) - yaz_log (YLOG_LOG, "isc: isc_merge return %d " ZINT_FORMAT, cat, firstpos); - isc_pp_close (pp); - return cat + firstpos * 8; + yaz_log (YLOG_LOG, "isc: isamc_merge return %d " ZINT_FORMAT, cat, firstpos); + isamc_pp_close (pp); + *ipos = cat + firstpos * 8; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +