nmem_strsplit(se->session_nmem, ",", s, &stylesheets, &num);
for (i = 0; i < num; i++)
{
+ WRBUF fname = conf_get_fname(se->service, stylesheets[i]);
+
(*m) = nmem_malloc(se->session_nmem, sizeof(**m));
(*m)->next = 0;
-
+
// XSLT
if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl"))
{
(*m)->marcmap = NULL;
- if (!((*m)->stylesheet = conf_load_stylesheet(se->service, stylesheets[i])))
+ if (!((*m)->stylesheet =
+ xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname))))
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s",
stylesheets[i]);
+ wrbuf_destroy(fname);
return -1;
}
}
else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap"))
{
(*m)->stylesheet = NULL;
- if (!((*m)->marcmap = marcmap_load(stylesheets[i], se->session_nmem)))
+ if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), se->session_nmem)))
{
yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s",
stylesheets[i]);
+ wrbuf_destroy(fname);
return -1;
}
}
-
+ wrbuf_destroy(fname);
m = &(*m)->next;
}
}
int subnum;
int subi;
struct database_criterion *new = nmem_malloc(m, sizeof(*new));
- char *eq = strchr(values[i], '=');
+ char *eq;
+ if (eq = strchr(values[i], '='))
+ new->type = PAZPAR2_STRING_MATCH;
+ if (eq = strchr(values[i], '~'))
+ new->type = PAZPAR2_SUBSTRING_MATCH;
if (!eq)
{
- yaz_log(YLOG_WARN, "Missing equal-sign in filter");
+ yaz_log(YLOG_WARN, "Missing equal-signi/tilde in filter");
return 0;
}
*(eq++) = '\0';
else
{
no_working++;
- if (client_prep_connection(cl, se->service->z3950_connect_timeout,
+ if (client_prep_connection(cl, se->service->z3950_operation_timeout,
se->service->z3950_session_timeout))
client_start_search(cl);
}
WRBUF norm_wr = wrbuf_alloc();
xmlNode *n;
- /* create mergekey based on mergekey attribute from XSL (if any) */
+ /* consider mergekey from XSL first */
xmlChar *mergekey = xmlGetProp(root, (xmlChar *) "mergekey");
if (mergekey)
{
pp2_relevance_token_destroy(prt);
xmlFree(mergekey);
}
- /* append (if any) mergekey=yes metadata values */
- for (n = root->children; n; n = n->next)
+ else
{
- if (n->type != XML_ELEMENT_NODE)
- continue;
- if (!strcmp((const char *) n->name, "metadata"))
+ /* no mergekey defined in XSL. Look for mergekey metadata instead */
+ for (n = root->children; n; n = n->next)
{
- struct conf_metadata *ser_md = 0;
- int md_field_id = -1;
-
- xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
-
- if (!type)
+ if (n->type != XML_ELEMENT_NODE)
continue;
-
- md_field_id
- = conf_service_metadata_field_id(service,
- (const char *) type);
- if (md_field_id >= 0)
+ if (!strcmp((const char *) n->name, "metadata"))
{
- ser_md = &service->metadata[md_field_id];
- if (ser_md->mergekey == Metadata_mergekey_yes)
+ struct conf_metadata *ser_md = 0;
+ int md_field_id = -1;
+
+ xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
+
+ if (!type)
+ continue;
+
+ md_field_id
+ = conf_service_metadata_field_id(service,
+ (const char *) type);
+ if (md_field_id >= 0)
{
- xmlChar *value = xmlNodeListGetString(doc, n->children, 1);
- if (value)
+ ser_md = &service->metadata[md_field_id];
+ if (ser_md->mergekey == Metadata_mergekey_yes)
{
- const char *norm_str;
- pp2_relevance_token_t prt =
- pp2_relevance_tokenize(
- service->mergekey_pct,
- (const char *) value);
-
- while ((norm_str = pp2_relevance_token_next(prt)))
+ xmlChar *value = xmlNodeListGetString(doc, n->children, 1);
+ if (value)
{
- if (*norm_str)
+ const char *norm_str;
+ pp2_relevance_token_t prt =
+ pp2_relevance_tokenize(
+ service->mergekey_pct,
+ (const char *) value);
+
+ while ((norm_str = pp2_relevance_token_next(prt)))
{
- if (wrbuf_len(norm_wr))
- wrbuf_puts(norm_wr, " ");
- wrbuf_puts(norm_wr, norm_str);
+ if (*norm_str)
+ {
+ if (wrbuf_len(norm_wr))
+ wrbuf_puts(norm_wr, " ");
+ wrbuf_puts(norm_wr, norm_str);
+ }
}
+ xmlFree(value);
+ pp2_relevance_token_destroy(prt);
}
- xmlFree(value);
- pp2_relevance_token_destroy(prt);
}
}
+ xmlFree(type);
}
- xmlFree(type);
}
}
return mergekey_norm;
}
-static const char *str_tok_n(const char *s, const char *delim,
- const char **res, size_t *len)
-{
- *res = s;
- while (*s && !strchr(delim, *s))
- s++;
- *len = s - *res;
- if (*len == 0)
- return 0;
- if (*s && strchr(delim, *s))
- s++;
- return s;
-}
-
/** \brief see if metadata for pz:recordfilter exists
\param root xml root element of normalized record
\param sdb session database for client
xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
if (type)
{
- const char *s1 = s;
size_t len;
- const char *value;
- while ((s1 = str_tok_n(s1, ",", &value, &len)) != 0)
+ const char *eq = strchr(s, '=');
+ if (eq)
+ len = eq - s;
+ else
+ len = strlen(s);
+ if (len == strlen((const char *)type) &&
+ !memcmp((const char *) type, s, len))
{
- if (len == strlen((const char *)type) &&
- !memcmp((const char *) type, s, len))
+ xmlChar *value = xmlNodeGetContent(n);
+ if (value && *value)
{
- xmlChar *value = xmlNodeGetContent(n);
- if (value && *value)
- {
- xmlFree(value);
+ if (!eq || strstr((const char *) value, eq+1))
match = 1;
- }
}
+ xmlFree(value);
}
xmlFree(type);
}