X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Falvis.c;h=c9261296880b599c1bf7789d5f6eed03b261a86d;hb=cf66499bac7c49c5bdd363a2c927295fa92f547a;hp=da5817bad8e69b31e6ad99fbb61ec563cd9c0800;hpb=dd094f96179451fb9445cc33d288a0ba540dc42c;p=idzebra-moved-to-github.git diff --git a/index/alvis.c b/index/alvis.c index da5817b..c926129 100644 --- a/index/alvis.c +++ b/index/alvis.c @@ -1,5 +1,5 @@ -/* $Id: alvis.c,v 1.7 2006-12-05 09:26:04 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: alvis.c,v 1.14 2007-03-07 14:18:35 marc Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -345,6 +345,7 @@ static void filter_destroy(void *clientData) { struct filter_info *tinfo = clientData; destroy_schemas(tinfo); + xfree(tinfo->full_name); if (tinfo->reader) xmlFreeTextReader(tinfo->reader); odr_destroy(tinfo->odr); @@ -434,8 +435,7 @@ static void index_record(struct filter_info *tinfo,struct recExtractCtrl *ctrl, sscanf(id_str, "%255s", ctrl->match_criteria); if (rank_str) - ctrl->staticrank = atoi(rank_str); - + ctrl->staticrank = atozint(rank_str); ptr = ptr->children; } @@ -508,7 +508,9 @@ static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p) p /* I/O handler */, 0 /* URL */, 0 /* encoding */, - XML_PARSE_XINCLUDE); + XML_PARSE_XINCLUDE + | XML_PARSE_NOENT + | XML_PARSE_NONET); } if (!tinfo->reader) return RECCTRL_EXTRACT_ERROR_GENERIC; @@ -518,9 +520,7 @@ static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p) { int type = xmlTextReaderNodeType(tinfo->reader); int depth = xmlTextReaderDepth(tinfo->reader); - if (tinfo->split_level == 0 || - (tinfo->split_level > 0 && - type == XML_READER_TYPE_ELEMENT && tinfo->split_level == depth)) + if (type == XML_READER_TYPE_ELEMENT && tinfo->split_level == depth) { xmlNodePtr ptr = xmlTextReaderExpand(tinfo->reader); if (ptr) @@ -546,13 +546,39 @@ static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p) return RECCTRL_EXTRACT_EOF; } +static int extract_full(struct filter_info *tinfo, struct recExtractCtrl *p) +{ + if (p->first_record) /* only one record per stream */ + { + xmlDocPtr doc = xmlReadIO(ioread_ex, ioclose_ex, p /* I/O handler */, + 0 /* URL */, + 0 /* encoding */, + XML_PARSE_XINCLUDE + | XML_PARSE_NOENT + | XML_PARSE_NONET); + if (!doc) + return RECCTRL_EXTRACT_ERROR_GENERIC; + /* else { + xmlNodePtr root = xmlDocGetRootElement(doc); + if (!root) + return RECCTRL_EXTRACT_ERROR_GENERIC; + } */ + + return extract_doc(tinfo, p, doc); + } + else + return RECCTRL_EXTRACT_EOF; +} + static int filter_extract(void *clientData, struct recExtractCtrl *p) { struct filter_info *tinfo = clientData; odr_reset(tinfo->odr); - - return extract_split(tinfo, p); + if (tinfo->split_level == 0) + return extract_full(tinfo, p); + else + return extract_split(tinfo, p); } static int ioread_ret(void *context, char *buffer, int len) @@ -677,7 +703,7 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) doc = xmlReadIO(ioread_ret, ioclose_ret, p /* I/O handler */, 0 /* URL */, 0 /* encoding */, - XML_PARSE_XINCLUDE); + XML_PARSE_XINCLUDE | XML_PARSE_NOENT | XML_PARSE_NONET); if (!doc) { p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;