X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=rset%2Frsisamb.c;h=62e63d718cc41d2244afb2456581a2cd40bbe4ce;hp=c07c5a59bb5b938298db9caefd277a8d74a41723;hb=00d6544408e2de88277e091fb7f8f4dfe3949558;hpb=deff57cfa9d9b39c4a4f1c9b82a64c6e61d821a4 diff --git a/rset/rsisamb.c b/rset/rsisamb.c index c07c5a5..62e63d7 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,8 +1,5 @@ -/* $Id: rsisamb.c,v 1.30 2005-03-30 09:25:24 adam Exp $ - Copyright (C) 1995-2005 - 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 @@ -15,82 +12,99 @@ 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 - -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 const struct rset_control control = +static const struct rset_control control = { "isamb", r_delete, rset_get_one_term, r_open, r_close, - r_forward, + r_forward, r_pos, r_read, - r_write, + rset_no_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, + rset_no_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; }; static int log_level = 0; static int log_level_initialized = 0; -RSET rsisamb_create( NMEM nmem, const struct key_control *kcontrol, int scope, - ISAMB is, ISAMB_P pos, TERMID term) +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; + 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_isamb_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + 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"); + yaz_log(log_level, "rsisamb_create"); return rnew; } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { 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) { @@ -99,59 +113,79 @@ RSFD r_open (RSET ct, int flag) } 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); + 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 ); - yaz_log(log_level,"rsisamb_open"); + 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"); + 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); if (rc && term) *term = rfd->rset->term; - yaz_log(log_level,"rsisamb_forward"); - return rc; + 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); - yaz_log(log_level,"isamb.r_pos returning %0.1f/%0.1f", + yaz_log(log_level, "isamb.r_pos returning %0.1f/%0.1f", *current, *total); } -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); if (rc && term) *term = rfd->rset->term; - yaz_log(log_level,"isamb.r_read "); + 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) { - yaz_log(YLOG_FATAL, "ISAMB set type is read-only"); - return -1; + 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; } + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +