X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Falvis.c;h=da5817bad8e69b31e6ad99fbb61ec563cd9c0800;hb=3fe5d30485d3fc95b24ee5e7dc75971447ecb5aa;hp=40405e1c33cfe9bc4304d7eb6ea8fda61d0e6a95;hpb=852d5f1f9aa0a70f7e54a68143ee86752394a2f2;p=idzebra-moved-to-github.git diff --git a/index/alvis.c b/index/alvis.c index 40405e1..da5817b 100644 --- a/index/alvis.c +++ b/index/alvis.c @@ -1,4 +1,4 @@ -/* $Id: alvis.c,v 1.3 2006-08-22 13:39:26 adam Exp $ +/* $Id: alvis.c,v 1.7 2006-12-05 09:26:04 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -35,6 +35,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include +#if YAZ_HAVE_EXSLT +#include +#endif + #include #include @@ -54,7 +58,7 @@ struct filter_info { char *fname; char *full_name; const char *profile_path; - const char *split_level; + int split_level; const char *split_path; ODR odr; struct filter_schema *schemas; @@ -140,6 +144,10 @@ static void *filter_init(Res res, RecType recType) tinfo->doc = 0; tinfo->schemas = 0; +#if YAZ_HAVE_EXSLT + exsltRegisterAll(); +#endif + #if ENABLE_INPUT_CALLBACK xmlRegisterDefaultInputCallbacks(); xmlRegisterInputCallbacks(zebra_xmlInputMatchCallback, @@ -153,8 +161,8 @@ static void *filter_init(Res res, RecType recType) static int attr_content(struct _xmlAttr *attr, const char *name, const char **dst_content) { - if (!XML_STRCMP(attr->name, name) && attr->children && - attr->children->type == XML_TEXT_NODE) + if (!XML_STRCMP(attr->name, name) && attr->children + && attr->children->type == XML_TEXT_NODE) { *dst_content = (const char *)(attr->children->content); return 1; @@ -185,27 +193,29 @@ static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname) char tmp_full_name[1024]; xmlNodePtr ptr; tinfo->fname = xstrdup(fname); - - if (yaz_filepath_resolve(tinfo->fname, tinfo->profile_path, + + if (yaz_filepath_resolve(tinfo->fname, tinfo->profile_path, NULL, tmp_full_name)) - tinfo->full_name = xstrdup(tmp_full_name); + tinfo->full_name = xstrdup(tmp_full_name); else - tinfo->full_name = xstrdup(tinfo->fname); - + tinfo->full_name = xstrdup(tinfo->fname); + yaz_log(YLOG_LOG, "alvis filter: loading config file %s", tinfo->full_name); - + tinfo->doc = xmlParseFile(tinfo->full_name); - - if (!tinfo->doc){ + + if (!tinfo->doc) + { yaz_log(YLOG_WARN, "alvis filter: could not parse config file %s", tinfo->full_name); - + return ZEBRA_FAIL; } ptr = xmlDocGetRootElement(tinfo->doc); - if (!ptr || ptr->type != XML_ELEMENT_NODE || - XML_STRCMP(ptr->name, "schemaInfo")){ + if (!ptr || ptr->type != XML_ELEMENT_NODE + || XML_STRCMP(ptr->name, "schemaInfo")) + { yaz_log(YLOG_WARN, "alvis filter: config file %s :" " expected root element ", @@ -219,7 +229,6 @@ static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname) continue; if (!XML_STRCMP(ptr->name, "schema")) { - char tmp_xslt_full_name[1024]; struct _xmlAttr *attr; struct filter_schema *schema = xmalloc(sizeof(*schema)); schema->name = 0; @@ -243,26 +252,37 @@ static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname) /* find requested schema */ - if (schema->stylesheet){ - yaz_filepath_resolve(schema->stylesheet, tinfo->profile_path, - NULL, tmp_xslt_full_name); - schema->stylesheet_xsp - = xsltParseStylesheetFile((const xmlChar*) tmp_xslt_full_name); - if (!schema->stylesheet_xsp) - yaz_log(YLOG_WARN, - "alvis filter: could not parse xslt stylesheet %s", - tmp_xslt_full_name); + if (schema->stylesheet) + { + char tmp_xslt_full_name[1024]; + if (!yaz_filepath_resolve(schema->stylesheet, tinfo->profile_path, + NULL, tmp_xslt_full_name)) + { + yaz_log(YLOG_WARN, + "alvis filter: stylesheet %s not found in path %s", + schema->stylesheet, tinfo->profile_path); + return ZEBRA_FAIL; + } + schema->stylesheet_xsp + = xsltParseStylesheetFile((const xmlChar*) tmp_xslt_full_name); + if (!schema->stylesheet_xsp) + { + yaz_log(YLOG_WARN, + "alvis filter: could not parse xslt stylesheet %s", + tmp_xslt_full_name); + return ZEBRA_FAIL; + } } - - } else if (!XML_STRCMP(ptr->name, "split")) { struct _xmlAttr *attr; for (attr = ptr->properties; attr; attr = attr->next) { - attr_content(attr, "level", &tinfo->split_level); - attr_content(attr, "path", &tinfo->split_path); + const char *split_level_str = 0; + attr_content(attr, "level", &split_level_str); + tinfo->split_level = + split_level_str ? atoi(split_level_str) : 0; } } else @@ -305,22 +325,20 @@ static struct filter_schema *lookup_schema(struct filter_info *tinfo, static ZEBRA_RES filter_config(void *clientData, Res res, const char *args) { struct filter_info *tinfo = clientData; - if (!args || !*args){ - yaz_log(YLOG_WARN, "alvis filter: need config file"); - return ZEBRA_FAIL; + if (!args || !*args) + { + yaz_log(YLOG_WARN, "alvis filter: need config file"); + return ZEBRA_FAIL; } if (tinfo->fname && !strcmp(args, tinfo->fname)) return ZEBRA_OK; - tinfo->profile_path - /* = res_get_def(res, "profilePath", DEFAULT_PROFILE_PATH); */ - = res_get(res, "profilePath"); + tinfo->profile_path = res_get(res, "profilePath"); yaz_log(YLOG_LOG, "alvis filter: profilePath %s", tinfo->profile_path); destroy_schemas(tinfo); - create_schemas(tinfo, args); - return ZEBRA_OK; + return create_schemas(tinfo, args); } static void filter_destroy(void *clientData) @@ -463,7 +481,7 @@ static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p, else { yaz_log(YLOG_WARN, "No root for index XML record." - " split_level=%s stylesheet=%s", + " split_level=%d stylesheet=%s", tinfo->split_level, schema->stylesheet); } xmlFreeDoc(resDoc); @@ -481,7 +499,7 @@ static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p, static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p) { int ret; - int split_depth = 0; + if (p->first_record) { if (tinfo->reader) @@ -495,23 +513,31 @@ static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p) if (!tinfo->reader) return RECCTRL_EXTRACT_ERROR_GENERIC; - if (tinfo->split_level) - split_depth = atoi(tinfo->split_level); ret = xmlTextReaderRead(tinfo->reader); - while (ret == 1) { + while (ret == 1) + { int type = xmlTextReaderNodeType(tinfo->reader); int depth = xmlTextReaderDepth(tinfo->reader); - if (split_depth == 0 || - (split_depth > 0 && - type == XML_READER_TYPE_ELEMENT && split_depth == depth)) + if (tinfo->split_level == 0 || + (tinfo->split_level > 0 && + type == XML_READER_TYPE_ELEMENT && tinfo->split_level == depth)) { xmlNodePtr ptr = xmlTextReaderExpand(tinfo->reader); - xmlNodePtr ptr2 = xmlCopyNode(ptr, 1); - xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0"); - - xmlDocSetRootElement(doc, ptr2); - - return extract_doc(tinfo, p, doc); + if (ptr) + { + xmlNodePtr ptr2 = xmlCopyNode(ptr, 1); + xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0"); + + xmlDocSetRootElement(doc, ptr2); + + return extract_doc(tinfo, p, doc); + } + else + { + xmlFreeTextReader(tinfo->reader); + tinfo->reader = 0; + return RECCTRL_EXTRACT_ERROR_GENERIC; + } } ret = xmlTextReaderRead(tinfo->reader); } @@ -520,36 +546,13 @@ 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); - if (!doc) - { - 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); - if (tinfo->split_level == 0 && tinfo->split_path == 0) - return extract_full(tinfo, p); - else - { - return extract_split(tinfo, p); - } + return extract_split(tinfo, p); } static int ioread_ret(void *context, char *buffer, int len) @@ -563,7 +566,6 @@ static int ioclose_ret(void *context) return 0; } - static const char *snippet_doc(struct recRetrieveCtrl *p, int text_mode, int window_size) { @@ -706,8 +708,11 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) xmlChar *buf_out; int len_out; - xsltSaveResultToString(&buf_out, &len_out, resDoc, - schema->stylesheet_xsp); + if (schema->stylesheet_xsp) + xsltSaveResultToString(&buf_out, &len_out, resDoc, + schema->stylesheet_xsp); + else + xmlDocDumpMemory(resDoc, &buf_out, &len_out); p->output_format = VAL_TEXT_XML; p->rec_len = len_out; @@ -720,8 +725,11 @@ static int filter_retrieve (void *clientData, struct recRetrieveCtrl *p) xmlChar *buf_out; int len_out; - xsltSaveResultToString(&buf_out, &len_out, resDoc, - schema->stylesheet_xsp); + if (schema->stylesheet_xsp) + xsltSaveResultToString(&buf_out, &len_out, resDoc, + schema->stylesheet_xsp); + else + xmlDocDumpMemory(resDoc, &buf_out, &len_out); p->output_format = VAL_SUTRS; p->rec_len = len_out;