X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Futil.cpp;h=ea6c9310e23b886ac1cd43689326b1f26ac3d101;hb=908c8147d8bcef7ed9c84e0c6720a56dd22e6e86;hp=6482063ce92fdb6d483cb389ddf804a25fbde359;hpb=d0123337d70b0fb97b578cc57467bb94980f1014;p=metaproxy-moved-to-github.git diff --git a/src/util.cpp b/src/util.cpp index 6482063..ea6c931 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2009 Index Data + Copyright (C) 2005-2012 Index Data Metaproxy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -17,13 +17,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.hpp" -#include "util.hpp" +#include #include #include #include #include #include +#include #include @@ -161,11 +162,53 @@ std::string mp_util::database_name_normalize(const std::string &s) } +void mp_util::piggyback_sr(Z_SearchRequest *sreq, + Odr_int result_set_size, + Odr_int &number_to_present, + const char **element_set_name) +{ + Z_ElementSetNames *esn; + const char *smallSetElementSetNames = 0; + const char *mediumSetElementSetNames = 0; + + esn = sreq->smallSetElementSetNames; + if (esn && esn->which == Z_ElementSetNames_generic) + smallSetElementSetNames = esn->u.generic; + + esn = sreq->mediumSetElementSetNames; + if (esn && esn->which == Z_ElementSetNames_generic) + mediumSetElementSetNames = esn->u.generic; + + piggyback(*sreq->smallSetUpperBound, + *sreq->largeSetLowerBound, + *sreq->mediumSetPresentNumber, + smallSetElementSetNames, + mediumSetElementSetNames, + result_set_size, + number_to_present, + element_set_name); +} + void mp_util::piggyback(int smallSetUpperBound, - int largeSetLowerBound, - int mediumSetPresentNumber, - int result_set_size, - int &number_to_present) + int largeSetLowerBound, + int mediumSetPresentNumber, + int result_set_size, + int &number_to_present) +{ + Odr_int tmp = number_to_present; + piggyback(smallSetUpperBound, largeSetLowerBound, mediumSetPresentNumber, + 0, 0, result_set_size, tmp, 0); + number_to_present = tmp; +} + +void mp_util::piggyback(Odr_int smallSetUpperBound, + Odr_int largeSetLowerBound, + Odr_int mediumSetPresentNumber, + const char *smallSetElementSetNames, + const char *mediumSetElementSetNames, + Odr_int result_set_size, + Odr_int &number_to_present, + const char **element_set_name) { // deal with piggyback @@ -173,11 +216,16 @@ void mp_util::piggyback(int smallSetUpperBound, { // small set . Return all records in set number_to_present = result_set_size; + if (element_set_name && smallSetElementSetNames) + *element_set_name = smallSetElementSetNames; + } else if (result_set_size > largeSetLowerBound) { // large set . Return no records number_to_present = 0; + if (element_set_name) + *element_set_name = 0; } else { @@ -185,10 +233,11 @@ void mp_util::piggyback(int smallSetUpperBound, number_to_present = mediumSetPresentNumber; if (number_to_present > result_set_size) number_to_present = result_set_size; + if (element_set_name && mediumSetElementSetNames) + *element_set_name = mediumSetElementSetNames; } } - bool mp_util::pqf(ODR odr, Z_APDU *apdu, const std::string &q) { YAZ_PQF_Parser pqf_parser = yaz_pqf_create(); @@ -478,6 +527,13 @@ Z_APDU *mp::odr::create_initResponse(const Z_APDU *in_apdu, zget_init_diagnostics(m_odr, error, addinfo); *apdu->u.initResponse->result = 0; } + apdu->u.initResponse->implementationName = + odr_prepend(m_odr, "Metaproxy", + apdu->u.initResponse->implementationName); + apdu->u.initResponse->implementationVersion = + odr_prepend(m_odr, + VERSION, apdu->u.initResponse->implementationVersion); + return apdu; } @@ -629,6 +685,25 @@ Z_ReferenceId **mp_util::get_referenceId(const Z_APDU *apdu) return 0; } +std::string mp_util::uri_encode(std::string s) +{ + char *x = (char *) xmalloc(1 + s.length() * 3); + yaz_encode_uri_component(x, s.c_str()); + std::string result(x); + xfree(x); + return result; +} + + +std::string mp_util::uri_decode(std::string s) +{ + char *x = (char *) xmalloc(1 + s.length()); + yaz_decode_uri_component(x, s.c_str(), s.length()); + std::string result(x); + xfree(x); + return result; +} + /* * Local variables: