X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Frecords.c;h=0fd33cf433f387f790d3647be0e70d6d8fbf9147;hp=f4a9cf9ce35c46e5c92c3650ec7e6a040969301e;hb=c3ff843e467932c6027a8b3b2ebda7b44612447e;hpb=e43cf25b9705f8428249a707b68f0e148c51e511 diff --git a/index/records.c b/index/records.c index f4a9cf9..0fd33cf 100644 --- a/index/records.c +++ b/index/records.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2009 Index Data + 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 @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * ref_count (2 bytes) * block (500 bytes) * - * Format of subsequent blocks + * Format of subsequent blocks * next (8 bytes) * block (502 bytes) * @@ -32,6 +32,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * (length, data) - pairs * length = 0 if same as previous */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -186,7 +189,7 @@ static ZEBRA_RES rec_release_blocks(Records p, zint sysno) /* the list of blocks can all be removed (ref == 0) */ first = 0; } - + if (bf_write(p->data_BFile[dst_type], freeblock, 0, sizeof(freeblock), &p->head.block_free[dst_type])) { @@ -268,7 +271,7 @@ static ZEBRA_RES rec_write_tmp_buf(Records p, int size, zint *sysnos) cptr = p->tmp_buf + no_written; } block_prev = block_free; - no_written += CAST_ZINT_TO_INT(p->head.block_size[dst_type]) + no_written += CAST_ZINT_TO_INT(p->head.block_size[dst_type]) - sizeof(zint); p->head.block_used[dst_type]++; } @@ -280,6 +283,28 @@ static ZEBRA_RES rec_write_tmp_buf(Records p, int size, zint *sysnos) return ZEBRA_OK; } +int rec_check_compression_method(int compression_method) +{ + switch(compression_method) + { + case REC_COMPRESS_ZLIB: +#if HAVE_ZLIB_H + return 1; +#else + return 0; +#endif + case REC_COMPRESS_BZIP2: +#if HAVE_BZLIB_H + return 1; +#else + return 0; +#endif + case REC_COMPRESS_NONE: + return 1; + } + return 0; +} + Records rec_open(BFiles bfs, int rw, int compression_method) { Records p; @@ -322,7 +347,7 @@ Records rec_open(BFiles bfs, int rw, int compression_method) } if (rw) { - if (recindex_write_head(p->recindex, + if (recindex_write_head(p->recindex, &p->head, sizeof(p->head)) != ZEBRA_OK) ret = ZEBRA_FAIL; } @@ -455,7 +480,7 @@ static void rec_cache_flush_block1(Records p, Record rec, Record last_rec, } if (i == 0) { - rec_encode_zint(rec_sysno_to_int(rec->sysno), + rec_encode_zint(rec_sysno_to_int(rec->sysno), (unsigned char *) *out_buf + *out_offset, &len); (*out_offset) += len; } @@ -522,13 +547,13 @@ static ZEBRA_RES rec_flush_shared(Records p, short ref_count, zint *sysnos, #endif break; case REC_COMPRESS_BZIP2: -#if HAVE_BZLIB_H +#if HAVE_BZLIB_H csize = out_offset + (out_offset >> 6) + 620; rec_tmp_expand(p, csize); #ifdef BZ_CONFIG_ERROR - i = BZ2_bzBuffToBuffCompress + i = BZ2_bzBuffToBuffCompress #else - i = bzBuffToBuffCompress + i = bzBuffToBuffCompress #endif (p->tmp_buf+sizeof(zint)+sizeof(short)+ sizeof(char), @@ -543,7 +568,7 @@ static ZEBRA_RES rec_flush_shared(Records p, short ref_count, zint *sysnos, case REC_COMPRESS_NONE: break; } - if (!csize) + if (!csize) { /* either no compression or compression not supported ... */ csize = out_offset; @@ -556,7 +581,7 @@ static ZEBRA_RES rec_flush_shared(Records p, short ref_count, zint *sysnos, memcpy(p->tmp_buf + sizeof(zint), &ref_count, sizeof(ref_count)); memcpy(p->tmp_buf + sizeof(zint)+sizeof(short), &compression_method, sizeof(compression_method)); - + /* -------- compression */ if (rec_write_tmp_buf(p, csize + sizeof(short) + sizeof(char), sysnos) != ZEBRA_OK) @@ -636,7 +661,7 @@ static ZEBRA_RES rec_cache_flush(Records p, int saveCount) { struct record_cache_entry *e = p->record_cache + i; rec_free(&e->rec); - } + } /* i still being used ... */ for (j = 0; jrecord_cache+j, p->record_cache+i, @@ -735,9 +760,6 @@ static Record rec_get_int(Records p, zint sysno) char *nptr, *cptr; char *in_buf = 0; char *bz_buf = 0; -#if HAVE_BZLIB_H - unsigned int bz_size; -#endif char compression_method; assert(sysno > 0); @@ -757,7 +779,7 @@ static Record rec_get_int(Records p, zint sysno) freeblock = entry.next / 8; assert(freeblock > 0); - + rec_tmp_expand(p, entry.size); cptr = p->tmp_buf; @@ -771,7 +793,7 @@ static Record rec_get_int(Records p, zint sysno) zint tmp; cptr += p->head.block_size[dst_type] - sizeof(freeblock); - + memcpy(&tmp, cptr, sizeof(tmp)); r = bf_read(p->data_BFile[dst_type], freeblock, 0, 0, cptr); if (r < 0) @@ -790,49 +812,55 @@ static Record rec_get_int(Records p, zint sysno) { case REC_COMPRESS_ZLIB: #if HAVE_ZLIB_H - bz_size = entry.size * 20 + 100; - while (1) - { - uLongf destLen = bz_size; - bz_buf = (char *) xmalloc(bz_size); - i = uncompress((Bytef *) bz_buf, &destLen, - (const Bytef *) in_buf, in_size); - if (i == Z_OK) + if (1) + { + unsigned int bz_size = entry.size * 20 + 100; + while (1) { - bz_size = destLen; - break; + uLongf destLen = bz_size; + bz_buf = (char *) xmalloc(bz_size); + i = uncompress((Bytef *) bz_buf, &destLen, + (const Bytef *) in_buf, in_size); + if (i == Z_OK) + { + bz_size = destLen; + break; + } + yaz_log(YLOG_LOG, "failed"); + xfree(bz_buf); + bz_size *= 2; } - yaz_log(YLOG_LOG, "failed"); - xfree(bz_buf); - bz_size *= 2; - } - in_buf = bz_buf; - in_size = bz_size; + in_buf = bz_buf; + in_size = bz_size; + } #else - yaz_log(YLOG_FATAL, "cannot decompress record(s) in ZLIB format"); - return 0; + yaz_log(YLOG_FATAL, "cannot decompress record(s) in ZLIB format"); + return 0; #endif break; case REC_COMPRESS_BZIP2: #if HAVE_BZLIB_H - bz_size = entry.size * 20 + 100; - while (1) - { - bz_buf = (char *) xmalloc(bz_size); + if (1) + { + unsigned int bz_size = entry.size * 20 + 100; + while (1) + { + bz_buf = (char *) xmalloc(bz_size); #ifdef BZ_CONFIG_ERROR - i = BZ2_bzBuffToBuffDecompress + i = BZ2_bzBuffToBuffDecompress #else - i = bzBuffToBuffDecompress + i = bzBuffToBuffDecompress #endif - (bz_buf, &bz_size, in_buf, in_size, 0, 0); - if (i == BZ_OK) - break; - yaz_log(YLOG_LOG, "failed"); - xfree(bz_buf); - bz_size *= 2; - } - in_buf = bz_buf; - in_size = bz_size; + (bz_buf, &bz_size, in_buf, in_size, 0, 0); + if (i == BZ_OK) + break; + yaz_log(YLOG_LOG, "failed"); + xfree(bz_buf); + bz_size *= 2; + } + in_buf = bz_buf; + in_size = bz_size; + } #else yaz_log(YLOG_FATAL, "cannot decompress record(s) in BZIP2 format"); return 0; @@ -909,6 +937,21 @@ Record rec_get_root(Records p) return rec_get(p, rec_sysno_to_ext(1)); } +Record rec_get_next(Records p, Record rec) +{ + Record next = 0; + zint next_sysno_int = rec_sysno_to_int(rec->sysno); + + while (!next) + { + ++next_sysno_int; + if (next_sysno_int == p->head.index_last) + break; + next = rec_get(p, rec_sysno_to_ext(next_sysno_int)); + } + return next; +} + static Record rec_new_int(Records p) { int i; @@ -1050,7 +1093,7 @@ void rec_prstat(Records records, int verbose) { int i; zint total_bytes = 0; - + yaz_log (YLOG_LOG, "Total records %8" ZINT_FORMAT0, records->head.no_records);