From fa059d055896a26b113e0e486531b71e7ec63c14 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 1 Jun 2011 15:34:16 +0200 Subject: [PATCH] virt_db: use query_encoding for search and scan --- src/filter_virt_db.cpp | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index 64ac19a..c9474c8 100644 --- a/src/filter_virt_db.cpp +++ b/src/filter_virt_db.cpp @@ -32,6 +32,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include #include @@ -60,13 +61,14 @@ namespace metaproxy_1 { std::list m_targets; std::string m_route; public: - std::string m_query_encoding; + std::string query_encoding; }; struct VirtualDB::Backend { mp::Session m_backend_session; std::list m_frontend_databases; std::list m_targets; std::string m_route; + std::string query_encoding; bool m_named_result_sets; int m_number_of_sets; }; @@ -181,12 +183,20 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::create_backend_from_databases // see if we have a route conflict. if (!first_route && b->m_route != map_it->m_route) { - // we have a conflict.. + // we have a conflict.. routing must be same for all error_code = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP; BackendPtr ptr; return ptr; } b->m_route = map_it->m_route; + if (!first_route && b->query_encoding != map_it->query_encoding) + { + // we have a conflict. query encoding must be same for all + error_code = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP; + BackendPtr ptr; + return ptr; + } + b->query_encoding = map_it->query_encoding; first_route = false; } return b; @@ -354,6 +364,20 @@ void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req) &req->databaseNames); } + if (b->query_encoding.length() && + (req->query->which == Z_Query_type_1 || + req->query->which == Z_Query_type_101)) + { + yaz_iconv_t cd = yaz_iconv_open(b->query_encoding.c_str(), "UTF-8"); + if (cd) + { + int r = yaz_query_charset_convert_rpnquery_check( + req->query->u.type_1, odr, cd); + yaz_iconv_close(cd); + if (r) + yaz_log(YLOG_LOG, "query could not be converted"); + } + } *req->replaceIndicator = 1; search_package.request() = yazpp_1::GDU(apdu_req); @@ -500,7 +524,7 @@ void yf::VirtualDB::Rep::refresh_torus(void) VirtualDB::Map vmap( mp::util::database_name_normalize(database), target, route); - vmap.m_query_encoding = query_encoding; + vmap.query_encoding = query_encoding; m_maps.push_back(vmap); } } @@ -757,6 +781,17 @@ void yf::VirtualDB::Frontend::scan(mp::Package &package, Z_APDU *apdu_req) &req->num_databaseNames, &req->databaseNames); } + + if (b->query_encoding.length()) + { + yaz_iconv_t cd = yaz_iconv_open(b->query_encoding.c_str(), "UTF-8"); + if (cd) + { + yaz_query_charset_convert_apt(req->termListAndStartPoint, odr, cd); + yaz_iconv_close(cd); + } + } + scan_package.request() = yazpp_1::GDU(apdu_req); scan_package.move(b->m_route); @@ -938,7 +973,7 @@ void mp::filter::VirtualDB::configure(const xmlNode * ptr, bool test_only) VirtualDB::Map vmap(mp::util::database_name_normalize(database), targets, route); - vmap.m_query_encoding = query_encoding; + vmap.query_encoding = query_encoding; m_p->m_maps.push_back(vmap); } else if (!strcmp((const char *) ptr->name, "torus")) -- 1.7.10.4