X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_multi.cpp;h=9349be24bab91c4ae16dbeb2bf70afaaa9270b3a;hb=4e2380df63a35768405dc9e72e1cce202eef004d;hp=263160d91a110eb2c00bcb39151b45de3e25eff9;hpb=b7c568b24942cf033093da7be2849c9de6a2ae35;p=metaproxy-moved-to-github.git diff --git a/src/filter_multi.cpp b/src/filter_multi.cpp index 263160d..9349be2 100644 --- a/src/filter_multi.cpp +++ b/src/filter_multi.cpp @@ -105,6 +105,7 @@ namespace metaproxy_1 { void present(Package &package, Z_APDU *apdu); void scan1(Package &package, Z_APDU *apdu); void scan2(Package &package, Z_APDU *apdu); + void relay_apdu(Package &package, Z_APDU *apdu); Rep *m_p; }; class Multi::Map { @@ -532,9 +533,9 @@ void yf::Multi::Frontend::search(mp::Package &package, Z_APDU *apdu_req) Z_SearchRequest *req = apdu_req->u.searchRequest; // save these for later - int smallSetUpperBound = *req->smallSetUpperBound; - int largeSetLowerBound = *req->largeSetLowerBound; - int mediumSetPresentNumber = *req->mediumSetPresentNumber; + Odr_int smallSetUpperBound = *req->smallSetUpperBound; + Odr_int largeSetLowerBound = *req->largeSetLowerBound; + Odr_int mediumSetPresentNumber = *req->mediumSetPresentNumber; // they are altered now - to disable piggyback *req->smallSetUpperBound = 0; @@ -565,7 +566,7 @@ void yf::Multi::Frontend::search(mp::Package &package, Z_APDU *apdu_req) // look at each response FrontendSet resultSet(std::string(req->resultSetName)); - int result_set_size = 0; + Odr_int result_set_size = 0; Z_Records *z_records_diag = 0; // no diagnostics (yet) for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++) { @@ -618,12 +619,13 @@ void yf::Multi::Frontend::search(mp::Package &package, Z_APDU *apdu_req) // assume OK m_sets[resultSet.m_setname] = resultSet; - int number; + Odr_int number; mp::util::piggyback(smallSetUpperBound, - largeSetLowerBound, - mediumSetPresentNumber, - result_set_size, - number); + largeSetLowerBound, + mediumSetPresentNumber, + 0, 0, + result_set_size, + number, 0); Package pp(package.session(), package.origin()); if (number > 0) { @@ -924,6 +926,30 @@ Z_Entry *yf::Multi::ScanTermInfo::get_entry(ODR odr) return e; } +void yf::Multi::Frontend::relay_apdu(mp::Package &package, Z_APDU *apdu_req) +{ + std::list::const_iterator bit; + for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++) + { + PackagePtr p = (*bit)->m_package; + mp::odr odr; + + p->request() = apdu_req; + p->copy_filter(package); + } + multi_move(m_backend_list); + for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++) + { + PackagePtr p = (*bit)->m_package; + + if (p->session().is_closed()) // if any backend closes, close frontend + package.session().close(); + + package.response() = p->response(); + } +} + + void yf::Multi::Frontend::scan2(mp::Package &package, Z_APDU *apdu_req) { Z_ScanRequest *req = apdu_req->u.scanRequest; @@ -1191,6 +1217,10 @@ void yf::Multi::process(mp::Package &package) const { f->scan2(package, apdu); } + else if (apdu->which == Z_APDU_close) + { + f->relay_apdu(package, apdu); + } else { mp::odr odr;