X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Frecords.c;h=60908db1fb2f2b39c0e6a793e52ed21739194836;hp=ac05fa8907f3d0832ca84cce3aea92a51341d8c0;hb=d71149439012fadf092321e3b507d23711715743;hpb=e5f5fb6515a2ee5f1040e76484d8a7b8121cf845 diff --git a/index/records.c b/index/records.c index ac05fa8..60908db 100644 --- a/index/records.c +++ b/index/records.c @@ -44,6 +44,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #if HAVE_BZLIB_H #include #endif +#if HAVE_ZLIB_H +#include +#endif #define REC_BLOCK_TYPES 2 #define REC_HEAD_MAGIC "recindex" @@ -492,6 +495,34 @@ static ZEBRA_RES rec_flush_shared(Records p, short ref_count, zint *sysnos, char compression_method = p->compression_method; switch (compression_method) { + case REC_COMPRESS_ZLIB: +#if HAVE_ZLIB_H + csize = out_offset + (out_offset >> 6) + 620; + while (1) + { + int r; + uLongf destLen = csize; + rec_tmp_expand(p, csize); + r = compress((Bytef *) p->tmp_buf+sizeof(zint)+sizeof(short)+ + sizeof(char), + &destLen, (const Bytef *) out_buf, out_offset); + csize = destLen; + if (r == Z_OK) + { + yaz_log(YLOG_LOG, "compress %4d %5d %5d", ref_count, + out_offset, csize); + break; + } + if (r != Z_MEM_ERROR) + { + yaz_log(YLOG_WARN, "compress error: %d", r); + csize = 0; + break; + } + csize = csize * 2; + } +#endif + break; case REC_COMPRESS_BZIP2: #if HAVE_BZLIB_H csize = out_offset + (out_offset >> 6) + 620; @@ -509,8 +540,8 @@ static ZEBRA_RES rec_flush_shared(Records p, short ref_count, zint *sysnos, yaz_log(YLOG_WARN, "bzBuffToBuffCompress error code=%d", i); csize = 0; } - yaz_log(YLOG_LOG, "compress %4d %5d %5d", ref_count, out_offset, - csize); + yaz_log(YLOG_LOG, "compress %4d %5d %5d", ref_count, + out_offset, csize); #endif break; case REC_COMPRESS_NONE: @@ -761,6 +792,32 @@ static Record rec_get_int(Records p, zint sysno) in_size = entry.size - sizeof(short) - sizeof(char); switch (compression_method) { + 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) + { + yaz_log(YLOG_LOG, "decompress %5d %5d", in_size, bz_size); + bz_size = destLen; + 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 ZLIB format"); + return 0; +#endif + break; case REC_COMPRESS_BZIP2: #if HAVE_BZLIB_H bz_size = entry.size * 20 + 100;