From: Adam Dickmeiss Date: Tue, 1 May 2012 10:22:06 +0000 (+0200) Subject: Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/metaproxy X-Git-Tag: v1.3.35~7 X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=commitdiff_plain;h=d28c341cafe348192c6a5615f5b92486f5223111;hp=8be1f8ebc6a5578daeec06543feda12d5fb374d6;p=metaproxy-moved-to-github.git Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/metaproxy --- diff --git a/etc/config3.xml b/etc/config3.xml index 3ae07fd..1f73053 100644 --- a/etc/config3.xml +++ b/etc/config3.xml @@ -28,12 +28,16 @@ bagel.indexdata.dk:80 + cf + connect.indexdata.com + + gils - indexdata.dk/gils + z3950.indexdata.dk/gils marc - indexdata.dk/marc + z3950.indexdata.dk/marc1 loc diff --git a/src/filter_multi.cpp b/src/filter_multi.cpp index e4bea12..ccdcc4a 100644 --- a/src/filter_multi.cpp +++ b/src/filter_multi.cpp @@ -514,7 +514,12 @@ void yf::Multi::Frontend::init(mp::Package &package, Z_GDU *gdu) maximumRecordSize = *b_resp->maximumRecordSize; } else + { + if (!f_resp->userInformationField + && b_resp->userInformationField) + f_resp->userInformationField = b_resp->userInformationField; no_failed++; + } } else no_failed++; diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index b583757..f2420bf 100644 --- a/src/filter_virt_db.cpp +++ b/src/filter_virt_db.cpp @@ -233,7 +233,7 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend( Z_GDU *gdu = init_package.response().get(); // we hope to get an init response - error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; + error_code = 0; if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which == Z_APDU_initResponse) { @@ -249,6 +249,13 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend( } mp::util::get_init_diagnostics(res, error_code, addinfo); } + if (error_code == 0) + { + std::list::const_iterator db_it = databases.begin(); + error_code = YAZ_BIB1_ACCESS_TO_SPECIFIED_DATABASE_DENIED; + if (db_it != databases.end()) + addinfo = *db_it; + } if (!init_package.session().is_closed()) { Package close_package(b->m_backend_session, package.origin()); diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index fe3049e..60b9390 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -56,6 +56,7 @@ namespace metaproxy_1 { void timeoutNotify(); void recv_GDU(Z_GDU *gdu, int len); void fixup_nsd(ODR odr, Z_Records *records); + void fixup_init(ODR odr, Z_InitResponse *initrs); yazpp_1::IPDU_Observer* sessionNotify( yazpp_1::IPDU_Observable *the_PDU_Observable, int fd); @@ -178,10 +179,10 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records) // should really check for nsd->which.. But union has two members // containing almost same data - // char *v2Addinfo; + const char *v2Addinfo = nsd->u.v2Addinfo; // Z_InternationalString *v3Addinfo; - if (nsd->u.v2Addinfo) + if (v2Addinfo && *v2Addinfo) { addinfo.assign(nsd->u.v2Addinfo); addinfo += " "; @@ -191,6 +192,53 @@ void yf::Z3950Client::Assoc::fixup_nsd(ODR odr, Z_Records *records) } } +void yf::Z3950Client::Assoc::fixup_init(ODR odr, Z_InitResponse *initrs) +{ + Z_External *uif = initrs->userInformationField; + + if (uif && uif->which == Z_External_userInfo1) + { + Z_OtherInformation *ui = uif->u.userInfo1; + int i; + for (i = 0; i < ui->num_elements; i++) + { + Z_OtherInformationUnit *unit = ui->list[i]; + if (unit->which == Z_OtherInfo_externallyDefinedInfo && + unit->information.externallyDefinedInfo && + unit->information.externallyDefinedInfo->which == + Z_External_diag1) + { + Z_DiagnosticFormat *diag = + unit->information.externallyDefinedInfo->u.diag1; + int j; + for (j = 0; j < diag->num; j++) + { + Z_DiagnosticFormat_s *ds = diag->elements[j]; + if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec) + { + Z_DefaultDiagFormat *r = ds->u.defaultDiagRec; + char *oaddinfo = r->u.v2Addinfo; + char *naddinfo = (char *) odr_malloc( + odr, + (oaddinfo ? strlen(oaddinfo) : 0) + 20 + + m_host.length()); + if (oaddinfo && *oaddinfo) + { + strcpy(naddinfo, oaddinfo); + strcat(naddinfo, " "); + } + strcat(naddinfo, "(backend="); + strcat(naddinfo, m_host.c_str()); + strcat(naddinfo, ")"); + + r->u.v2Addinfo = naddinfo; + } + } + } + } + } +} + void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len) { m_waiting = false; @@ -209,6 +257,9 @@ void yf::Z3950Client::Assoc::recv_GDU(Z_GDU *gdu, int len) case Z_APDU_presentResponse: fixup_nsd(odr, apdu->u.presentResponse->records); break; + case Z_APDU_initResponse: + fixup_init(odr, apdu->u.initResponse); + break; } } m_package->response() = gdu;