X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=isams%2Fisams.c;h=08adf9ae3268821b46d4e564653238650d432c34;hp=81d47e4468199ec473fb0c3075b91ab457b303fa;hb=89d16cf15eda0e4802d18b8ad09bd3653508ebfc;hpb=45dcbe04562559c1af90b5049fa1871311907072 diff --git a/isams/isams.c b/isams/isams.c index 81d47e4..08adf9a 100644 --- a/isams/isams.c +++ b/isams/isams.c @@ -1,36 +1,31 @@ -/* - * Copyright (c) 1995-1999, Index Data. - * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: isams.c,v $ - * Revision 1.1 1999-11-30 14:02:45 adam - * Moved isams. - * - * Revision 1.5 1999/07/14 10:59:27 adam - * Changed functions isc_getmethod, isams_getmethod. - * Improved fatal error handling (such as missing EXPLAIN schema). - * - * Revision 1.4 1999/05/26 07:49:14 adam - * C++ compilation. - * - * Revision 1.3 1999/05/20 12:57:18 adam - * Implemented TCL filter. Updated recctrl system. - * - * Revision 1.2 1999/05/15 14:35:48 adam - * Minor changes. - * - * Revision 1.1 1999/05/12 13:08:06 adam - * First version of ISAMS. - * - */ +/* This file is part of the Zebra server. + Copyright (C) 1994-2009 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 +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +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 this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + #include #include #include #include #include -#include +#include +#include typedef struct { int last_offset; @@ -40,7 +35,7 @@ typedef struct { typedef unsigned ISAMS_BLOCK_SIZE; struct ISAMS_s { - ISAMS_M method; + ISAMS_M *method; ISAMS_head head; ISAMS_head head_old; char *merge_buf; @@ -60,24 +55,27 @@ struct ISAMS_PP_s { int numRead; }; -void isams_getmethod (ISAMS_M m) +void isams_getmethod (ISAMS_M *m) { - m->code_start = NULL; - m->code_item = NULL; - m->code_stop = NULL; + m->codec.start = NULL; + m->codec.decode = NULL; + m->codec.encode = NULL; + m->codec.stop = NULL; + m->codec.reset = NULL; m->compare_item = NULL; + m->log_item = NULL; m->debug = 1; m->block_size = 128; } ISAMS isams_open (BFiles bfs, const char *name, int writeflag, - ISAMS_M method) + ISAMS_M *method) { ISAMS is = (ISAMS) xmalloc (sizeof(*is)); - is->method = (ISAMS_M) xmalloc (sizeof(*is->method)); + is->method = (ISAMS_M *) xmalloc (sizeof(*is->method)); memcpy (is->method, method, sizeof(*method)); is->block_size = is->method->block_size; is->debug = is->method->debug; @@ -111,22 +109,22 @@ int isams_close (ISAMS is) return 0; } -ISAMS_P isams_merge (ISAMS is, ISAMS_I data) +ISAM_P isams_merge (ISAMS is, ISAMS_I data) { - char i_item[128], *i_item_ptr; + char i_item[128]; int i_more, i_mode; void *r_clientData; int first_block = is->head.last_block; int first_offset = is->head.last_offset; int count = 0; - r_clientData = (*is->method->code_start)(ISAMC_ENCODE); + r_clientData = (*is->method->codec.start)(); is->head.last_offset += sizeof(int); if (is->head.last_offset > is->block_size) { if (is->debug > 2) - logf (LOG_LOG, "first_block=%d", first_block); + yaz_log (YLOG_LOG, "first_block=%d", first_block); bf_write(is->bf, is->head.last_block, 0, 0, is->merge_buf); (is->head.last_block)++; is->head.last_offset -= is->block_size; @@ -135,8 +133,8 @@ ISAMS_P isams_merge (ISAMS is, ISAMS_I data) } while (1) { - i_item_ptr = i_item; - i_more = (*data->read_item)(data->clientData, &i_item_ptr, &i_mode); + char *tmp_ptr = i_item; + i_more = (*data->read_item)(data->clientData, &tmp_ptr, &i_mode); assert (i_mode); if (!i_more) @@ -145,9 +143,8 @@ ISAMS_P isams_merge (ISAMS is, ISAMS_I data) { char *r_out_ptr = is->merge_buf + is->head.last_offset; - i_item_ptr = i_item; - (*is->method->code_item)(ISAMC_ENCODE, r_clientData, - &r_out_ptr, &i_item_ptr); + const char *i_item_ptr = i_item; + (*is->method->codec.encode)(r_clientData, &r_out_ptr, &i_item_ptr); is->head.last_offset = r_out_ptr - is->merge_buf; if (is->head.last_offset > is->block_size) { @@ -160,7 +157,7 @@ ISAMS_P isams_merge (ISAMS is, ISAMS_I data) count++; } } - (*is->method->code_stop)(ISAMC_ENCODE, r_clientData); + (*is->method->codec.stop)(r_clientData); if (first_block == is->head.last_block) memcpy(is->merge_buf + first_offset, &count, sizeof(int)); else if (first_block == is->head.last_block-1) @@ -184,27 +181,29 @@ ISAMS_P isams_merge (ISAMS is, ISAMS_I data) return first_block * is->block_size + first_offset; } -ISAMS_PP isams_pp_open (ISAMS is, ISAMS_P pos) +ISAMS_PP isams_pp_open (ISAMS is, ISAM_P pos) { ISAMS_PP pp = (ISAMS_PP) xmalloc (sizeof(*pp)); if (is->debug > 1) - logf (LOG_LOG, "isams: isams_pp_open pos=%ld", (long) pos); + yaz_log (YLOG_LOG, "isams: isams_pp_open pos=%ld", (long) pos); pp->is = is; - pp->decodeClientData = (*is->method->code_start)(ISAMC_DECODE); + pp->decodeClientData = (*is->method->codec.start)(); pp->numKeys = 0; pp->numRead = 0; pp->buf = (char *) xmalloc(is->block_size*2); - pp->block_no = pos/is->block_size; - pp->block_offset = pos - pp->block_no * is->block_size; - logf (LOG_LOG, "isams: isams_pp_open off=%d no=%d", - pp->block_offset, pp->block_no); + pp->block_no = (int) (pos/is->block_size); + pp->block_offset = (int) (pos - pp->block_no * is->block_size); + if (is->debug) + yaz_log (YLOG_LOG, "isams: isams_pp_open off=%d no=%d", + pp->block_offset, pp->block_no); if (pos) { bf_read (is->bf, pp->block_no, 0, 0, pp->buf); bf_read (is->bf, pp->block_no+1, 0, 0, pp->buf + is->block_size); memcpy(&pp->numKeys, pp->buf + pp->block_offset, sizeof(int)); - logf (LOG_LOG, "isams: isams_pp_open numKeys=%d", pp->numKeys); + if (is->debug) + yaz_log (YLOG_LOG, "isams: isams_pp_open numKeys=%d", pp->numKeys); pp->block_offset += sizeof(int); } return pp; @@ -212,7 +211,7 @@ ISAMS_PP isams_pp_open (ISAMS is, ISAMS_P pos) void isams_pp_close (ISAMS_PP pp) { - (*pp->is->method->code_stop)(ISAMC_DECODE, pp->decodeClientData); + (*pp->is->method->codec.stop)(pp->decodeClientData); xfree(pp->buf); xfree(pp); } @@ -224,12 +223,13 @@ int isams_pp_num (ISAMS_PP pp) int isams_pp_read (ISAMS_PP pp, void *buf) { - return isams_read_item (pp, (char **) &buf); + char *cp = buf; + return isams_read_item (pp, &cp); } int isams_read_item (ISAMS_PP pp, char **dst) { - char *src; + const char *src; if (pp->numRead >= pp->numKeys) return 0; (pp->numRead)++; @@ -242,10 +242,17 @@ int isams_read_item (ISAMS_PP pp, char **dst) pp->buf + pp->is->block_size); } src = pp->buf + pp->block_offset; - (*pp->is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, - dst, &src); + (*pp->is->method->codec.decode)(pp->decodeClientData, dst, &src); pp->block_offset = src - pp->buf; return 1; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +