X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=rset%2Frsisamb.c;h=b860a6806ef05163485f601f3186426a80fa9e01;hp=e7fbe4059448cdd6b3d087afa465f04b76a6a06b;hb=24357780de7d01b3c3ec2c3f6715b2feee7d0e76;hpb=0229bb1ac74706a4e460a11a8a8712b4ea0f2ebe diff --git a/rset/rsisamb.c b/rset/rsisamb.c index e7fbe40..b860a68 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,8 +1,5 @@ -/* $Id: rsisamb.c,v 1.24 2004-10-15 10:07:34 heikki Exp $ - Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 - Index Data Aps - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1994-2011 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 @@ -15,33 +12,34 @@ 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 + */ +#if HAVE_CONFIG_H +#include +#endif #include #include -#include +#include #include #include -#ifndef RSET_DEBUG -#define RSET_DEBUG 0 -#endif - -static RSFD r_open (RSET ct, int flag); -static void r_close (RSFD rfd); -static void r_delete (RSET ct); +static RSFD r_open(RSET ct, int flag); +static void r_close(RSFD rfd); +static void r_delete(RSET ct); static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); -static void r_pos (RSFD rfd, double *current, double *total); -static int r_read (RSFD rfd, void *buf, TERMID *term); -static int r_write (RSFD rfd, const void *buf); +static void r_pos(RSFD rfd, double *current, double *total); +static int r_read(RSFD rfd, void *buf, TERMID *term); +static int r_read_filter(RSFD rfd, void *buf, TERMID *term); +static int r_write(RSFD rfd, const void *buf); static const struct rset_control control = { "isamb", r_delete, + rset_get_one_term, r_open, r_close, r_forward, @@ -50,99 +48,150 @@ static const struct rset_control control = r_write, }; -const struct rset_control *rset_kind_isamb = &control; +static const struct rset_control control_filter = +{ + "isamb", + r_delete, + rset_get_one_term, + r_open, + r_close, + r_forward, + r_pos, + r_read_filter, + r_write, +}; -struct rset_pp_info { +struct rfd_private { ISAMB_PP pt; void *buf; }; -struct rset_isamb_info { +struct rset_private { ISAMB is; - ISAMB_P pos; + ISAM_P pos; }; -RSET rsisamb_create( NMEM nmem, const struct key_control *kcontrol, int scope, - ISAMB is, ISAMB_P pos, TERMID term) +static int log_level = 0; +static int log_level_initialized = 0; + +RSET rsisamb_create(NMEM nmem, struct rset_key_control *kcontrol, + int scope, + ISAMB is, ISAM_P pos, TERMID term) { - RSET rnew=rset_create_base(&control, nmem, kcontrol, scope, term); - struct rset_isamb_info *info; - info = (struct rset_isamb_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->is=is; - info->pos=pos; - rnew->priv=info; + RSET rnew = rset_create_base( + kcontrol->filter_func ? &control_filter : &control, + nmem, kcontrol, scope, term, 0, 0); + struct rset_private *info; + assert(pos); + if (!log_level_initialized) + { + log_level = yaz_log_module_level("rsisamb"); + log_level_initialized = 1; + } + info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); + info->is = is; + info->pos = pos; + rnew->priv = info; + yaz_log(log_level, "rsisamb_create"); return rnew; } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { - logf (LOG_DEBUG, "rsisamb_delete"); + yaz_log(log_level, "rsisamb_delete"); } -RSFD r_open (RSET ct, int flag) +RSFD r_open(RSET ct, int flag) { - struct rset_isamb_info *info = (struct rset_isamb_info *) ct->priv; + struct rset_private *info = (struct rset_private *) ct->priv; RSFD rfd; - struct rset_pp_info *ptinfo; + struct rfd_private *ptinfo; if (flag & RSETF_WRITE) { - logf (LOG_FATAL, "ISAMB set type is read-only"); + yaz_log(YLOG_FATAL, "ISAMB set type is read-only"); return NULL; } - rfd=rfd_create_base(ct); + rfd = rfd_create_base(ct); if (rfd->priv) - ptinfo=(struct rset_pp_info *) (rfd->priv); + ptinfo = (struct rfd_private *) (rfd->priv); else { - ptinfo = (struct rset_pp_info *)nmem_malloc(ct->nmem,sizeof(*ptinfo)); - ptinfo->buf = nmem_malloc (ct->nmem,ct->keycontrol->key_size); - rfd->priv=ptinfo; + ptinfo = (struct rfd_private *) nmem_malloc(ct->nmem,sizeof(*ptinfo)); + ptinfo->buf = nmem_malloc(ct->nmem,ct->keycontrol->key_size); + rfd->priv = ptinfo; } - ptinfo->pt = isamb_pp_open (info->is, info->pos, ct->scope ); + ptinfo->pt = isamb_pp_open(info->is, info->pos, ct->scope ); + yaz_log(log_level, "rsisamb_open"); return rfd; } -static void r_close (RSFD rfd) +static void r_close(RSFD rfd) { - struct rset_pp_info *ptinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); isamb_pp_close (ptinfo->pt); - rfd_delete_base(rfd); + yaz_log(log_level, "rsisamb_close"); } static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { - struct rset_pp_info *pinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); int rc; - rc=isamb_pp_forward(pinfo->pt, buf, untilbuf); + rc = isamb_pp_forward(pinfo->pt, buf, untilbuf); if (rc && term) - *term=rfd->rset->term; + *term = rfd->rset->term; + yaz_log(log_level, "rsisamb_forward"); return rc; } -static void r_pos (RSFD rfd, double *current, double *total) +static void r_pos(RSFD rfd, double *current, double *total) { - struct rset_pp_info *pinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); assert(rfd); isamb_pp_pos(pinfo->pt, current, total); -#if RSET_DEBUG - logf(LOG_DEBUG,"isamb.r_pos returning %0.1f/%0.1f", + yaz_log(log_level, "isamb.r_pos returning %0.1f/%0.1f", *current, *total); -#endif } -static int r_read (RSFD rfd, void *buf, TERMID *term) +static int r_read(RSFD rfd, void *buf, TERMID *term) { - struct rset_pp_info *pinfo=(struct rset_pp_info *)(rfd->priv); + struct rfd_private *pinfo = (struct rfd_private *)(rfd->priv); int rc; - rc=isamb_pp_read(pinfo->pt, buf); + rc = isamb_pp_read(pinfo->pt, buf); if (rc && term) - *term=rfd->rset->term; + *term = rfd->rset->term; + yaz_log(log_level, "isamb.r_read "); return rc; } -static int r_write (RSFD rfd, const void *buf) +static int r_read_filter(RSFD rfd, void *buf, TERMID *term) { - logf (LOG_FATAL, "ISAMB set type is read-only"); + struct rfd_private *pinfo = (struct rfd_private *)rfd->priv; + const struct rset_key_control *kctrl = rfd->rset->keycontrol; + int rc; + while((rc = isamb_pp_read(pinfo->pt, buf))) + { + int incl = (*kctrl->filter_func)(buf, kctrl->filter_data); + if (incl) + break; + } + if (rc && term) + *term = rfd->rset->term; + yaz_log(log_level, "isamb.r_read_filter"); + return rc; +} + +static int r_write(RSFD rfd, const void *buf) +{ + yaz_log(YLOG_FATAL, "ISAMB set type is read-only"); return -1; } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +