-/* $Id: alvis.c,v 1.5 2006-11-10 12:56:26 adam Exp $
- Copyright (C) 1995-2006
+/* $Id: alvis.c,v 1.19 2007-08-31 07:02:24 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
#include <yaz/diagbib1.h>
#include <yaz/tpath.h>
+#include <yaz/oid_db.h>
#include <libxml/xmlversion.h>
#include <libxml/parser.h>
struct filter_schema *next;
const char *default_schema;
/* char default_schema; */
- const char *include_snippet;
xsltStylesheetPtr stylesheet_xsp;
};
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;
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 <schemaInfo>",
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)
{
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); */
{
struct filter_info *tinfo = clientData;
destroy_schemas(tinfo);
+ xfree(tinfo->full_name);
if (tinfo->reader)
xmlFreeTextReader(tinfo->reader);
odr_destroy(tinfo->odr);
sscanf(id_str, "%255s", ctrl->match_criteria);
if (rank_str)
- ctrl->staticrank = atoi(rank_str);
-
+ ctrl->staticrank = atozint(rank_str);
ptr = ptr->children;
}
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);
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;
{
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)
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 || p->setStoreData == 0)
+ return extract_full(tinfo, p);
+ else
+ return extract_split(tinfo, p);
}
static int ioread_ret(void *context, char *buffer, int len)
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, "<snippet xmlns='%s'>\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, " <term ord='%d' seqno='" ZINT_FORMAT "' %s>",
- w->ord, w->seqno,
- (w->match ? "match='1'" : ""));
- wrbuf_xmlputs(wrbuf, w->term);
- wrbuf_printf(wrbuf, "</term>\n");
- }
- }
- if (text_mode)
- wrbuf_printf(wrbuf, "\'");
- else
- wrbuf_printf(wrbuf, "</snippet>\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; */
xmlDocPtr resDoc;
xmlDocPtr doc;
struct filter_schema *schema;
- int window_size = -1;
if (p->comp)
{
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)
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_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
{
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;
- 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->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;
- 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->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);