X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrw.c;h=44e8c176998400e5212417fac624d1a2a0c31634;hp=c962922b9fb178589c39bab7db4695362e5e5b3b;hb=f15418ee295542935d616a2163377b71e40ce04f;hpb=379504a233e3e2cc85bca1e7b6d864f1395aec7c diff --git a/src/srw.c b/src/srw.c index c962922..44e8c17 100644 --- a/src/srw.c +++ b/src/srw.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2009 Index Data + * Copyright (C) 1995-2010 Index Data * See the file LICENSE for details. */ /** @@ -60,12 +60,13 @@ xmlNodePtr add_xsd_string(xmlNodePtr ptr, const char *elem, const char *val) return add_xsd_string_ns(ptr, elem, val, 0); } -static void add_xsd_integer(xmlNodePtr ptr, const char *elem, const int *val) +static void add_xsd_integer(xmlNodePtr ptr, const char *elem, + const Odr_int *val) { if (val) { - char str[30]; - sprintf(str, "%d", *val); + char str[40]; + sprintf(str, ODR_INT_PRINTF, *val); xmlNewTextChild(ptr, 0, BAD_CAST elem, BAD_CAST str); } } @@ -164,7 +165,8 @@ static int match_xsd_XML_n(xmlNodePtr ptr, const char *elem, ODR o, return 1; } -static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val) +static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, + Odr_int **val) { #if CHECK_TYPE struct _xmlAttr *attr; @@ -190,7 +192,7 @@ static int match_xsd_integer(xmlNodePtr ptr, const char *elem, ODR o, int **val) ptr = ptr->children; if (!ptr || ptr->type != XML_TEXT_NODE) return 0; - *val = odr_intdup(o, atoi((const char *) ptr->content)); + *val = odr_intdup(o, odr_atoi((const char *) ptr->content)); return 1; } @@ -738,6 +740,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (match_xsd_string(ptr, "version", o, &(*p)->srw_version)) ; + else if (match_xsd_XML_n(ptr, "extraResponseData", o, + &(*p)->extraResponseData_buf, + &(*p)->extraResponseData_len)) + ; else if (match_xsd_integer(ptr, "numberOfRecords", o, &res->numberOfRecords)) ; @@ -776,6 +782,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (match_xsd_string(ptr, "version", o, &(*p)->srw_version)) ; + else if (match_xsd_XML_n(ptr, "extraResponseData", o, + &(*p)->extraResponseData_buf, + &(*p)->extraResponseData_len)) + ; else if (match_xsd_string(ptr, "stylesheet", o, &req->stylesheet)) ; @@ -807,6 +817,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (match_xsd_string(ptr, "version", o, &(*p)->srw_version)) ; + else if (match_xsd_XML_n(ptr, "extraResponseData", o, + &(*p)->extraResponseData_buf, + &(*p)->extraResponseData_len)) + ; else if (match_element(ptr, "record")) yaz_srw_record(o, ptr, &res->record, &res->extra_record, client_data, ns); @@ -837,6 +851,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (match_xsd_string(ptr, "version", o, &(*p)->srw_version)) ; + else if (match_xsd_XML_n(ptr, "extraResponseData", o, + &(*p)->extraResponseData_buf, + &(*p)->extraResponseData_len)) + ; else if (match_xsd_string(ptr, "scanClause", o, &req->scanClause.cql)) ; @@ -877,6 +895,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (match_xsd_string(ptr, "version", o, &(*p)->srw_version)) ; + else if (match_xsd_XML_n(ptr, "extraResponseData", o, + &(*p)->extraResponseData_buf, + &(*p)->extraResponseData_len)) + ; else if (match_element(ptr, "terms")) yaz_srw_terms(o, ptr, &res->terms, &res->num_terms, client_data, @@ -900,12 +922,12 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { Z_SRW_PDU **p = handler_data; xmlNsPtr ns_srw; + xmlNodePtr ptr = 0; if ((*p)->which == Z_SRW_searchRetrieve_request) { Z_SRW_searchRetrieveRequest *req = (*p)->u.request; - xmlNodePtr ptr = xmlNewChild(pptr, 0, - BAD_CAST "searchRetrieveRequest", 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "searchRetrieveRequest", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -946,8 +968,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_searchRetrieve_response) { Z_SRW_searchRetrieveResponse *res = (*p)->u.response; - xmlNodePtr ptr = xmlNewChild(pptr, 0, - BAD_CAST "searchRetrieveResponse", 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "searchRetrieveResponse", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -976,8 +997,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_explain_request) { Z_SRW_explainRequest *req = (*p)->u.explain_request; - xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "explainRequest", - 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "explainRequest", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -989,8 +1009,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_explain_response) { Z_SRW_explainResponse *res = (*p)->u.explain_response; - xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "explainResponse", - 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "explainResponse", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -1012,7 +1031,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_scan_request) { Z_SRW_scanRequest *req = (*p)->u.scan_request; - xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "scanRequest", 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "scanRequest", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -1034,7 +1053,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if ((*p)->which == Z_SRW_scan_response) { Z_SRW_scanResponse *res = (*p)->u.scan_response; - xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "scanResponse", 0); + ptr = xmlNewChild(pptr, 0, BAD_CAST "scanResponse", 0); ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zs"); xmlSetNs(ptr, ns_srw); @@ -1056,6 +1075,11 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, } else return -1; + if (ptr && (*p)->extraResponseData_len) + add_XML_n(ptr, "extraResponseData", + (*p)->extraResponseData_buf, + (*p)->extraResponseData_len, ns_srw); + } return 0;