X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fyaz-proxy-config.cpp;h=6c3ffa6cd50c225218f3fa6178f13b6aeadc86d5;hb=307a8638d6429b0f77ad762d52309c550e45648c;hp=93068995dfff403a56c94228ea439955c6e903ff;hpb=50fbcf20ab48480e819ec5aef312a72c684bf213;p=yazpp-moved-to-github.git diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index 9306899..6c3ffa6 100644 --- a/src/yaz-proxy-config.cpp +++ b/src/yaz-proxy-config.cpp @@ -2,7 +2,7 @@ * Copyright (c) 1998-2003, Index Data. * See the file LICENSE for details. * - * $Id: yaz-proxy-config.cpp,v 1.11 2003-10-16 16:10:43 adam Exp $ + * $Id: yaz-proxy-config.cpp,v 1.15 2003-12-16 14:17:01 adam Exp $ */ #include @@ -117,7 +117,8 @@ void Yaz_ProxyConfig::return_target_info(xmlNodePtr ptr, int *client_idletime, int *keepalive_limit_bw, int *keepalive_limit_pdu, - int *pre_init) + int *pre_init, + const char **cql2rpn) { *pre_init = 0; int no_url = 0; @@ -174,6 +175,13 @@ void Yaz_ProxyConfig::return_target_info(xmlNodePtr ptr, *client_idletime = 0; } } + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "cql2rpn")) + { + const char *t = get_text(ptr); + if (t) + *cql2rpn = t; + } } } #endif @@ -213,63 +221,70 @@ int Yaz_ProxyConfig::match_list(int v, const char *m) } #if HAVE_XML2 -int Yaz_ProxyConfig::check_type_1_attributes(ODR odr, xmlNodePtr ptr, +int Yaz_ProxyConfig::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, Z_AttributeList *attrs, char **addinfo) { - for(ptr = ptr->children; ptr; ptr = ptr->next) + int i; + for (i = 0; inum_attributes; i++) { - if (ptr->type == XML_ELEMENT_NODE && - !strcmp((const char *) ptr->name, "attribute")) + Z_AttributeElement *el = attrs->attributes[i]; + + if (!el->attributeType) + continue; + int type = *el->attributeType; + int *value = 0; + + if (el->which == Z_AttributeValue_numeric && el->value.numeric) + value = el->value.numeric; + + xmlNodePtr ptr; + for(ptr = ptrl->children; ptr; ptr = ptr->next) { - const char *match_type = 0; - const char *match_value = 0; - const char *match_error = 0; - struct _xmlAttr *attr; - for (attr = ptr->properties; attr; attr = attr->next) + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "attribute")) { - if (!strcmp((const char *) attr->name, "type") && - attr->children && attr->children->type == XML_TEXT_NODE) - match_type = (const char *) attr->children->content; - if (!strcmp((const char *) attr->name, "value") && - attr->children && attr->children->type == XML_TEXT_NODE) - match_value = (const char *) attr->children->content; - if (!strcmp((const char *) attr->name, "error") && - attr->children && attr->children->type == XML_TEXT_NODE) - match_error = (const char *) attr->children->content; - } - int i; - - if (match_type && match_value) - { - for (i = 0; inum_attributes; i++) + const char *match_type = 0; + const char *match_value = 0; + const char *match_error = 0; + struct _xmlAttr *attr; + for (attr = ptr->properties; attr; attr = attr->next) { - Z_AttributeElement *el = attrs->attributes[i]; - char value_str[20]; - - value_str[0] = '\0'; - if (!el->attributeType) - continue; - int type = *el->attributeType; - + if (!strcmp((const char *) attr->name, "type") && + attr->children && attr->children->type == XML_TEXT_NODE) + match_type = (const char *) attr->children->content; + if (!strcmp((const char *) attr->name, "value") && + attr->children && attr->children->type == XML_TEXT_NODE) + match_value = (const char *) attr->children->content; + if (!strcmp((const char *) attr->name, "error") && + attr->children && attr->children->type == XML_TEXT_NODE) + match_error = (const char *) attr->children->content; + } + if (match_type && match_value) + { + char addinfo_str[20]; if (!match_list(type, match_type)) continue; - if (el->which == Z_AttributeValue_numeric && - el->value.numeric) + + *addinfo_str = '\0'; + if (!strcmp(match_type, "*")) + sprintf (addinfo_str, "%d", type); + else if (value) { - if (!match_list(*el->value.numeric, match_value)) + if (!match_list(*value, match_value)) continue; - sprintf (value_str, "%d", *el->value.numeric); + sprintf (addinfo_str, "%d", *value); } else continue; + if (match_error) { - if (*value_str) - *addinfo = odr_strdup(odr, value_str); + if (*addinfo_str) + *addinfo = odr_strdup(odr, addinfo_str); return atoi(match_error); } - return 0; + break; } } } @@ -283,7 +298,6 @@ int Yaz_ProxyConfig::check_type_1_structure(ODR odr, xmlNodePtr ptr, Z_RPNStructure *q, char **addinfo) { - int c; if (q->which == Z_RPNStructure_complex) { int e = check_type_1_structure(odr, ptr, q->u.complex->s1, addinfo); @@ -463,7 +477,8 @@ int Yaz_ProxyConfig::get_target_no(int no, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, - int *pre_init) + int *pre_init, + const char **cql2rpn) { #if HAVE_XML2 xmlNodePtr ptr; @@ -488,7 +503,7 @@ int Yaz_ProxyConfig::get_target_no(int no, return_target_info(ptr, url, limit_bw, limit_pdu, limit_req, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, - pre_init); + pre_init, cql2rpn); return 1; } i++; @@ -497,7 +512,7 @@ int Yaz_ProxyConfig::get_target_no(int no, return 0; } -int Yaz_ProxyConfig::mycmp(const char *hay, const char *item, int len) +int Yaz_ProxyConfig::mycmp(const char *hay, const char *item, size_t len) { if (len == strlen(item) && memcmp(hay, item, len) == 0) return 1; @@ -566,7 +581,8 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *max_clients, int *keepalive_limit_bw, int *keepalive_limit_pdu, - int *pre_init) + int *pre_init, + const char **cql2rpn) { #if HAVE_XML2 xmlNodePtr ptr; @@ -602,7 +618,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, return_target_info(ptr, url, limit_bw, limit_pdu, limit_req, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, - pre_init); + pre_init, cql2rpn); } #else *url = name;