X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Falvis.c;h=a752890d8acc320f689435f3f7a99e7c7f5145ae;hp=fad3671bdf1db5ac7641bbed666c055cf5f7bf24;hb=78b13a3ac6a79768fb609c14db2a8e0c94a9c4da;hpb=c5365d8095f29747f5998028934cfc034d038673 diff --git a/index/alvis.c b/index/alvis.c index fad3671..a752890 100644 --- a/index/alvis.c +++ b/index/alvis.c @@ -1,8 +1,5 @@ -/* $Id: alvis.c,v 1.12 2007-02-12 10:33:51 adam Exp $ - Copyright (C) 1995-2007 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1995-2008 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 @@ -26,6 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#include #include #include @@ -49,7 +47,6 @@ struct filter_schema { struct filter_schema *next; const char *default_schema; /* char default_schema; */ - const char *include_snippet; xsltStylesheetPtr stylesheet_xsp; }; @@ -72,16 +69,6 @@ struct filter_info { static const char *zebra_xslt_ns = ZEBRA_SCHEMA_XSLT_NS; -static void set_param_xml(const char **params, const char *name, - const char *value, ODR odr) -{ - while (*params) - params++; - params[0] = name; - params[1] = value; - params[2] = 0; -} - static void set_param_str(const char **params, const char *name, const char *value, ODR odr) { @@ -237,7 +224,6 @@ static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname) schema->default_schema = 0; schema->next = tinfo->schemas; schema->stylesheet_xsp = 0; - schema->include_snippet = 0; tinfo->schemas = schema; for (attr = ptr->properties; attr; attr = attr->next) { @@ -245,7 +231,6 @@ static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname) attr_content(attr, "name", &schema->name); attr_content(attr, "stylesheet", &schema->stylesheet); attr_content(attr, "default", &schema->default_schema); - attr_content(attr, "snippet", &schema->include_snippet); } /*yaz_log(YLOG_LOG, "XSLT add %s %s %s", schema->name, schema->identifier, schema->stylesheet); */ @@ -345,6 +330,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); @@ -399,10 +385,10 @@ static void index_node(struct filter_info *tinfo, struct recExtractCtrl *ctrl, } if (name_str) { - int prev_type = recWord->index_type; /* save default type */ + const char *prev_type = recWord->index_type; /* save default type */ if (type_str && *type_str) - recWord->index_type = *type_str; /* type was given */ + recWord->index_type = (const char *) type_str; /* type was given */ recWord->index_name = name_str; index_cdata(tinfo, ctrl, ptr->children, recWord); @@ -488,7 +474,8 @@ static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p, xmlDocDumpMemory(doc, &buf_out, &len_out); if (p->flagShowRecords) fwrite(buf_out, len_out, 1, stdout); - (*p->setStoreData)(p, buf_out, len_out); + if (p->setStoreData) + (*p->setStoreData)(p, buf_out, len_out); xmlFree(buf_out); xmlFreeDoc(doc); @@ -507,7 +494,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_NOENT); + XML_PARSE_XINCLUDE + | XML_PARSE_NOENT + | XML_PARSE_NONET); } if (!tinfo->reader) return RECCTRL_EXTRACT_ERROR_GENERIC; @@ -550,11 +539,17 @@ static int extract_full(struct filter_info *tinfo, struct recExtractCtrl *p) xmlDocPtr doc = xmlReadIO(ioread_ex, ioclose_ex, p /* I/O handler */, 0 /* URL */, 0 /* encoding */, - XML_PARSE_XINCLUDE|XML_PARSE_NOENT); + 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 @@ -566,7 +561,7 @@ static int filter_extract(void *clientData, struct recExtractCtrl *p) struct filter_info *tinfo = clientData; odr_reset(tinfo->odr); - if (tinfo->split_level == 0) + if (tinfo->split_level == 0 || p->setStoreData == 0) return extract_full(tinfo, p); else return extract_split(tinfo, p); @@ -583,53 +578,6 @@ static int ioclose_ret(void *context) return 0; } -static const char *snippet_doc(struct recRetrieveCtrl *p, int text_mode, - int window_size) -{ - const char *xml_doc_str; - int ord = 0; - WRBUF wrbuf = wrbuf_alloc(); - zebra_snippets *res = - zebra_snippets_window(p->doc_snippet, p->hit_snippet, window_size); - zebra_snippet_word *w = zebra_snippets_list(res); - - if (text_mode) - wrbuf_printf(wrbuf, "\'"); - else - wrbuf_printf(wrbuf, "\n", zebra_xslt_ns); - for (; w; w = w->next) - { - if (ord == 0) - ord = w->ord; - else if (ord != w->ord) - - break; - if (text_mode) - wrbuf_printf(wrbuf, "%s%s%s ", - w->match ? "*" : "", - w->term, - w->match ? "*" : ""); - else - { - wrbuf_printf(wrbuf, " ", - w->ord, w->seqno, - (w->match ? "match='1'" : "")); - wrbuf_xmlputs(wrbuf, w->term); - wrbuf_printf(wrbuf, "\n"); - } - } - if (text_mode) - wrbuf_printf(wrbuf, "\'"); - else - wrbuf_printf(wrbuf, "\n"); - - xml_doc_str = odr_strdup(p->odr, wrbuf_buf(wrbuf)); - - zebra_snippets_destroy(res); - wrbuf_free(wrbuf, 1); - return xml_doc_str; -} - static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) { /* const char *esn = zebra_xslt_ns; */ @@ -639,7 +587,6 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) xmlDocPtr resDoc; xmlDocPtr doc; struct filter_schema *schema; - int window_size = -1; if (p->comp) { @@ -664,9 +611,6 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) return 0; } - if (schema->include_snippet) - window_size = atoi(schema->include_snippet); - params[0] = 0; set_param_int(params, "id", p->localno, p->odr); if (p->fname) @@ -688,26 +632,16 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) set_param_int(params, "score", p->score, p->odr); set_param_int(params, "size", p->recordSize, p->odr); - if (window_size >= 0) - set_param_xml(params, "snippet", snippet_doc(p, 1, window_size), - p->odr); doc = xmlReadIO(ioread_ret, ioclose_ret, p /* I/O handler */, 0 /* URL */, 0 /* encoding */, - XML_PARSE_XINCLUDE|XML_PARSE_NOENT); + XML_PARSE_XINCLUDE | XML_PARSE_NOENT | XML_PARSE_NONET); if (!doc) { p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; return 0; } - if (window_size >= 0) - { - xmlNodePtr node = xmlDocGetRootElement(doc); - const char *snippet_str = snippet_doc(p, 0, window_size); - xmlDocPtr snippet_doc = xmlParseMemory(snippet_str, strlen(snippet_str)); - xmlAddChild(node, xmlDocGetRootElement(snippet_doc)); - } if (!schema->stylesheet_xsp) resDoc = doc; else @@ -720,7 +654,8 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) { p->diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; } - else if (p->input_format == VAL_NONE || p->input_format == VAL_TEXT_XML) + else if (!p->input_format + || !oid_oidcmp(p->input_format, yaz_oid_recsyn_xml)) { xmlChar *buf_out; int len_out; @@ -731,13 +666,13 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) else xmlDocDumpMemory(resDoc, &buf_out, &len_out); - p->output_format = VAL_TEXT_XML; + p->output_format = yaz_oid_recsyn_xml; p->rec_len = len_out; p->rec_buf = odr_malloc(p->odr, p->rec_len); memcpy(p->rec_buf, buf_out, p->rec_len); xmlFree(buf_out); } - else if (p->output_format == VAL_SUTRS) + else if (!oid_oidcmp(p->output_format, yaz_oid_recsyn_sutrs)) { xmlChar *buf_out; int len_out; @@ -748,7 +683,7 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) else xmlDocDumpMemory(resDoc, &buf_out, &len_out); - p->output_format = VAL_SUTRS; + p->output_format = yaz_oid_recsyn_sutrs; p->rec_len = len_out; p->rec_buf = odr_malloc(p->odr, p->rec_len); memcpy(p->rec_buf, buf_out, p->rec_len);