X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=isamc%2Fisamc.c;h=24beceba941a2d32fb243814b75602d0dacbc28c;hp=8ba7a6c1822dc2354dbf9a74983ac3c99afd38cf;hb=HEAD;hpb=4478d785b7769691261005c98063b98a5a5971b3 diff --git a/isamc/isamc.c b/isamc/isamc.c index 8ba7a6c..24beceb 100644 --- a/isamc/isamc.c +++ b/isamc/isamc.c @@ -1,8 +1,5 @@ -/* $Id: isamc.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. +/* This file is part of the Zebra server. + Copyright (C) Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -20,10 +17,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -/* +/* * TODO: * Reduction to lower categories in isamc_merge */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -94,7 +94,7 @@ ISAMC isamc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M *method) { if (is->method->debug) yaz_log (YLOG_LOG, "isc:%6d %6d %6d %6d", - filecat[i].bsize, filecat[i].ifill, + filecat[i].bsize, filecat[i].ifill, filecat[i].mfill, filecat[i].mblocks); if (max_buf_size < filecat[i].mblocks * filecat[i].bsize) max_buf_size = filecat[i].mblocks * filecat[i].bsize; @@ -107,7 +107,7 @@ ISAMC isamc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M *method) max_buf_size = (1+is->method->max_blocks_mem) * filecat[i].bsize; if (is->method->debug) yaz_log (YLOG_LOG, "isc: max_buf_size %d", max_buf_size); - + assert (is->no_files > 0); is->files = (ISAMC_file) xmalloc (sizeof(*is->files)*is->no_files); if (writeflag) @@ -119,18 +119,10 @@ ISAMC isamc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M *method) is->merge_buf = NULL; for (i = 0; ino_files; i++) { - char fname[512]; - - sprintf (fname, "%s%c", name, i+'A'); - is->files[i].bf = bf_open (bfs, fname, is->method->filecat[i].bsize, - writeflag); + is->files[i].bf = 0; is->files[i].head_is_dirty = 0; - if (!bf_read (is->files[i].bf, 0, 0, sizeof(ISAMC_head), - &is->files[i].head)) - { - is->files[i].head.lastblock = 1; - is->files[i].head.freelist = 0; - } + is->files[i].head.lastblock = 1; + is->files[i].head.freelist = 0; is->files[i].alloc_entries_num = 0; is->files[i].alloc_entries_max = is->method->filecat[i].bsize / sizeof(zint) - 1; @@ -151,6 +143,28 @@ ISAMC isamc_open (BFiles bfs, const char *name, int writeflag, ISAMC_M *method) init_fc (is, i); } + + for (i = 0; ino_files; i++) + { + char fname[FILENAME_MAX]; + int r; + + sprintf (fname, "%s%c", name, i+'A'); + is->files[i].bf = bf_open (bfs, fname, is->method->filecat[i].bsize, + writeflag); + if (!is->files[i].bf) + { + isamc_close(is); + return 0; + } + r = bf_read(is->files[i].bf, 0, 0, sizeof(ISAMC_head), + &is->files[i].head); + if (r == -1) + { + isamc_close(is); + return 0; + } + } return is; } @@ -194,21 +208,24 @@ int isamc_close (ISAMC is) for (i = 0; ino_files; i++) { release_fc (is, i); - assert (is->files[i].bf); - if (is->files[i].head_is_dirty) - bf_write (is->files[i].bf, 0, 0, sizeof(ISAMC_head), - &is->files[i].head); if (is->method->debug) yaz_log (YLOG_LOG, "isc:%8d%8d%8d%8d%8d%8d", - is->files[i].no_writes, - is->files[i].no_reads, - is->files[i].no_skip_writes, - is->files[i].no_allocated, - is->files[i].no_released, - is->files[i].no_remap); - xfree (is->files[i].fc_list); - flush_block (is, i); - bf_close (is->files[i].bf); + is->files[i].no_writes, + is->files[i].no_reads, + is->files[i].no_skip_writes, + is->files[i].no_allocated, + is->files[i].no_released, + is->files[i].no_remap); + if (is->files[i].bf) + { + if (is->files[i].head_is_dirty) + bf_write (is->files[i].bf, 0, 0, sizeof(ISAMC_head), + &is->files[i].head); + flush_block (is, i); + bf_close (is->files[i].bf); + } + xfree(is->files[i].fc_list); + xfree(is->files[i].alloc_buf); } xfree (is->files); xfree (is->merge_buf); @@ -255,7 +272,6 @@ static void flush_block (ISAMC is, int cat) bf_write (is->files[cat].bf, block, 0, 0, abuf); is->files[cat].alloc_entries_num = 0; } - xfree (abuf); } static zint alloc_block (ISAMC is, int cat) @@ -330,7 +346,7 @@ static void release_block (ISAMC is, int cat, zint pos) { memcpy (abuf + sizeof(int), &block, sizeof(zint)); is->files[cat].head.freelist = pos; - is->files[cat].head_is_dirty = 1; + is->files[cat].head_is_dirty = 1; } else { @@ -343,8 +359,6 @@ static void release_block (ISAMC is, int cat, zint pos) #else static void flush_block (ISAMC is, int cat) { - char *abuf = is->files[cat].alloc_buf; - xfree (abuf); } static zint alloc_block (ISAMC is, int cat) @@ -367,9 +381,9 @@ static zint alloc_block (ISAMC is, int cat) static void release_block (ISAMC is, int cat, zint pos) { char buf[sizeof(zint)]; - + (is->files[cat].no_released)++; - is->files[cat].head_is_dirty = 1; + is->files[cat].head_is_dirty = 1; memcpy (buf, &is->files[cat].head.freelist, sizeof(zint)); is->files[cat].head.freelist = pos; bf_write (is->files[cat].bf, pos, 0, sizeof(zint), buf); @@ -419,7 +433,7 @@ void isamc_release_block (ISAMC is, int cat, zint pos) static void init_fc (ISAMC is, int cat) { int j = 100; - + is->files[cat].fc_max = j; is->files[cat].fc_list = (zint *) xmalloc (sizeof(*is->files[0].fc_list) * j); @@ -453,9 +467,9 @@ ISAMC_PP isamc_pp_open (ISAMC is, ISAM_P ipos) { ISAMC_PP pp = (ISAMC_PP) xmalloc (sizeof(*pp)); char *src; - + pp->cat = (int) isamc_type(ipos); - pp->pos = isamc_block(ipos); + pp->pos = isamc_block(ipos); src = pp->buf = (char *) xmalloc (is->method->filecat[pp->cat].bsize); @@ -483,7 +497,7 @@ ISAMC_PP isamc_pp_open (ISAMC is, ISAM_P ipos) yaz_log(YLOG_FATAL|YLOG_LOG, "pp->pos = " ZINT_FORMAT, pp->pos); assert (pp->next != pp->pos); } - pp->offset = src - pp->buf; + pp->offset = src - pp->buf; assert (pp->offset == ISAMC_BLOCK_OFFSET_1); if (is->method->debug > 2) yaz_log (YLOG_LOG, "isc: read_block size=%d %d " ZINT_FORMAT " next=" @@ -558,14 +572,14 @@ int isamc_read_item (ISAMC_PP pp, char **dst) if (pp->deleteFlag) isamc_release_block (is, pp->cat, pp->pos); (*is->method->codec.decode)(pp->decodeClientData, dst, &src); - pp->offset = src - pp->buf; + pp->offset = src - pp->buf; if (is->method->debug > 2) yaz_log (YLOG_LOG, "isc: read_block size=%d %d " ZINT_FORMAT " next=" ZINT_FORMAT, pp->size, pp->cat, pp->pos, pp->next); return 2; } (*is->method->codec.decode)(pp->decodeClientData, dst, &src); - pp->offset = src - pp->buf; + pp->offset = src - pp->buf; return 1; } @@ -577,6 +591,7 @@ zint isamc_pp_num (ISAMC_PP pp) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab