X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Futil.cpp;h=f792e02ddc12ae18a85d5382f3115118656408f3;hb=dee29d77163776942488b38eb7691df51bb30bbc;hp=f0ea1d6da360b57a645bda9c05904e4e1c9b0de9;hpb=219ffa015c0e35b03fae0788b0e8e6abcfde1a81;p=metaproxy-moved-to-github.git diff --git a/src/util.cpp b/src/util.cpp index f0ea1d6..f792e02 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1,17 +1,30 @@ -/* $Id: util.cpp,v 1.27 2007-04-13 09:57:51 adam Exp $ - Copyright (c) 2005-2007, Index Data. +/* This file is part of Metaproxy. + Copyright (C) 2005-2011 Index Data - See the LICENSE file for details - */ +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 +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +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 @@ -149,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 @@ -161,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 { @@ -173,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(); @@ -292,15 +353,12 @@ int mp_util::get_or_remove_vhost_otherinfo( std::list &vhosts) { int cat; - const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), - CLASS_USERINFO, - OID_STR_PROXY); for (cat = 1; ; cat++) { // check virtual host const char *vhost = yaz_oi_get_string_oid(otherInformation, - oid_proxy, + yaz_oid_userinfo_proxy, cat /* categoryValue */, remove_flag /* delete flag */); if (!vhost) @@ -332,14 +390,10 @@ void mp_util::set_vhost_otherinfo( int cat; std::list::const_iterator it = vhosts.begin(); - const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), - CLASS_USERINFO, - OID_STR_PROXY); - for (cat = 1; it != vhosts.end() ; cat++, it++) { yaz_oi_set_string_oid(otherInformation, odr, - oid_proxy, cat, it->c_str()); + yaz_oid_userinfo_proxy, cat, it->c_str()); } } @@ -347,12 +401,8 @@ void mp_util::set_vhost_otherinfo( Z_OtherInformation **otherInformation, ODR odr, const std::string vhost, const int cat) { - const int *oid_proxy = yaz_string_to_oid(yaz_oid_std(), - CLASS_USERINFO, - OID_STR_PROXY); - yaz_oi_set_string_oid(otherInformation, odr, - oid_proxy, cat, vhost.c_str()); + yaz_oid_userinfo_proxy, cat, vhost.c_str()); } void mp_util::split_zurl(std::string zurl, std::string &host, @@ -477,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; } @@ -628,12 +685,21 @@ 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); + return result; +} + /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil - * c-file-style: "stroustrup" * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +