/*
- * Copyright (c) 1998-2003, Index Data.
+ * Copyright (c) 1998-2004, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy-config.cpp,v 1.18 2004-01-05 09:31:09 adam Exp $
+ * $Id: yaz-proxy-config.cpp,v 1.26 2004-01-29 21:33:39 adam Exp $
*/
#include <ctype.h>
}
#if HAVE_XSLT
-int Yaz_ProxyConfig::check_esn(xmlNodePtr ptr, Z_RecordComposition *comp)
+int Yaz_ProxyConfig::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp,
+ const char *schema_identifier)
{
char *esn = 0;
int default_match = 1;
{
esn = comp->u.simple->u.generic;
}
+ // if no ESN/schema was given accept..
if (!esn)
return 1;
+ // check if schema identifier match
+ if (schema_identifier && !strcmp(esn, schema_identifier))
+ return 1;
+ // Check each name element
for (; ptr; ptr = ptr->next)
{
- if (ptr->type == XML_TEXT_NODE)
+ if (ptr->type == XML_ELEMENT_NODE
+ && !strcmp((const char *) ptr->name, "name"))
{
+ xmlNodePtr tptr = ptr->children;
default_match = 0;
- xmlChar *t = ptr->content;
- while (*t)
- {
- while (*t && isspace(*t))
- t++;
- xmlChar *s = t;
- int i = 0;
- while (esn[i] && esn[i] == *s)
+ for (; tptr; tptr = tptr->next)
+ if (tptr->type == XML_TEXT_NODE && tptr->content)
{
- i++;
- s++;
+ xmlChar *t = tptr->content;
+ while (*t && isspace(*t))
+ t++;
+ int i = 0;
+ while (esn[i] && esn[i] == t[i])
+ i++;
+ if (!esn[i] && (!t[i] || isspace(t[i])))
+ return 1;
}
- if (!esn[i] && (!*s || isspace(*s)))
- return 1;
- while (*s && !isspace(*s))
- s++;
- t = s;
- }
}
}
return default_match;
int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name,
Odr_oid *syntax, Z_RecordComposition *comp,
char **addinfo,
- char **stylesheet)
+ char **stylesheet, char **schema)
{
if (stylesheet)
{
xfree (*stylesheet);
*stylesheet = 0;
}
+ if (schema)
+ {
+ xfree (*schema);
+ *schema = 0;
+ }
#if HAVE_XSLT
+ int syntax_has_matched = 0;
xmlNodePtr ptr;
ptr = find_target_node(name, 0);
const char *match_error = 0;
const char *match_marcxml = 0;
const char *match_stylesheet = 0;
+ const char *match_identifier = 0;
struct _xmlAttr *attr;
for (attr = ptr->properties; attr; attr = attr->next)
{
if (!strcmp((const char *) attr->name, "stylesheet") &&
attr->children && attr->children->type == XML_TEXT_NODE)
match_stylesheet = (const char *) attr->children->content;
+ if (!strcmp((const char *) attr->name, "identifier") &&
+ attr->children && attr->children->type == XML_TEXT_NODE)
+ match_identifier = (const char *) attr->children->content;
}
if (match_type)
{
}
}
if (match)
- match = check_esn(ptr->children, comp);
-
+ {
+ if (!match_error)
+ syntax_has_matched = 1;
+ match = check_schema(ptr->children, comp, match_identifier);
+ }
if (match)
{
if (stylesheet && match_stylesheet)
xfree(*stylesheet);
*stylesheet = xstrdup(match_stylesheet);
}
+ if (schema && match_identifier)
+ {
+ xfree(*schema);
+ *schema = xstrdup(match_identifier);
+ }
if (match_marcxml)
{
return -1;
}
if (match_error)
{
+ if (syntax_has_matched) // if syntax OK, bad schema/ESN
+ return 25;
if (syntax)
{
char dotoid_str[100];
if (ptr->type == XML_ELEMENT_NODE &&
!strcmp((const char *) ptr->name, "explain"))
{
+ xmlNodePtr ptr1 = ptr->children;
+ if (db)
+ {
+ for (; ptr1; ptr1 = ptr1->next)
+ if (ptr1->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr1->name, "serverInfo"))
+ break;
+ if (!ptr1)
+ continue;
+ for (ptr1 = ptr1->children; ptr1; ptr1 = ptr1->next)
+ if (ptr1->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr1->name, "database"))
+ break;
+
+ if (!ptr1)
+ continue;
+ for (ptr1 = ptr1->children; ptr1; ptr1 = ptr1->next)
+ if (ptr1->type == XML_TEXT_NODE &&
+ ptr1->content &&
+ !strcmp((const char *) ptr1->content, db))
+ break;
+ if (!ptr1)
+ continue;
+ }
xmlNodePtr ptr2 = xmlCopyNode(ptr, 1);
xmlDocPtr doc = xmlNewDoc((const xmlChar *) "1.0");
xmlDocSetRootElement(doc, ptr2);
xmlChar *buf_out;
- int len_out;
xmlDocDumpMemory(doc, &buf_out, len);
char *content = (char*) odr_malloc(odr, *len);
memcpy(content, buf_out, *len);
return content;
}
}
- else
- yaz_log(LOG_WARN, "No explain node 1");
-
#endif
yaz_log(LOG_WARN, "No explain node");
return 0;