27 #include <yaz/diagbib1.h>
28 #include <yaz/tpath.h>
29 #include <yaz/oid_db.h>
30 #include <yaz/snprintf.h>
32 #include <libxml/xmlversion.h>
33 #include <libxml/parser.h>
34 #include <libxml/tree.h>
35 #include <libxml/xmlIO.h>
36 #include <libxml/xmlreader.h>
37 #include <libxslt/transform.h>
38 #include <libxslt/xsltutils.h>
41 #include <libexslt/exslt.h>
69 #define ZEBRA_SCHEMA_XSLT_NS "http://indexdata.dk/zebra/xslt/1"
71 #define XML_STRCMP(a,b) strcmp((char*)a, b)
72 #define XML_STRLEN(a) strlen((char*)a)
77 const char *value, ODR odr)
79 char *quoted = odr_malloc(odr, 3 + strlen(value));
80 yaz_snprintf(quoted, 3 + strlen(value),
"'" ZINT_FORMAT "'", value);
91 char *quoted = odr_malloc(odr, 30);
92 yaz_snprintf(quoted, 30,
"'" ZINT_FORMAT "'", value);
100 #define ENABLE_INPUT_CALLBACK 0
102 #if ENABLE_INPUT_CALLBACK
103 static int zebra_xmlInputMatchCallback (
char const *filename)
105 yaz_log(YLOG_LOG,
"match %s", filename);
109 static void * zebra_xmlInputOpenCallback (
char const *filename)
114 static int zebra_xmlInputReadCallback (
void * context,
char * buffer,
int len)
119 static int zebra_xmlInputCloseCallback (
void * context)
134 tinfo->
odr = odr_createmem(ODR_ENCODE);
142 #if ENABLE_INPUT_CALLBACK
143 xmlRegisterDefaultInputCallbacks();
144 xmlRegisterInputCallbacks(zebra_xmlInputMatchCallback,
145 zebra_xmlInputOpenCallback,
146 zebra_xmlInputReadCallback,
147 zebra_xmlInputCloseCallback);
153 const char **dst_content)
155 if (!
XML_STRCMP(attr->name, name) && attr->children
156 && attr->children->type == XML_TEXT_NODE)
158 *dst_content = (
const char *)(attr->children->content);
173 schema = schema_next;
178 xmlFreeDoc(tinfo->
doc);
184 char tmp_full_name[1024];
186 tinfo->
fname = xstrdup(fname);
189 NULL, tmp_full_name))
190 tinfo->
full_name = xstrdup(tmp_full_name);
194 yaz_log(YLOG_LOG,
"alvis filter: loading config file %s", tinfo->
full_name);
200 yaz_log(YLOG_WARN,
"alvis filter: could not parse config file %s",
206 ptr = xmlDocGetRootElement(tinfo->
doc);
207 if (!ptr || ptr->type != XML_ELEMENT_NODE
211 "alvis filter: config file %s :"
212 " expected root element <schemaInfo>",
217 for (ptr = ptr->children; ptr; ptr = ptr->next)
219 if (ptr->type != XML_ELEMENT_NODE)
223 struct _xmlAttr *attr;
232 for (attr = ptr->properties; attr; attr = attr->next)
246 char tmp_xslt_full_name[1024];
248 NULL, tmp_xslt_full_name))
251 "alvis filter: stylesheet %s not found in path %s",
256 = xsltParseStylesheetFile((
const xmlChar*) tmp_xslt_full_name);
260 "alvis filter: could not parse xslt stylesheet %s",
268 struct _xmlAttr *attr;
269 for (attr = ptr->properties; attr; attr = attr->next)
271 const char *split_level_str = 0;
274 split_level_str ? atoi(split_level_str) : 0;
279 yaz_log(YLOG_WARN,
"Bad element %s in %s", ptr->name, fname);
291 for (schema = tinfo->
schemas; schema; schema = schema->
next)
299 if (schema->
name && !strcmp(schema->
name, est))
319 yaz_log(YLOG_WARN,
"alvis filter: need config file");
323 if (tinfo->
fname && !strcmp(args, tinfo->
fname))
327 yaz_log(YLOG_LOG,
"alvis filter: profilePath %s", tinfo->
profile_path);
339 xmlFreeTextReader(tinfo->
reader);
340 odr_destroy(tinfo->
odr);
344 static int ioread_ex(
void *context,
char *buffer,
int len)
356 xmlNodePtr ptr,
RecWord *recWord)
358 for(; ptr; ptr = ptr->next)
361 if (ptr->type != XML_TEXT_NODE)
363 recWord->
term_buf = (
const char *)ptr->content;
370 xmlNodePtr ptr,
RecWord *recWord)
372 for(; ptr; ptr = ptr->next)
374 index_node(tinfo, ctrl, ptr->children, recWord);
375 if (ptr->type != XML_ELEMENT_NODE || !ptr->ns ||
380 const char *name_str = 0;
381 const char *type_str = 0;
382 const char *xpath_str = 0;
383 struct _xmlAttr *attr;
384 for (attr = ptr->properties; attr; attr = attr->next)
394 if (type_str && *type_str)
395 recWord->
index_type = (
const char *) type_str;
406 xmlNodePtr ptr,
RecWord *recWord)
408 const char *type_str =
"update";
410 if (ptr && ptr->type == XML_ELEMENT_NODE && ptr->ns &&
414 const char *id_str = 0;
415 const char *rank_str = 0;
416 struct _xmlAttr *attr;
417 for (attr = ptr->properties; attr; attr = attr->next)
431 if (!strcmp(
"update", type_str))
433 else if (!strcmp(
"delete", type_str))
434 yaz_log(YLOG_WARN,
"alvis filter delete: to be implemented");
436 yaz_log(YLOG_WARN,
"alvis filter: unknown record type '%s'",
444 const char *params[10];
453 (*p->
init)(p, &recWord);
463 xmlDocDumpMemory(resDoc, &buf_out, &len_out);
464 fwrite(buf_out, len_out, 1, stdout);
467 root_ptr = xmlDocGetRootElement(resDoc);
472 yaz_log(YLOG_WARN,
"No root for index XML record."
473 " split_level=%d stylesheet=%s",
478 xmlDocDumpMemory(doc, &buf_out, &len_out);
480 fwrite(buf_out, len_out, 1, stdout);
496 xmlFreeTextReader(tinfo->
reader);
508 ret = xmlTextReaderRead(tinfo->
reader);
511 int type = xmlTextReaderNodeType(tinfo->
reader);
512 int depth = xmlTextReaderDepth(tinfo->
reader);
513 if (type == XML_READER_TYPE_ELEMENT && tinfo->
split_level == depth)
515 xmlNodePtr ptr = xmlTextReaderExpand(tinfo->
reader);
518 xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
519 xmlDocPtr doc = xmlNewDoc((
const xmlChar*)
"1.0");
521 xmlDocSetRootElement(doc, ptr2);
527 xmlFreeTextReader(tinfo->
reader);
532 ret = xmlTextReaderRead(tinfo->
reader);
534 xmlFreeTextReader(tinfo->
reader);
567 odr_reset(tinfo->
odr);
589 const char *params[32];
597 if (p->
comp->which == Z_RecordComp_simple
598 && p->
comp->u.simple->which == Z_ElementSetNames_generic)
600 esn = p->
comp->u.simple->u.generic;
602 else if (p->
comp->which == Z_RecordComp_complex
603 && p->
comp->u.complex->generic->elementSpec
604 && p->
comp->u.complex->generic->elementSpec->which ==
605 Z_ElementSpec_elementSetName)
607 esn = p->
comp->u.complex->generic->elementSpec->u.elementSetName;
614 YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
642 XML_PARSE_XINCLUDE | XML_PARSE_NOENT | XML_PARSE_NONET);
645 p->
diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
659 p->
diagnostic = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
668 xsltSaveResultToString(&buf_out, &len_out, resDoc,
671 xmlDocDumpMemory(resDoc, &buf_out, &len_out);
679 else if (!oid_oidcmp(p->
output_format, yaz_oid_recsyn_sutrs))
685 xsltSaveResultToString(&buf_out, &len_out, resDoc,
688 xmlDocDumpMemory(resDoc, &buf_out, &len_out);
699 p->
diagnostic = YAZ_BIB1_RECORD_SYNTAX_UNSUPP;
716 #if IDZEBRA_STATIC_ALVIS
static void index_cdata(struct filter_info *tinfo, struct recExtractCtrl *ctrl, xmlNodePtr ptr, RecWord *recWord)
static void filter_destroy(void *clientData)
#define ZEBRA_SCHEMA_XSLT_NS
static struct filter_schema * lookup_schema(struct filter_info *tinfo, const char *est)
static ZEBRA_RES create_schemas(struct filter_info *tinfo, const char *fname)
static int filter_retrieve(void *clientData, struct recRetrieveCtrl *p)
static int ioclose_ret(void *context)
static int filter_extract(void *clientData, struct recExtractCtrl *p)
static struct recType filter_type
static int ioclose_ex(void *context)
static void set_param_int(const char **params, const char *name, zint value, ODR odr)
static int ioread_ret(void *context, char *buffer, int len)
static int attr_content(struct _xmlAttr *attr, const char *name, const char **dst_content)
static void * filter_init(Res res, RecType recType)
static void index_record(struct filter_info *tinfo, struct recExtractCtrl *ctrl, xmlNodePtr ptr, RecWord *recWord)
static void set_param_str(const char **params, const char *name, const char *value, ODR odr)
static int extract_doc(struct filter_info *tinfo, struct recExtractCtrl *p, xmlDocPtr doc)
static void index_node(struct filter_info *tinfo, struct recExtractCtrl *ctrl, xmlNodePtr ptr, RecWord *recWord)
static int ioread_ex(void *context, char *buffer, int len)
static void destroy_schemas(struct filter_info *tinfo)
static int extract_full(struct filter_info *tinfo, struct recExtractCtrl *p)
static int extract_split(struct filter_info *tinfo, struct recExtractCtrl *p)
static const char * zebra_xslt_ns
static ZEBRA_RES filter_config(void *clientData, Res res, const char *args)
#define RECCTRL_EXTRACT_EOF
#define RECCTRL_EXTRACT_ERROR_GENERIC
#define RECCTRL_EXTRACT_OK
const char * res_get(Res r, const char *name)
int(* readf)(struct ZebraRecStream *s, char *buf, size_t count)
read function
struct filter_schema * schemas
const char * profile_path
xsltStylesheetPtr stylesheet_xsp
const char * default_schema
struct filter_schema * next
const Odr_oid * input_format
Z_RecordComposition * comp
struct ZebraRecStream * stream
const Odr_oid * output_format
zint atozint(const char *src)
short ZEBRA_RES
Common return type for Zebra API.