X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrw.c;h=eec15a79aa5d504ab6d7b76c7865cf08d706e8f2;hp=bd3c57758506303c1be57f4b4182e9dd77011690;hb=38b682e3f8a2c985098aa98c1d8c72fda65cf3ed;hpb=fd43f843d1366a7565533e66212507106bda5664 diff --git a/src/srw.c b/src/srw.c index bd3c577..eec15a7 100644 --- a/src/srw.c +++ b/src/srw.c @@ -133,10 +133,11 @@ static int match_xsd_string(xmlNodePtr ptr, const char *elem, ODR o, return match_xsd_string_n(ptr, elem, o, val, 0); } -static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, - char **val, int *len) +static int match_xsd_XML_n2(xmlNodePtr ptr, const char *elem, ODR o, + char **val, int *len, int fixup_root) { xmlBufferPtr buf; + int no_root_nodes = 0; if (!match_element(ptr, elem)) return 0; @@ -158,11 +159,17 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, xmlNodeDump(buf, tmp->doc, tmp, 0, 0); xmlFreeNode(tmp); + no_root_nodes++; } } - - *val = (char *) odr_malloc(o, buf->use+1); - memcpy (*val, buf->content, buf->use); + if (no_root_nodes != 1 && fixup_root) + { + /* does not appear to be an XML document. Make it so */ + xmlBufferAddHead(buf, (const xmlChar *) "", -1); + xmlBufferAdd(buf, (const xmlChar *) "", -1); + } + *val = (char *) odr_malloc(o, buf->use + 1); + memcpy(*val, buf->content, buf->use); (*val)[buf->use] = '\0'; if (len) @@ -172,7 +179,13 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, return 1; } - + +static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, + char **val, int *len) +{ + return match_xsd_XML_n2(ptr, elem, o, val, len, 0); +} + static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, Odr_int **val) { @@ -211,7 +224,7 @@ char *yaz_negotiate_sru_version(char *input_ver) if (!strcmp(input_ver, "1.1")) return "1.1"; - return "1.2"; /* our latest supported version */ + return "1.2"; /* our latest supported version */ } static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, @@ -262,18 +275,17 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, &ex.extraRecordData_buf, &ex.extraRecordData_len) ) ; - else if (match_xsd_string(ptr, "recordIdentifier", o, - &ex.recordIdentifier)) - ; - + else + match_xsd_string(ptr, "recordIdentifier", o, + &ex.recordIdentifier); } if (data_ptr) { - switch(pack) + switch (pack) { case Z_SRW_recordPacking_XML: - match_xsd_XML_n(data_ptr, "recordData", o, - &rec->recordData_buf, &rec->recordData_len); + match_xsd_XML_n2(data_ptr, "recordData", o, + &rec->recordData_buf, &rec->recordData_len, 1); break; case Z_SRW_recordPacking_URL: /* just store it as a string. @@ -304,7 +316,7 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, add_xsd_string(ptr, "recordSchema", rec->recordSchema); if (spack) add_xsd_string(ptr, "recordPacking", spack); - switch(pack) + switch (pack) { case Z_SRW_recordPacking_string: add_xsd_string_n(ptr, "recordData", rec->recordData_buf, @@ -392,13 +404,12 @@ static int yaz_srw_version(ODR o, xmlNodePtr pptr, Z_SRW_recordVersion *rec, if (match_xsd_string(ptr, "versionType", o, &rec->versionType)) ; - else if (match_xsd_string(ptr, "versionValue", o, - &rec->versionValue)) - ; + else + match_xsd_string(ptr, "versionValue", o, &rec->versionValue); } } else if (o->direction == ODR_ENCODE) - { + { xmlNodePtr ptr = pptr; add_xsd_string(ptr, "versionType", rec->versionType); add_xsd_string(ptr, "versionValue", rec->versionValue); @@ -438,7 +449,7 @@ static int yaz_srw_versions(ODR o, xmlNodePtr pptr, { int i; for (i = 0; i < *num; i++) - { + { xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST "version", 0); yaz_srw_version(o, rptr, (*vers)+i, client_data, ns); @@ -447,55 +458,62 @@ static int yaz_srw_versions(ODR o, xmlNodePtr pptr, return 0; } -Z_FacetTerm *yaz_sru_proxy_get_facet_term_count(ODR odr, xmlNodePtr node) { - - int freq; +Z_FacetTerm *yaz_sru_proxy_get_facet_term_count(ODR odr, xmlNodePtr node) +{ + Odr_int freq; xmlNodePtr child; WRBUF wrbuf = wrbuf_alloc(); - const char *freq_string = yaz_element_attribute_value_get(node, "facetvalue", "est_representation"); - Z_Term *term; + Z_FacetTerm *facet_term; + const char *freq_string = yaz_element_attribute_value_get( + node, "facetvalue", "est_representation"); if (freq_string) - freq = atoi(freq_string); + freq = odr_atoi(freq_string); else freq = -1; - for (child = node->children; child ; child = child->next) { + for (child = node->children; child ; child = child->next) + { if (child->type == XML_TEXT_NODE) - wrbuf_puts(wrbuf, (const char *) child->content); + wrbuf_puts(wrbuf, (const char *) child->content); } - term = term_create(odr, wrbuf_cstr(wrbuf)); - yaz_log(YLOG_DEBUG, "sru-proxy facet: %s %d", wrbuf_cstr(wrbuf), freq); + facet_term = facet_term_create_cstr(odr, wrbuf_cstr(wrbuf), freq); wrbuf_destroy(wrbuf); - return facet_term_create(odr, term, freq); + return facet_term; }; -static Z_FacetField *yaz_sru_proxy_decode_facet_field(ODR odr, xmlNodePtr ptr) { +static Z_FacetField *yaz_sru_proxy_decode_facet_field(ODR odr, xmlNodePtr ptr) +{ Z_AttributeList *list; Z_FacetField *facet_field; int num_terms = 0; int index = 0; xmlNodePtr node; - // USE attribute + /* USE attribute */ const char* name = yaz_element_attribute_value_get(ptr, "facet", "code"); yaz_log(YLOG_DEBUG, "sru-proxy facet type: %s", name); - list = yaz_use_atttribute_create(odr, name); + list = yaz_use_attribute_create(odr, name); for (node = ptr->children; node; node = node->next) { if (match_element(node, "facetvalue")) num_terms++; } facet_field = facet_field_create(odr, list, num_terms); index = 0; - for (node = ptr->children; node; node = node->next) { - if (match_element(node, "facetvalue")) { - facet_field_term_set(odr, facet_field, yaz_sru_proxy_get_facet_term_count(odr, node), index); - index++; + for (node = ptr->children; node; node = node->next) + { + if (match_element(node, "facetvalue")) + { + facet_field_term_set(odr, facet_field, + yaz_sru_proxy_get_facet_term_count(odr, node), + index); + index++; } } return facet_field; } -static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, Z_FacetList **facetList) +static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, + Z_FacetList **facetList) { xmlNodePtr ptr; @@ -515,8 +533,11 @@ static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, Z_FacetList **fac num_facets = 0; for (node = ptr->children; node; node= node->next) { - if (match_element(node, "facet")) { - facet_list_field_set(o, facet_list, yaz_sru_proxy_decode_facet_field(o, node), num_facets); + if (match_element(node, "facet")) + { + facet_list_field_set( + o, facet_list, + yaz_sru_proxy_decode_facet_field(o, node), num_facets); num_facets++; } } @@ -538,19 +559,19 @@ static int yaz_srw_decode_diagnostics(ODR o, xmlNodePtr pptr, *num = 0; for (ptr = pptr; ptr; ptr = ptr->next) { - if (ptr->type == XML_ELEMENT_NODE && - !xmlStrcmp(ptr->name, BAD_CAST "diagnostic")) - (*num)++; + if (ptr->type == XML_ELEMENT_NODE && + !xmlStrcmp(ptr->name, BAD_CAST "diagnostic")) + (*num)++; } if (!*num) return 1; *recs = (Z_SRW_diagnostic *) odr_malloc(o, *num * sizeof(**recs)); for (i = 0; i < *num; i++) - { - (*recs)[i].uri = 0; - (*recs)[i].details = 0; - (*recs)[i].message = 0; - } + { + (*recs)[i].uri = 0; + (*recs)[i].details = 0; + (*recs)[i].message = 0; + } for (i = 0, ptr = pptr; ptr; ptr = ptr->next) { if (ptr->type == XML_ELEMENT_NODE && @@ -568,9 +589,8 @@ static int yaz_srw_decode_diagnostics(ODR o, xmlNodePtr pptr, else if (match_xsd_string(rptr, "details", o, &(*recs)[i].details)) ; - else if (match_xsd_string(rptr, "message", o, - &(*recs)[i].message)) - ; + else + match_xsd_string(rptr, "message", o, &(*recs)[i].message); } i++; } @@ -659,14 +679,13 @@ static int yaz_srw_term(ODR o, xmlNodePtr pptr, Z_SRW_scanTerm *term, if (match_xsd_string(ptr, "value", o, &term->value)) ; else if (match_xsd_integer(ptr, "numberOfRecords", o, - &term->numberOfRecords)) + &term->numberOfRecords)) ; else if (match_xsd_string(ptr, "displayTerm", o, &term->displayTerm)) ; - else if (match_xsd_string(ptr, "whereInList", o, - &term->whereInList)) - ; + else + match_xsd_string(ptr, "whereInList", o, &term->whereInList); } } else if (o->direction == ODR_ENCODE) @@ -763,13 +782,13 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &(*p)->srw_version)) ; else if (match_xsd_string(ptr, "query", o, - &req->query.cql)) + &req->query.cql)) req->query_type = Z_SRW_query_type_cql; else if (match_xsd_string(ptr, "pQuery", o, - &req->query.pqf)) + &req->query.pqf)) req->query_type = Z_SRW_query_type_pqf; else if (match_xsd_string(ptr, "xQuery", o, - &req->query.xcql)) + &req->query.xcql)) req->query_type = Z_SRW_query_type_xcql; else if (match_xsd_integer(ptr, "startRecord", o, &req->startRecord)) @@ -793,11 +812,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &req->sort.sortKeys)) req->sort_type = Z_SRW_sort_type_sort; else if (match_xsd_string(ptr, "stylesheet", o, - &req->stylesheet)) - ; - else if (match_xsd_string(ptr, "database", o, - &req->database)) + &req->stylesheet)) ; + else + match_xsd_string(ptr, "database", o, &req->database); } if (!req->query.cql && !req->query.pqf && !req->query.xcql) { @@ -823,6 +841,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, res->num_diagnostics = 0; res->nextRecordPosition = 0; res->facetList = 0; + res->suggestions = 0; for (; ptr; ptr = ptr->next) { @@ -834,7 +853,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &(*p)->extraResponseData_len)) ; else if (match_xsd_integer(ptr, "numberOfRecords", o, - &res->numberOfRecords)) + &res->numberOfRecords)) ; else if (match_xsd_string(ptr, "resultSetId", o, &res->resultSetId)) @@ -871,7 +890,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, for (; ptr; ptr = ptr->next) { if (match_xsd_string(ptr, "version", o, - &(*p)->srw_version)) + &(*p)->srw_version)) ; else if (match_xsd_XML_n(ptr, "extraResponseData", o, &(*p)->extraResponseData_buf, @@ -881,11 +900,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &req->stylesheet)) ; else if (match_xsd_string(ptr, "recordPacking", o, - &req->recordPacking)) - ; - else if (match_xsd_string(ptr, "database", o, - &req->database)) + &req->recordPacking)) ; + else + match_xsd_string(ptr, "database", o, &req->database); } } else if (!xmlStrcmp(method->name, BAD_CAST "explainResponse")) @@ -906,7 +924,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, for (; ptr; ptr = ptr->next) { if (match_xsd_string(ptr, "version", o, - &(*p)->srw_version)) + &(*p)->srw_version)) ; else if (match_xsd_XML_n(ptr, "extraResponseData", o, &(*p)->extraResponseData_buf, @@ -947,7 +965,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &(*p)->extraResponseData_len)) ; else if (match_xsd_string(ptr, "scanClause", o, - &req->scanClause.cql)) + &req->scanClause.cql)) ; else if (match_xsd_string(ptr, "pScanClause", o, &req->scanClause.pqf)) @@ -963,9 +981,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if (match_xsd_string(ptr, "stylesheet", o, &req->stylesheet)) ; - else if (match_xsd_string(ptr, "database", o, - &req->database)) - ; + else + match_xsd_string(ptr, "database", o, &req->database); } } else if (!xmlStrcmp(method->name, BAD_CAST "scanResponse")) @@ -1024,7 +1041,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if ((*p)->srw_version) add_xsd_string(ptr, "version", (*p)->srw_version); - switch(req->query_type) + switch (req->query_type) { case Z_SRW_query_type_cql: add_xsd_string(ptr, "query", req->query.cql); @@ -1042,7 +1059,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, add_xsd_string(ptr, "recordSchema", req->recordSchema); add_xsd_string(ptr, "recordXPath", req->recordXPath); add_xsd_integer(ptr, "resultSetTTL", req->resultSetTTL); - switch(req->sort_type) + switch (req->sort_type) { case Z_SRW_sort_type_none: break; @@ -1127,7 +1144,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, xmlSetNs(ptr, ns_srw); add_xsd_string(ptr, "version", (*p)->srw_version); - switch(req->query_type) + switch (req->query_type) { case Z_SRW_query_type_cql: add_xsd_string(ptr, "scanClause", req->scanClause.cql); @@ -1223,12 +1240,13 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; else if (match_xsd_string(ptr, "action", o, &oper)){ - if ( oper ){ - if ( !strcmp(oper, "info:srw/action/1/delete")) + if (oper) + { + if (!strcmp(oper, "info:srw/action/1/delete")) req->operation = "delete"; else if (!strcmp(oper,"info:srw/action/1/replace" )) req->operation = "replace"; - else if ( !strcmp( oper, "info:srw/action/1/create")) + else if (!strcmp(oper, "info:srw/action/1/create")) req->operation = "insert"; } } @@ -1246,11 +1264,10 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, client_data, ns_ucp_str); } else if (match_xsd_string(ptr, "stylesheet", o, - &req->stylesheet)) - ; - else if (match_xsd_string(ptr, "database", o, - &req->database)) + &req->stylesheet)) ; + else + match_xsd_string(ptr, "database", o, &req->database); } } else if (!xmlStrcmp(method->name, BAD_CAST "updateResponse")) @@ -1279,7 +1296,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &(*p)->srw_version)) ; else if (match_xsd_string(ptr, "operationStatus", o, - &res->operationStatus )) + &res->operationStatus )) ; else if (match_xsd_string(ptr, "recordIdentifier", o, &res->recordId)) @@ -1317,7 +1334,6 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, Z_SRW_PDU **p = handler_data; xmlNsPtr ns_ucp, ns_srw; - if ((*p)->which == Z_SRW_update_request) { Z_SRW_updateRequest *req = (*p)->u.update_request; @@ -1390,7 +1406,6 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, } else return -1; - } return 0; }