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
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
yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap);
if (ptr)
{
yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap);
if (ptr)
{
- yaz_log(level, "%s:%ld: %s", tinfo->fname ? tinfo->fname : "none",
+ yaz_log(level, "%s:%ld: %s", tinfo->fname ? tinfo->fname : "none",
static int attr_content(struct _xmlAttr *attr, const char *name,
const char **dst_content)
{
static int attr_content(struct _xmlAttr *attr, const char *name,
const char **dst_content)
{
p->next = 0;
p->which = convert_xslt_type;
p->u.xslt.stylesheet = 0;
p->u.xslt.stylesheet_xsp = 0;
p->next = 0;
p->which = convert_xslt_type;
p->u.xslt.stylesheet = 0;
p->u.xslt.stylesheet_xsp = 0;
for (attr = ptr->properties; attr; attr = attr->next)
if (attr_content(attr, "stylesheet", &p->u.xslt.stylesheet))
;
for (attr = ptr->properties; attr; attr = attr->next)
if (attr_content(attr, "stylesheet", &p->u.xslt.stylesheet))
;
tmp_xslt_full_name))
{
dom_log(YLOG_WARN, tinfo, 0,
"stylesheet %s not found in "
"path %s",
tmp_xslt_full_name))
{
dom_log(YLOG_WARN, tinfo, 0,
"stylesheet %s not found in "
"path %s",
for (attr = ptr->properties; attr; attr = attr->next)
dom_log(YLOG_WARN, tinfo, ptr,
"bad attribute @%s", attr->name);
for (attr = ptr->properties; attr; attr = attr->next)
dom_log(YLOG_WARN, tinfo, ptr,
"bad attribute @%s", attr->name);
-static int process_meta(struct filter_info *tinfo, xmlDocPtr doc, xmlNodePtr node,
+static int process_meta(struct filter_info *tinfo, xmlDocPtr doc, xmlNodePtr node,
if (0 == XML_STRCMP(node->name, "meta"))
{
const char *element_set_name = 0;
if (0 == XML_STRCMP(node->name, "meta"))
{
const char *element_set_name = 0;
;
else
{
dom_log(YLOG_WARN, tinfo, node,
;
else
{
dom_log(YLOG_WARN, tinfo, node,
ret = retctr->special_fetch(retctr->handle,
element_set_name,
input_format, &output_format,
result, addinfo);
if (ret == 0)
{
ret = retctr->special_fetch(retctr->handle,
element_set_name,
input_format, &output_format,
result, addinfo);
if (ret == 0)
{
struct recExtractCtrl *extctr,
struct recRetrieveCtrl *retctr,
struct convert_s *convert,
struct recExtractCtrl *extctr,
struct recRetrieveCtrl *retctr,
struct convert_s *convert,
/* now saving into buffer and re-reading into DOM to avoid annoing
XSLT problem with thrown-out indentation text nodes */
xsltSaveResultToString(&buf_out, &len_out, res_doc,
/* now saving into buffer and re-reading into DOM to avoid annoing
XSLT problem with thrown-out indentation text nodes */
xsltSaveResultToString(&buf_out, &len_out, res_doc,
- yaz_log(YLOG_LOG, "%s: XSLT %s\n %.*s",
- tinfo->fname ? tinfo->fname : "(none)",
+ yaz_log(YLOG_LOG, "%s: XSLT %s\n %.*s",
+ tinfo->fname ? tinfo->fname : "(none)",
for (attr = ptr->properties; attr; attr = attr->next)
{
if (attr_content(attr, "inputcharset", &input_charset))
for (attr = ptr->properties; attr; attr = attr->next)
{
if (attr_content(attr, "inputcharset", &input_charset))
- dom_log(YLOG_WARN, tinfo, ptr,
+ dom_log(YLOG_WARN, tinfo, ptr,
= new_input(tinfo, DOM_INPUT_MARC);
p->u.marc.handle = yaz_marc_create();
p->u.marc.iconv = iconv;
= new_input(tinfo, DOM_INPUT_MARC);
p->u.marc.handle = yaz_marc_create();
p->u.marc.iconv = iconv;
= new_input(tinfo, DOM_INPUT_XMLREADER);
struct _xmlAttr *attr;
const char *level_str = 0;
= new_input(tinfo, DOM_INPUT_XMLREADER);
struct _xmlAttr *attr;
const char *level_str = 0;
NULL, tmp_full_name))
tinfo->full_name = nmem_strdup(tinfo->nmem_config, tmp_full_name);
else
tinfo->full_name = nmem_strdup(tinfo->nmem_config, tinfo->fname);
NULL, tmp_full_name))
tinfo->full_name = nmem_strdup(tinfo->nmem_config, tmp_full_name);
else
tinfo->full_name = nmem_strdup(tinfo->nmem_config, tinfo->fname);
yaz_log(YLOG_LOG, "%s dom filter: "
"loading config file %s", tinfo->fname, tinfo->full_name);
yaz_log(YLOG_LOG, "%s dom filter: "
"loading config file %s", tinfo->fname, tinfo->full_name);
|| XML_STRCMP(ptr->name, "dom"))
{
dom_log(YLOG_WARN, tinfo, ptr,
|| XML_STRCMP(ptr->name, "dom"))
{
dom_log(YLOG_WARN, tinfo, ptr,
struct _xmlAttr *attr;
struct filter_extract *f =
nmem_malloc(tinfo->nmem_config, sizeof(*f));
struct _xmlAttr *attr;
struct filter_extract *f =
nmem_malloc(tinfo->nmem_config, sizeof(*f));
parse_convert(tinfo, ptr->children, &f->convert);
}
else if (!XML_STRCMP(ptr->name, "retrieve"))
parse_convert(tinfo, ptr->children, &f->convert);
}
else if (!XML_STRCMP(ptr->name, "retrieve"))
struct filter_retrieve **fp = &tinfo->retrieve_list;
struct filter_retrieve *f =
nmem_malloc(tinfo->nmem_config, sizeof(*f));
struct filter_retrieve **fp = &tinfo->retrieve_list;
struct filter_retrieve *f =
nmem_malloc(tinfo->nmem_config, sizeof(*f));
= new_input(tinfo, DOM_INPUT_XMLREADER);
p->u.xmlreader.split_level = 0;
p->u.xmlreader.reader = 0;
= new_input(tinfo, DOM_INPUT_XMLREADER);
p->u.xmlreader.split_level = 0;
p->u.xmlreader.reader = 0;
if (f->identifier && !strcmp(f->identifier, est))
return f;
if (f->name && !strcmp(f->name, est))
return f;
if (f->identifier && !strcmp(f->identifier, est))
return f;
if (f->name && !strcmp(f->name, est))
return f;
const char *index_p)
{
if (tinfo->record_info_invoked == 1)
{
xmlChar *text = xmlNodeGetContent(node);
size_t text_len = strlen((const char *)text);
const char *index_p)
{
if (tinfo->record_info_invoked == 1)
{
xmlChar *text = xmlNodeGetContent(node);
size_t text_len = strlen((const char *)text);
+ {
+ /* keep seqno base so that all text will have
+ identical seqno's for multiple fields , e.g
+ <z:index name="title:w any:w title:p">.. */
+
+ zint seqno_base = recword->seqno;
+ zint seqno_max = recword->seqno;
+
+
eval = look;
strncpy((char *)index, (const char *)bval, eval - bval);
index[eval - bval] = '\0';
eval = look;
strncpy((char *)index, (const char *)bval, eval - bval);
index[eval - bval] = '\0';
recword->index_name = (const char *)index;
if (*type)
recword->index_type = (const char *) type;
/* writing debug out */
if (extctr->flagShowRecords)
recword->index_name = (const char *)index;
if (*type)
recword->index_type = (const char *) type;
/* writing debug out */
if (extctr->flagShowRecords)
- dom_log(YLOG_LOG, tinfo, 0,
- "INDEX '%s:%s' '%s'",
+ dom_log(YLOG_LOG, tinfo, 0,
+ "INDEX '%s:%s' '%s'",
-static void set_record_info(struct filter_info *tinfo,
- struct recExtractCtrl *extctr,
- xmlNodePtr node,
- const char * id_p,
- const char * rank_p,
+static void set_record_info(struct filter_info *tinfo,
+ struct recExtractCtrl *extctr,
+ xmlNodePtr node,
+ const char * id_p,
+ const char * rank_p,
const char * type_p)
{
/* writing debug info out */
if (extctr && extctr->flagShowRecords)
dom_log(YLOG_LOG, tinfo, node,
const char * type_p)
{
/* writing debug info out */
if (extctr && extctr->flagShowRecords)
dom_log(YLOG_LOG, tinfo, node,
id_p ? (const char *) id_p : "(null)",
rank_p ? (const char *) rank_p : "(null)",
type_p ? (const char *) type_p : "(null)");
id_p ? (const char *) id_p : "(null)",
rank_p ? (const char *) rank_p : "(null)",
type_p ? (const char *) type_p : "(null)");
- sscanf((const char *)id_p, "%255s", extctr->match_criteria);
+ {
+ size_t l = strlen(id_p);
+ if (l >= sizeof(extctr->match_criteria))
+ l = sizeof(extctr->match_criteria)-1;
+ memcpy(extctr->match_criteria, id_p, l);
+ extctr->match_criteria[l] = '\0';
+ }
-static void process_xml_element_zebra_node(struct filter_info *tinfo,
- struct recExtractCtrl *extctr,
- RecWord* recword,
+static void process_xml_element_zebra_node(struct filter_info *tinfo,
+ struct recExtractCtrl *extctr,
+ RecWord* recword,
for (attr = node->properties; attr; attr = attr->next)
{
if (attr_content(attr, "name", &index_p))
{
index_value_of(tinfo, extctr, recword, node, index_p);
for (attr = node->properties; attr; attr = attr->next)
{
if (attr_content(attr, "name", &index_p))
{
index_value_of(tinfo, extctr, recword, node, index_p);
else
{
dom_log(YLOG_WARN, tinfo, node,
else
{
dom_log(YLOG_WARN, tinfo, node,
}
}
set_record_info(tinfo, extctr, node, id_p, rank_p, type_p);
}
}
set_record_info(tinfo, extctr, node, id_p, rank_p, type_p);
else
{
dom_log(YLOG_WARN, tinfo, node,
else
{
dom_log(YLOG_WARN, tinfo, node,
if (strlen(look) > name_len)
{
if (look[name_len] == '=' && !memcmp(look, name, name_len))
if (strlen(look) > name_len)
{
if (look[name_len] == '=' && !memcmp(look, name, name_len))
-static void process_xml_pi_node(struct filter_info *tinfo,
- struct recExtractCtrl *extctr,
+static void process_xml_pi_node(struct filter_info *tinfo,
+ struct recExtractCtrl *extctr,
/* parsing PI record instructions */
if (0 == strncmp((const char *)look, "record", 6))
{
char id[256];
char rank[256];
char type[256];
/* parsing PI record instructions */
if (0 == strncmp((const char *)look, "record", 6))
{
char id[256];
char rank[256];
char type[256];
if (attr_content_pi(&look, "id", id, sizeof(id)))
;
else if (attr_content_pi(&look, "rank", rank, sizeof(rank)))
;
else if (attr_content_pi(&look, "type", type, sizeof(type)))
if (attr_content_pi(&look, "id", id, sizeof(id)))
;
else if (attr_content_pi(&look, "rank", rank, sizeof(rank)))
;
else if (attr_content_pi(&look, "type", type, sizeof(type)))
{
dom_log(YLOG_WARN, tinfo, node,
"content '%s', can not parse '%s'",
pi_p, look);
break;
}
{
dom_log(YLOG_WARN, tinfo, node,
"content '%s', can not parse '%s'",
pi_p, look);
break;
}
set_record_info(tinfo, extctr, node, id, rank, type);
set_record_info(tinfo, extctr, node, id, rank, type);
/* parsing index instruction */
else if (0 == strncmp((const char *)look, "index", 5))
{
look += 5;
/* parsing index instruction */
else if (0 == strncmp((const char *)look, "index", 5))
{
look += 5;
{
dom_log(YLOG_WARN, tinfo, node,
"content '%s', can not parse '%s'",
{
dom_log(YLOG_WARN, tinfo, node,
"content '%s', can not parse '%s'",
-static void process_xml_element_node(struct filter_info *tinfo,
- struct recExtractCtrl *extctr,
- RecWord* recword,
+static void process_xml_element_node(struct filter_info *tinfo,
+ struct recExtractCtrl *extctr,
+ RecWord* recword,
and either set record data or index value-of node content*/
process_xml_element_zebra_node(tinfo, extctr, recword, node);
and either set record data or index value-of node content*/
process_xml_element_zebra_node(tinfo, extctr, recword, node);
-static void extract_dom_doc_node(struct filter_info *tinfo,
- struct recExtractCtrl *extctr,
+static void extract_dom_doc_node(struct filter_info *tinfo,
+ struct recExtractCtrl *extctr,
- fwrite(buf_out, 1, len_out, outf);
-#endif
- yaz_log(YLOG_LOG, "Extract Doc: %.*s", len_out, buf_out);
/* input conversion */
perform_convert(tinfo, p, 0, input->convert, params, &doc, 0);
/* input conversion */
perform_convert(tinfo, p, 0, input->convert, params, &doc, 0);
perform_convert(tinfo, p, 0, tinfo->store->convert,
params, &store_doc, &last_xsp);
}
perform_convert(tinfo, p, 0, tinfo->store->convert,
params, &store_doc, &last_xsp);
}
store_doc ? store_doc : doc, last_xsp);
else
xmlDocDumpMemory(store_doc ? store_doc : doc, &buf_out, &len_out);
store_doc ? store_doc : doc, last_xsp);
else
xmlDocDumpMemory(store_doc ? store_doc : doc, &buf_out, &len_out);
/* there was nothing to index, so there is no inserted/updated record */
if (tinfo->record_info_invoked == 0)
return RECCTRL_EXTRACT_SKIP;
/* there was nothing to index, so there is no inserted/updated record */
if (tinfo->record_info_invoked == 0)
return RECCTRL_EXTRACT_SKIP;
xmlFreeTextReader(input->u.xmlreader.reader);
input->u.xmlreader.reader = xmlReaderForIO(ioread_ex, ioclose_ex,
p /* I/O handler */,
xmlFreeTextReader(input->u.xmlreader.reader);
input->u.xmlreader.reader = xmlReaderForIO(ioread_ex, ioclose_ex,
p /* I/O handler */,
int type = xmlTextReaderNodeType(input->u.xmlreader.reader);
int depth = xmlTextReaderDepth(input->u.xmlreader.reader);
int type = xmlTextReaderNodeType(input->u.xmlreader.reader);
int depth = xmlTextReaderDepth(input->u.xmlreader.reader);
input->u.xmlreader.split_level == depth)
{
xmlNodePtr ptr;
/* per default do not ingest record */
tinfo->record_info_invoked = 0;
input->u.xmlreader.split_level == depth)
{
xmlNodePtr ptr;
/* per default do not ingest record */
tinfo->record_info_invoked = 0;
xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0");
xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
xmlDocPtr doc = xmlNewDoc((const xmlChar*) "1.0");
/* writing debug info out */
if (p->flagShowRecords)
{
xmlChar *buf_out = 0;
int len_out = 0;
xmlDocDumpMemory(doc, &buf_out, &len_out);
/* writing debug info out */
if (p->flagShowRecords)
{
xmlChar *buf_out = 0;
int len_out = 0;
xmlDocDumpMemory(doc, &buf_out, &len_out);
return convert_extract_doc(tinfo, input, p, doc);
}
else
return convert_extract_doc(tinfo, input, p, doc);
}
else
struct filter_input *input,
struct recExtractCtrl *p)
{
if (p->first_record) /* only one record per stream */
{
struct filter_input *input,
struct recExtractCtrl *p)
{
if (p->first_record) /* only one record per stream */
{
"http://www.loc.gov/MARC21/slim", 0, 0);
rdoc = xmlNewDoc((const xmlChar*) "1.0");
xmlDocSetRootElement(rdoc, root_ptr);
"http://www.loc.gov/MARC21/slim", 0, 0);
rdoc = xmlNewDoc((const xmlChar*) "1.0");
xmlDocSetRootElement(rdoc, root_ptr);
- return convert_extract_doc(tinfo, input, p, rdoc);
+ return convert_extract_doc(tinfo, input, p, rdoc);
static int ioread_ret(void *context, char *buffer, int len)
{
struct recRetrieveCtrl *p = context;
static int ioread_ret(void *context, char *buffer, int len)
{
struct recRetrieveCtrl *p = context;
&& p->comp->u.complex->generic->elementSpec
&& p->comp->u.complex->generic->elementSpec->which ==
Z_ElementSpec_elementSetName)
&& p->comp->u.complex->generic->elementSpec
&& p->comp->u.complex->generic->elementSpec->which ==
Z_ElementSpec_elementSetName)
if (last_xsp)
xsltSaveResultToString(&buf_out, &len_out, doc, last_xsp);
else
if (last_xsp)
xsltSaveResultToString(&buf_out, &len_out, doc, last_xsp);
else
if (last_xsp)
xsltSaveResultToString(&buf_out, &len_out, doc, last_xsp);
else
if (last_xsp)
xsltSaveResultToString(&buf_out, &len_out, doc, last_xsp);
else
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);
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);