* Copyright (c) 1998-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: yaz-proxy-config.cpp,v 1.15 2003-12-16 14:17:01 adam Exp $
+ * $Id: yaz-proxy-config.cpp,v 1.17 2003-12-22 15:16:23 adam Exp $
*/
#include <ctype.h>
#if HAVE_XML2
xmlNodePtr ptr;
- ptr = find_target_node(name);
+ ptr = find_target_node(name, 0);
if (ptr)
{
if (query->which == Z_Query_type_1 || query->which == Z_Query_type_101)
#if HAVE_XML2
xmlNodePtr ptr;
- ptr = find_target_node(name);
+ ptr = find_target_node(name, 0);
if (!ptr)
return 0;
for(ptr = ptr->children; ptr; ptr = ptr->next)
}
#if HAVE_XML2
-xmlNodePtr Yaz_ProxyConfig::find_target_node(const char *name)
+xmlNodePtr Yaz_ProxyConfig::find_target_db(xmlNodePtr ptr, const char *db)
+{
+ xmlNodePtr dptr;
+ if (!db)
+ return ptr;
+ if (!ptr)
+ return 0;
+ for (dptr = ptr->children; dptr; dptr = dptr->next)
+ if (dptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) dptr->name, "database"))
+ {
+ struct _xmlAttr *attr;
+ for (attr = dptr->properties; attr; attr = attr->next)
+ if (!strcmp((const char *) attr->name, "name"))
+ {
+ if (attr->children
+ && attr->children->type==XML_TEXT_NODE
+ && attr->children->content
+ && (!strcmp((const char *) attr->children->content, db)
+ || !strcmp((const char *) attr->children->content,
+ "*")))
+ return dptr;
+ }
+ }
+ return ptr;
+}
+
+xmlNodePtr Yaz_ProxyConfig::find_target_node(const char *name, const char *db)
{
xmlNodePtr ptr;
if (!m_proxyPtr)
{
xmlChar *t = attr->children->content;
if (!t || *t == '1')
- return ptr;
+ {
+ return find_target_db(ptr, db);
+ }
}
}
else
|| !strcmp((const char *) attr->children->content,
"*")))
{
- return ptr;
+ return find_target_db(ptr, db);
}
}
}
#endif
}
+char *Yaz_ProxyConfig::get_explain(ODR odr, const char *name, const char *db,
+ int *len)
+{
+#if HAVE_XML2
+ xmlNodePtr ptr = find_target_node(name, db);
+ if (ptr)
+ {
+ ptr = ptr->children;
+ for (; ptr; ptr = ptr->next)
+ if (ptr->type == XML_ELEMENT_NODE &&
+ !strcmp((const char *) ptr->name, "explain"))
+ {
+ 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);
+
+ xmlFree(buf_out);
+ xmlFreeDoc(doc);
+ return content;
+ }
+ }
+ else
+ yaz_log(LOG_WARN, "No explain node 1");
+
+#endif
+ yaz_log(LOG_WARN, "No explain node");
+ return 0;
+}
+
void Yaz_ProxyConfig::get_target_info(const char *name,
const char **url,
int *limit_bw,
}
}
}
- ptr = find_target_node(name);
+ ptr = find_target_node(name, 0);
if (ptr)
{
if (name)