X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_multi.cpp;h=82e2f8ea0c7e97c04eb8ec2a6883654a7a07afd4;hb=e9530d6289df9b848e4901d7c73f5a2f27706d66;hp=f02ecc76ce8f5021ebe4383c6457541fd2322f95;hpb=9b8466644a970341459fd3fe3b270defd337ed48;p=metaproxy-moved-to-github.git diff --git a/src/filter_multi.cpp b/src/filter_multi.cpp index f02ecc7..82e2f8e 100644 --- a/src/filter_multi.cpp +++ b/src/filter_multi.cpp @@ -1,7 +1,5 @@ -/* $Id: filter_multi.cpp,v 1.28 2007-11-18 10:44:40 adam Exp $ - Copyright (c) 2005-2007, Index Data. - -This file is part of Metaproxy. +/* This file is part of Metaproxy. + Copyright (C) 2005-2008 Index Data 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 @@ -14,10 +12,9 @@ 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 Metaproxy; see the file LICENSE. If not, write to the -Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. - */ +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include @@ -67,10 +64,13 @@ namespace metaproxy_1 { Z_Entry *get_entry(ODR odr); }; struct Multi::FrontendSet { - struct PresentJob { + class PresentJob { + public: BackendPtr m_backend; - int m_pos; - int m_inside_pos; + int m_pos; // position for backend (1=first, 2=second,.. + int m_start; // present request start + PresentJob(BackendPtr ptr, int pos) : + m_backend(ptr), m_pos(pos), m_start(0) {}; }; FrontendSet(std::string setname); FrontendSet(); @@ -274,10 +274,7 @@ void yf::Multi::FrontendSet::serve_order(int start, int number, { if (offset >= voffset && offset < voffset + bsit->m_count) { - PresentJob job; - job.m_backend = bsit->m_backend; - job.m_inside_pos = 0; - job.m_pos = offset - voffset + 1; + PresentJob job(bsit->m_backend, offset - voffset + 1); jobs.push_back(job); break; } @@ -290,12 +287,10 @@ void yf::Multi::FrontendSet::round_robin(int start, int number, std::list &jobs) { std::list pos; - std::list inside_pos; std::list::const_iterator bsit; for (bsit = m_backend_sets.begin(); bsit != m_backend_sets.end(); bsit++) { pos.push_back(1); - inside_pos.push_back(0); } int p = 1; @@ -334,8 +329,6 @@ void yf::Multi::FrontendSet::round_robin(int start, int number, // skip on each set.. before "present range".. p = p + skip; - std::cout << "\nSKIP min=" << min << " no_left=" << no_left << "\n\n"; - std::list::iterator psit = pos.begin(); for (psit = pos.begin(); psit != pos.end(); psit++) *psit += min; @@ -349,10 +342,9 @@ void yf::Multi::FrontendSet::round_robin(int start, int number, { more = false; std::list::iterator psit = pos.begin(); - std::list::iterator esit = inside_pos.begin(); bsit = m_backend_sets.begin(); - for (; bsit != m_backend_sets.end(); psit++,esit++,bsit++) + for (; bsit != m_backend_sets.end(); psit++,bsit++) { if (fetched >= number) { @@ -363,12 +355,8 @@ void yf::Multi::FrontendSet::round_robin(int start, int number, { if (p >= start) { - PresentJob job; - job.m_backend = bsit->m_backend; - job.m_pos = *psit; - job.m_inside_pos = *esit; + PresentJob job(bsit->m_backend, *psit); jobs.push_back(job); - (*esit)++; fetched++; } (*psit)++; @@ -677,8 +665,7 @@ void yf::Multi::Frontend::present(mp::Package &package, Z_APDU *apdu_req) std::list::const_iterator jit; for (jit = jobs.begin(); jit != jobs.end(); jit++) { - yaz_log(YLOG_LOG, "job pos=%d inside_pos=%d", - jit->m_pos, jit->m_inside_pos); + yaz_log(YLOG_LOG, "job pos=%d", jit->m_pos); } } @@ -688,22 +675,33 @@ void yf::Multi::Frontend::present(mp::Package &package, Z_APDU *apdu_req) bsit = it->second.m_backend_sets.begin(); for (; bsit != it->second.m_backend_sets.end(); bsit++) { - std::list::const_iterator jit; int start = -1; int end = -1; - - for (jit = jobs.begin(); jit != jobs.end(); jit++) { - if (jit->m_backend == bsit->m_backend) + std::list::const_iterator jit; + for (jit = jobs.begin(); jit != jobs.end(); jit++) { - if (start == -1 || jit->m_pos < start) - start = jit->m_pos; - if (end == -1 || jit->m_pos > end) - end = jit->m_pos; + if (jit->m_backend == bsit->m_backend) + { + if (start == -1 || jit->m_pos < start) + start = jit->m_pos; + if (end == -1 || jit->m_pos > end) + end = jit->m_pos; + } } } if (start != -1) { + std::list::iterator jit; + for (jit = jobs.begin(); jit != jobs.end(); jit++) + { + if (jit->m_backend == bsit->m_backend) + { + if (jit->m_pos >= start && jit->m_pos <= end) + jit->m_start = start; + } + } + PackagePtr p = bsit->m_backend->m_package; *req->resultSetStartPoint = start; @@ -784,7 +782,7 @@ void yf::Multi::Frontend::present(mp::Package &package, Z_APDU *apdu_req) nprl->records[i] = (Z_NamePlusRecord*) odr_malloc(odr, sizeof(Z_NamePlusRecord)); - int inside_pos = jit->m_inside_pos; + int inside_pos = jit->m_pos - jit->m_start; if (inside_pos >= b_resp->records-> u.databaseOrSurDiagnostics->num_records) break; @@ -1050,7 +1048,7 @@ void yf::Multi::Frontend::scan2(mp::Package &package, Z_APDU *apdu_req) } } - if (true) + if (false) { std::cout << "BEFORE\n"; ScanTermInfoList::iterator it = entries_before.begin(); @@ -1172,7 +1170,7 @@ void yf::Multi::process(mp::Package &package) const m_p->release_frontend(package); } -void mp::filter::Multi::configure(const xmlNode * ptr) +void mp::filter::Multi::configure(const xmlNode * ptr, bool test_only) { for (ptr = ptr->children; ptr; ptr = ptr->next) {