X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=75512ca433e37ef471544e1acce78052bdecfe39;hp=baac6a7d6135868b0ebe10a97514a54327814a35;hb=0f073baf2183a54f2a5691e697fde68c9a5f50c5;hpb=42bf8d7d53e41f6165e0eb889a7377d3482aeabd diff --git a/src/srwutil.c b/src/srwutil.c index baac6a7..75512ca 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -1,16 +1,40 @@ /* 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. */ /** * \file srwutil.c * \brief Implements SRW/SRU utilities. */ +#if HAVE_CONFIG_H +#include +#endif #include +#include #include #include #include +#include "sru-p.h" + +static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len) +{ + return odr_strdupn(n, uri, len); +} + +void yaz_encode_sru_dbpath_buf(char *dst, const char *db) +{ + assert(db); + *dst = '/'; + strcpy(dst+1, db); +} + +char *yaz_encode_sru_dbpath_odr(ODR out, const char *db) +{ + char *dst = odr_malloc(out, 3 * strlen(db) + 2); + yaz_encode_sru_dbpath_buf(dst, db); + return dst; +} #if YAZ_HAVE_XML2 static int yaz_base64decode(const char *in, char *out) @@ -258,12 +282,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, if (!p1) p1 = p0 + strlen(p0); if (p1 != p0) - { - db = (char*) odr_malloc(decode, p1 - p0 + 1); - memcpy (db, p0, p1 - p0); - db[p1 - p0] = '\0'; - } - + db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0); grab_charset(decode, content_type, charset); ret = z_soap_codec(decode, soap_package, @@ -324,7 +343,7 @@ static int yaz_sru_decode_integer(ODR odr, const char *pname, #endif /** - http://www.loc.gov/z3950/agency/zing/srw/service.html + http://www.loc.gov/z3950/agency/zing/srw/service.html */ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SOAP **soap_package, ODR decode, char **charset, @@ -337,7 +356,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, }; #endif const char *content_type = z_HTTP_header_lookup(hreq->headers, - "Content-Type"); + "Content-Type"); /* SRU GET: ignore content type. @@ -346,9 +365,9 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, */ if (!strcmp(hreq->method, "GET") || - (!strcmp(hreq->method, "POST") && content_type && - !yaz_strcmp_del("application/x-www-form-urlencoded", - content_type, "; "))) + (!strcmp(hreq->method, "POST") && content_type && + !yaz_strcmp_del("application/x-www-form-urlencoded", + content_type, "; "))) { char *db = "Default"; const char *p0 = hreq->path, *p1; @@ -386,11 +405,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, if (!p1) p1 = p0 + strlen(p0); if (p1 != p0) - { - db = (char*) odr_malloc(decode, p1 - p0 + 1); - memcpy (db, p0, p1 - p0); - db[p1 - p0] = '\0'; - } + db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0); if (!strcmp(hreq->method, "POST")) p1 = hreq->content_buf; yaz_uri_to_array(p1, decode, &uri_name, &uri_val); @@ -735,6 +750,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.request->database = 0; sr->u.request->resultSetTTL = 0; sr->u.request->stylesheet = 0; + sr->u.request->facetList = 0; break; case Z_SRW_searchRetrieve_response: sr->u.response = (Z_SRW_searchRetrieveResponse *) @@ -748,6 +764,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.response->num_diagnostics = 0; sr->u.response->nextRecordPosition = 0; sr->u.response->extra_records = 0; + sr->u.response->facetList = 0; break; case Z_SRW_explain_request: sr->u.explain_request = (Z_SRW_explainRequest *) @@ -1034,8 +1051,8 @@ int yaz_diag_srw_to_bib1(int code) return 1; } -static void add_val_int(ODR o, char **name, char **value, int *i, - char *a_name, Odr_int *val) +void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, + char *a_name, Odr_int *val) { if (val) { @@ -1046,8 +1063,8 @@ static void add_val_int(ODR o, char **name, char **value, int *i, } } -static void add_val_str(ODR o, char **name, char **value, int *i, - char *a_name, char *val) +void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, + char *a_name, char *val) { if (val) { @@ -1061,7 +1078,7 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, char **name, char **value, int max_names) { int i = 0; - add_val_str(encode, name, value, &i, "version", srw_pdu->srw_version); + yaz_add_name_value_str(encode, name, value, &i, "version", srw_pdu->srw_version); name[i] = "operation"; switch(srw_pdu->which) { @@ -1070,16 +1087,16 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, switch(srw_pdu->u.request->query_type) { case Z_SRW_query_type_cql: - add_val_str(encode, name, value, &i, "query", - srw_pdu->u.request->query.cql); + yaz_add_name_value_str(encode, name, value, &i, "query", + srw_pdu->u.request->query.cql); break; case Z_SRW_query_type_pqf: - add_val_str(encode, name, value, &i, "x-pquery", - srw_pdu->u.request->query.pqf); + yaz_add_name_value_str(encode, name, value, &i, "x-pquery", + srw_pdu->u.request->query.pqf); break; case Z_SRW_query_type_xcql: - add_val_str(encode, name, value, &i, "x-cql", - srw_pdu->u.request->query.xcql); + yaz_add_name_value_str(encode, name, value, &i, "x-cql", + srw_pdu->u.request->query.xcql); break; } switch(srw_pdu->u.request->sort_type) @@ -1087,29 +1104,29 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, case Z_SRW_sort_type_none: break; case Z_SRW_sort_type_sort: - add_val_str(encode, name, value, &i, "sortKeys", - srw_pdu->u.request->sort.sortKeys); + yaz_add_name_value_str(encode, name, value, &i, "sortKeys", + srw_pdu->u.request->sort.sortKeys); break; } - add_val_int(encode, name, value, &i, "startRecord", - srw_pdu->u.request->startRecord); - add_val_int(encode, name, value, &i, "maximumRecords", - srw_pdu->u.request->maximumRecords); - add_val_str(encode, name, value, &i, "recordSchema", - srw_pdu->u.request->recordSchema); - add_val_str(encode, name, value, &i, "recordPacking", - srw_pdu->u.request->recordPacking); - add_val_str(encode, name, value, &i, "recordXPath", - srw_pdu->u.request->recordXPath); - add_val_str(encode, name, value, &i, "stylesheet", - srw_pdu->u.request->stylesheet); - add_val_int(encode, name, value, &i, "resultSetTTL", - srw_pdu->u.request->resultSetTTL); + yaz_add_name_value_int(encode, name, value, &i, "startRecord", + srw_pdu->u.request->startRecord); + yaz_add_name_value_int(encode, name, value, &i, "maximumRecords", + srw_pdu->u.request->maximumRecords); + yaz_add_name_value_str(encode, name, value, &i, "recordSchema", + srw_pdu->u.request->recordSchema); + yaz_add_name_value_str(encode, name, value, &i, "recordPacking", + srw_pdu->u.request->recordPacking); + yaz_add_name_value_str(encode, name, value, &i, "recordXPath", + srw_pdu->u.request->recordXPath); + yaz_add_name_value_str(encode, name, value, &i, "stylesheet", + srw_pdu->u.request->stylesheet); + yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL", + srw_pdu->u.request->resultSetTTL); break; case Z_SRW_explain_request: value[i++] = "explain"; - add_val_str(encode, name, value, &i, "stylesheet", - srw_pdu->u.explain_request->stylesheet); + yaz_add_name_value_str(encode, name, value, &i, "stylesheet", + srw_pdu->u.explain_request->stylesheet); break; case Z_SRW_scan_request: value[i++] = "scan"; @@ -1117,24 +1134,24 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, switch(srw_pdu->u.scan_request->query_type) { case Z_SRW_query_type_cql: - add_val_str(encode, name, value, &i, "scanClause", - srw_pdu->u.scan_request->scanClause.cql); + yaz_add_name_value_str(encode, name, value, &i, "scanClause", + srw_pdu->u.scan_request->scanClause.cql); break; case Z_SRW_query_type_pqf: - add_val_str(encode, name, value, &i, "x-pScanClause", - srw_pdu->u.scan_request->scanClause.pqf); + yaz_add_name_value_str(encode, name, value, &i, "x-pScanClause", + srw_pdu->u.scan_request->scanClause.pqf); break; case Z_SRW_query_type_xcql: - add_val_str(encode, name, value, &i, "x-cqlScanClause", - srw_pdu->u.scan_request->scanClause.xcql); + yaz_add_name_value_str(encode, name, value, &i, "x-cqlScanClause", + srw_pdu->u.scan_request->scanClause.xcql); break; } - add_val_int(encode, name, value, &i, "responsePosition", - srw_pdu->u.scan_request->responsePosition); - add_val_int(encode, name, value, &i, "maximumTerms", - srw_pdu->u.scan_request->maximumTerms); - add_val_str(encode, name, value, &i, "stylesheet", - srw_pdu->u.scan_request->stylesheet); + yaz_add_name_value_int(encode, name, value, &i, "responsePosition", + srw_pdu->u.scan_request->responsePosition); + yaz_add_name_value_int(encode, name, value, &i, "maximumTerms", + srw_pdu->u.scan_request->maximumTerms); + yaz_add_name_value_str(encode, name, value, &i, "stylesheet", + srw_pdu->u.scan_request->stylesheet); break; case Z_SRW_update_request: value[i++] = "update"; @@ -1305,7 +1322,6 @@ void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args) } - /* * Local variables: * c-basic-offset: 4