/* This file is part of the Zebra server.
- Copyright (C) 1995-2008 Index Data
+ Copyright (C) 1994-2010 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
*l = p;
l = &p->next;
}
- else if (!XML_STRCMP(ptr->name, "meta"))
+ else if (!XML_STRCMP(ptr->name, "process-meta"))
{
struct _xmlAttr *attr;
struct convert_s *p = nmem_malloc(tinfo->nmem_config, sizeof(*p));
struct _xmlAttr *attr;
for (attr = node->properties; attr; attr = attr->next)
{
- if (attr_content(attr, "element_set_name", &element_set_name))
+ if (attr_content(attr, "name", &element_set_name))
;
else
{
dom_log(YLOG_WARN, tinfo, node,
- "bad attribute @%s, expected @element_set_name",
- attr->name);
+ "bad attribute @%s, expected @name", attr->name);
}
}
if (element_set_name)
if (ret == 0)
{
xmlDocPtr sub_doc =
- xmlParseMemory( wrbuf_buf(result), wrbuf_len(result));
+ xmlParseMemory(wrbuf_buf(result), wrbuf_len(result));
if (sub_doc)
{
xmlNodePtr t = xmlDocGetRootElement(sub_doc);
- xmlAddChild(node, xmlCopyNode(t, 1));
+ xmlReplaceNode(node, xmlCopyNode(t, 1));
xmlFreeDoc(sub_doc);
}
}
{
xmlChar *text = xmlNodeGetContent(node);
size_t text_len = strlen((const char *)text);
-
+
/* if there is no text, we do not need to proceed */
if (text_len)
{
+ /* 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;
+
+
const char *look = index_p;
const char *bval;
const char *eval;
/* actually indexing the text given */
+ recword->seqno = seqno_base;
recword->index_name = (const char *)index;
if (*type)
recword->index_type = (const char *) type;
(extctr->tokenAdd)(recword);
+ if (seqno_max < recword->seqno)
+ seqno_max = recword->seqno;
+
/* eat whitespaces */
if (*look && ' ' == *look)
{
look++;
}
}
+ recword->seqno = seqno_max;
}
xmlFree(text);
}
if (id_p && *id_p)
- 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';
+ }
if (rank_p && *rank_p)
extctr->staticrank = atozint((const char *)rank_p);
const char *look = *c_ptr;
int ret = 0;
- *value = '\0';
- while (*look && ' ' == *look)
- look++;
if (strlen(look) > name_len)
{
if (look[name_len] == '=' && !memcmp(look, name, name_len))
ret = 1;
}
}
- while (*look && ' ' == *look)
- look++;
*c_ptr = look;
return ret;
}
*rank = '\0';
*type = '\0';
look += 6;
- while (*look)
+ for (;;)
+ {
+ /* eat whitespace */
+ while (' ' == *look)
+ look++;
+ if (*look == '\0')
+ break;
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)))
+ ;
+ else
{
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);
}
/* parsing index instruction */
int len_out;
const char *params[10];
xsltStylesheetPtr last_xsp = 0;
- xmlDocPtr store_doc = 0;
/* per default do not ingest record */
tinfo->record_info_invoked = 0;
{
xmlChar *buf_out;
int len_out;
+ xmlDocDumpMemory(doc, &buf_out, &len_out);
#if 0
FILE *outf = fopen("extract.xml", "w");
- xmlDocDumpMemory(doc, &buf_out, &len_out);
fwrite(buf_out, 1, len_out, outf);
-#endif
- yaz_log(YLOG_LOG, "Extract Doc: %.*s", len_out, buf_out);
-#if 0
fclose(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);
-
- if (tinfo->store)
+ if (p->setStoreData)
{
- /* store conversion */
- store_doc = xmlCopyDoc(doc, 1);
- perform_convert(tinfo, p, 0, tinfo->store->convert,
- params, &store_doc, &last_xsp);
- }
-
- /* saving either store doc or original doc in case no store doc exists */
- if (last_xsp)
- xsltSaveResultToString(&buf_out, &len_out,
- store_doc ? store_doc : doc, last_xsp);
- else
- xmlDocDumpMemory(store_doc ? store_doc : doc, &buf_out, &len_out);
+ xmlDocPtr store_doc = 0;
- if (p->setStoreData)
- (*p->setStoreData)(p, buf_out, len_out);
- xmlFree(buf_out);
+ /* input conversion */
+ perform_convert(tinfo, p, 0, input->convert, params, &doc, 0);
+
+ if (tinfo->store)
+ {
+ /* store conversion */
+ store_doc = xmlCopyDoc(doc, 1);
+ perform_convert(tinfo, p, 0, tinfo->store->convert,
+ params, &store_doc, &last_xsp);
+ }
+
+ /* saving either store doc or original doc in case no store doc exists */
+ if (last_xsp)
+ xsltSaveResultToString(&buf_out, &len_out,
+ store_doc ? store_doc : doc, last_xsp);
+ else
+ xmlDocDumpMemory(store_doc ? store_doc : doc, &buf_out, &len_out);
+
+ if (p->setStoreData)
+ (*p->setStoreData)(p, buf_out, len_out);
+ xmlFree(buf_out);
+ if (store_doc)
+ xmlFreeDoc(store_doc);
+ }
- if (store_doc)
- xmlFreeDoc(store_doc);
/* extract conversion */
perform_convert(tinfo, p, 0, tinfo->extract->convert, params, &doc, 0);
ptr = xmlTextReaderExpand(input->u.xmlreader.reader);
if (ptr)
- {
+ {
/* we have a new document */
xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
static int ioread_ret(void *context, char *buffer, int len)
{
struct recRetrieveCtrl *p = context;
- return p->stream->readf(p->stream, buffer, len);
+ int r = p->stream->readf(p->stream, buffer, len);
+ return r;
}
static int ioclose_ret(void *context)
{
p->diagnostic =
YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_;
- p->addinfo = odr_strdup(p->odr, esn);
+ p->addinfo = odr_strdup_null(p->odr, esn);
return 0;
}
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab