X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_virt_db.cpp;h=1fae37a819347dddf5d5bd72b41ea0f880bbacc1;hb=1713d9eecee6685e3a81e354b1c43fdd127f252f;hp=ad60d25caecb452e4fdb0fbd8d8c1ce1a3b0d2e0;hpb=a1ef872694c141f21afdbb3e0798b60fc1421429;p=metaproxy-moved-to-github.git diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index ad60d25..1fae37a 100644 --- a/src/filter_virt_db.cpp +++ b/src/filter_virt_db.cpp @@ -1,4 +1,4 @@ -/* $Id: filter_virt_db.cpp,v 1.30 2006-01-17 13:54:54 adam Exp $ +/* $Id: filter_virt_db.cpp,v 1.32 2006-01-18 10:30:28 adam Exp $ Copyright (c) 2005, Index Data. %LICENSE% @@ -56,6 +56,7 @@ namespace yp2 { yp2::Session m_session; bool m_is_virtual; bool m_in_use; + yazpp_1::GDU m_init_gdu; std::list m_backend_list; std::map m_sets; @@ -183,6 +184,15 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::init_backend( Z_InitRequest *req = init_apdu->u.initRequest; + // copy stuff from Frontend Init Request + Z_GDU *org_gdu = m_init_gdu.get(); + Z_InitRequest *org_init = org_gdu->u.z3950->u.initRequest; + + req->idAuthentication = org_init->idAuthentication; + req->implementationId = org_init->implementationId; + req->implementationName = org_init->implementationName; + req->implementationVersion = org_init->implementationVersion; + ODR_MASK_SET(req->options, Z_Options_search); ODR_MASK_SET(req->options, Z_Options_present); ODR_MASK_SET(req->options, Z_Options_namedResultSets); @@ -195,24 +205,24 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::init_backend( init_package.request() = init_apdu; init_package.move(b->m_route); // sending init - - if (init_package.session().is_closed()) - { - error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; - // addinfo = database; - BackendPtr null; - return null; - } + Z_GDU *gdu = init_package.response().get(); // we hope to get an init response if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which == Z_APDU_initResponse) { - if (ODR_MASK_GET(gdu->u.z3950->u.initResponse->options, - Z_Options_namedResultSets)) + Z_InitResponse *res = gdu->u.z3950->u.initResponse; + if (ODR_MASK_GET(res->options, Z_Options_namedResultSets)) { b->m_named_result_sets = true; } + std::cout << "GOT INIT res=" << *res->result << "\n"; + if (!*res->result) + { + yp2::util::get_init_diagnostics(res, error_code, addinfo); + BackendPtr null; + return null; + } } else { @@ -221,6 +231,14 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::init_backend( BackendPtr null; return null; } + if (init_package.session().is_closed()) + { + error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; + // addinfo = database; + BackendPtr null; + return null; + } + m_backend_list.push_back(b); return b; } @@ -592,6 +610,8 @@ void yf::Virt_db::process(Package &package) const yaz_oi_get_string_oidval(&req->otherInfo, VAL_PROXY, 1, 0); if (!vhost) { + f->m_init_gdu = gdu; + yp2::odr odr; Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0); Z_InitResponse *resp = apdu->u.initResponse;