X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=9167ea85b3e1d0e56480eb0ed5081c809762282b;hp=cb002784c2a2bf48b97b9d8921f52fab20ed50df;hb=2b1f30bfd76fe82ff850f41508ae7a71b42e6be1;hpb=75ce92c9fc70d35dce5b2bca90fd79873e48c4c2 diff --git a/src/srwutil.c b/src/srwutil.c index cb00278..9167ea8 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -20,6 +20,34 @@ #define MAX_SRU_PARAMETERS 30 +static Z_SRW_extra_arg **append_extra_arg(ODR odr, Z_SRW_extra_arg **l, + const char *n, const char *v) +{ + if (n && v && *v != '\0') + { + while (*l) + l = &(*l)->next; + *l = (Z_SRW_extra_arg *) odr_malloc(odr, sizeof(**l)); + (*l)->name = odr_strdup(odr, n); + (*l)->value = odr_strdup(odr, v); + (*l)->next = 0; + l = &(*l)->next; + } + return l; +} + +static Z_SRW_extra_arg **append_extra_arg_int(ODR odr, Z_SRW_extra_arg **l, + const char *n, Odr_int *v) +{ + if (v) + { + char str[32]; + sprintf(str, ODR_INT_PRINTF, *v); + l = append_extra_arg(odr, l, n, str); + } + return l; +} + static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len) { return odr_strdupn(n, uri, len); @@ -39,33 +67,6 @@ char *yaz_encode_sru_dbpath_odr(ODR out, const char *db) return dst; } -Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) -{ - Z_AttributeList *attributes= (Z_AttributeList *) - odr_malloc(o, sizeof(*attributes)); - Z_AttributeElement ** elements; - attributes->num_attributes = 1; - elements = (Z_AttributeElement**) - odr_malloc(o, attributes->num_attributes * sizeof(*elements)); - elements[0] = (Z_AttributeElement*) odr_malloc(o,sizeof(**elements)); - elements[0]->attributeType = odr_intdup(o, 1); - elements[0]->attributeSet = odr_nullval(); - elements[0]->which = Z_AttributeValue_complex; - elements[0]->value.complex = (Z_ComplexAttribute *) - odr_malloc(o, sizeof(Z_ComplexAttribute)); - elements[0]->value.complex->num_list = 1; - elements[0]->value.complex->list = (Z_StringOrNumeric **) - odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *)); - elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) - odr_malloc(o, sizeof(Z_StringOrNumeric)); - elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string; - elements[0]->value.complex->list[0]->u.string = odr_strdup(o, name); - elements[0]->value.complex->semanticAction = 0; - elements[0]->value.complex->num_semanticAction = 0; - attributes->attributes = elements; - return attributes; -} - #if YAZ_HAVE_XML2 const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, @@ -415,7 +416,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, p1 = p0 + strlen(p0); if (p1 != p0) db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0); - if (!strcmp(hreq->method, "POST")) + if (!strcmp(hreq->method, "POST") && hreq->content_buf) p1 = hreq->content_buf; yaz_uri_to_array(p1, decode, &uri_name, &uri_val); #if YAZ_HAVE_XML2 @@ -480,13 +481,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, ; /* ignoring extraRequestData */ else if (n[0] == 'x' && n[1] == '-') { - Z_SRW_extra_arg **l = &extra_args; - while (*l) - l = &(*l)->next; - *l = (Z_SRW_extra_arg *) odr_malloc(decode, sizeof(**l)); - (*l)->name = odr_strdup(decode, n); - (*l)->value = odr_strdup(decode, v); - (*l)->next = 0; + append_extra_arg(decode, &extra_args, n, v); } else { @@ -502,6 +497,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, operation = "searchRetrieve"; else if (scanClause) operation = "scan"; + else + operation = "explain"; } version = yaz_negotiate_sru_version(version); @@ -759,12 +756,68 @@ Z_SRW_PDU *yaz_srw_get(ODR o, int which) return yaz_srw_get_pdu(o, which, "2.0"); } +/* http://docs.oasis-open.org/search-ws/searchRetrieve/v1.0/os/schemas/sruResponse.xsd */ +Z_SRW_PDU *yaz_srw_get_pdu_e(ODR o, int which, Z_SRW_PDU *req) +{ + int version2 = !req->srw_version || strcmp(req->srw_version, "2.") > 0; + Z_SRW_PDU *res = yaz_srw_get_pdu(o, which, req->srw_version); + Z_SRW_extra_arg **l = &res->extra_args, *ea; + l = append_extra_arg(o, l, "version", req->srw_version); + if (req->which == Z_SRW_searchRetrieve_request && + which == Z_SRW_searchRetrieve_response) + { + if (req->u.request->queryType && + strcmp(req->u.request->queryType, "cql")) + l = append_extra_arg(o, l, "queryType", req->u.request->queryType); + l = append_extra_arg(o, l, "query", req->u.request->query); + l = append_extra_arg_int(o, l, "startRecord", + req->u.request->startRecord); + l = append_extra_arg_int(o, l, "maximumRecords", + req->u.request->maximumRecords); + if (version2) + { + l = append_extra_arg(o, l, "recordXMLEscaping", + req->u.request->recordPacking); + l = append_extra_arg(o, l, "recordPacking", + req->u.request->packing); + } + else + l = append_extra_arg(o, l, "recordPacking", + req->u.request->recordPacking); + l = append_extra_arg(o, l, "recordSchema", + req->u.request->recordSchema); + if (req->u.request->sort_type == Z_SRW_sort_type_sort) + l = append_extra_arg(o, l, "sortKeys", + req->u.request->sort.sortKeys); + l = append_extra_arg(o, l, "stylesheet", req->u.request->stylesheet); + } + if (req->which == Z_SRW_explain_request && + which == Z_SRW_explain_response) + { + if (version2) + { + l = append_extra_arg(o, l, "recordXMLEscaping", + req->u.explain_request->recordPacking); + l = append_extra_arg(o, l, "recordPacking", + req->u.explain_request->packing); + } + else + l = append_extra_arg(o, l, "recordPacking", + req->u.explain_request->recordPacking); + l = append_extra_arg(o, l, "stylesheet", + req->u.explain_request->stylesheet); + } + for (ea = req->extra_args; ea; ea = ea->next) + l = append_extra_arg(o, l, ea->name, ea->value); + return res; +} + Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) { Z_SRW_PDU *sr = yaz_srw_get_core_ver(o, version); sr->which = which; - switch(which) + switch (which) { case Z_SRW_searchRetrieve_request: sr->u.request = (Z_SRW_searchRetrieveRequest *) @@ -1187,19 +1240,12 @@ void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args) Z_SRW_extra_arg **ea = &sr->extra_args; yaz_uri_to_array(extra_args, odr, &name, &val); - /** append rather than override */ - while (*ea) - ea = &(*ea)->next; while (*name) { - *ea = (Z_SRW_extra_arg *) odr_malloc(odr, sizeof(**ea)); - (*ea)->name = *name; - (*ea)->value = *val; - ea = &(*ea)->next; + ea = append_extra_arg(odr, ea, *name, *val); val++; name++; } - *ea = 0; } }