X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_sort.cpp;h=e36e8cdd801979f30cc8fad6972636234d5fdd5d;hb=9f2dd20cc26c23a736b42e0eb929782f4e76b9e2;hp=784c6f9d6bbb621040c86817bb822a079b565eca;hpb=3ad4016fb41388c1e70327924f781c5eb8ec0c51;p=metaproxy-moved-to-github.git diff --git a/src/filter_sort.cpp b/src/filter_sort.cpp index 784c6f9..e36e8cd 100644 --- a/src/filter_sort.cpp +++ b/src/filter_sort.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2012 Index Data + Copyright (C) 2005-2013 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 @@ -111,6 +111,7 @@ namespace metaproxy_1 { Odr_int start_pos, ResultSetPtr s, Odr_oid *syntax, + Z_RecordComposition *comp, const char *resultSetId); public: Frontend(Impl *impl); @@ -124,37 +125,37 @@ static void print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) xmlNodePtr cur; int size; int i; - + assert(output); size = nodes ? nodes->nodeNr : 0; - + fprintf(output, "Result (%d nodes):\n", size); for (i = 0; i < size; ++i) { assert(nodes->nodeTab[i]); - + if (nodes->nodeTab[i]->type == XML_NAMESPACE_DECL) { xmlNsPtr ns = (xmlNsPtr)nodes->nodeTab[i]; cur = (xmlNodePtr)ns->next; if (cur->ns) - fprintf(output, "= namespace \"%s\"=\"%s\" for node %s:%s\n", + fprintf(output, "= namespace \"%s\"=\"%s\" for node %s:%s\n", ns->prefix, ns->href, cur->ns->href, cur->name); else - fprintf(output, "= namespace \"%s\"=\"%s\" for node %s\n", + fprintf(output, "= namespace \"%s\"=\"%s\" for node %s\n", ns->prefix, ns->href, cur->name); } else if (nodes->nodeTab[i]->type == XML_ELEMENT_NODE) { - cur = nodes->nodeTab[i]; + cur = nodes->nodeTab[i]; if (cur->ns) - fprintf(output, "= element node \"%s:%s\"\n", + fprintf(output, "= element node \"%s:%s\"\n", cur->ns->href, cur->name); else fprintf(output, "= element node \"%s\"\n", cur->name); } else { - cur = nodes->nodeTab[i]; + cur = nodes->nodeTab[i]; fprintf(output, "= node \"%s\": type %d\n", cur->name, cur->type); } } @@ -167,15 +168,15 @@ bool yf::Sort::Record::register_namespaces(xmlXPathContextPtr xpathCtx, xmlChar* prefix; xmlChar* href; xmlChar* next; - + assert(xpathCtx); assert(nsList); nsListDup = xmlStrdup((const xmlChar *) nsList); if (!nsListDup) return false; - - next = nsListDup; + + next = nsListDup; while (next) { /* skip spaces */ @@ -192,13 +193,13 @@ bool yf::Sort::Record::register_namespaces(xmlXPathContextPtr xpathCtx, xmlFree(nsListDup); return false; } - *next++ = '\0'; - + *next++ = '\0'; + /* find href */ href = next; next = (xmlChar*)xmlStrchr(next, ' '); if (next) - *next++ = '\0'; + *next++ = '\0'; /* do register namespace */ if (xmlXPathRegisterNs(xpathCtx, prefix, href) != 0) @@ -207,7 +208,7 @@ bool yf::Sort::Record::register_namespaces(xmlXPathContextPtr xpathCtx, return false; } } - + xmlFree(nsListDup); return true; } @@ -219,7 +220,7 @@ void yf::Sort::Record::get_xpath(xmlDoc *doc, const char *namespaces, { xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc); if (xpathCtx) - { + { register_namespaces(xpathCtx, namespaces); xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression((const xmlChar *) expr, xpathCtx); @@ -260,7 +261,7 @@ void yf::Sort::Record::get_xpath(xmlDoc *doc, const char *namespaces, yf::Sort::Record::Record(Z_NamePlusRecord *n, const char *namespaces, const char *expr, - bool debug) : npr(n) + bool debug) : npr(n) { if (npr->which == Z_NamePlusRecord_databaseRecord) { @@ -307,9 +308,9 @@ yf::Sort::RecordList::RecordList(Odr_oid *syntax, yf::Sort::RecordList::~RecordList() { - + } - + bool yf::Sort::RecordList::cmp(Odr_oid *syntax) { if ((!this->syntax && !syntax) @@ -371,7 +372,7 @@ void yf::Sort::process(mp::Package &package) const } -yf::Sort::Frontend::Frontend(Impl *impl) : +yf::Sort::Frontend::Frontend(Impl *impl) : m_p(impl), m_is_virtual(false), m_in_use(true) { } @@ -386,7 +387,7 @@ yf::Sort::Impl::Impl() : m_prefetch(20), m_ascending(true), m_debug(false) } yf::Sort::Impl::~Impl() -{ +{ } yf::Sort::FrontendPtr yf::Sort::Impl::get_frontend(mp::Package &package) @@ -394,13 +395,13 @@ yf::Sort::FrontendPtr yf::Sort::Impl::get_frontend(mp::Package &package) boost::mutex::scoped_lock lock(m_mutex); std::map::iterator it; - + while(true) { it = m_clients.find(package.session()); if (it == m_clients.end()) break; - + if (!it->second->m_in_use) { it->second->m_in_use = true; @@ -418,7 +419,7 @@ void yf::Sort::Impl::release_frontend(mp::Package &package) { boost::mutex::scoped_lock lock(m_mutex); std::map::iterator it; - + it = m_clients.find(package.session()); if (it != m_clients.end()) { @@ -442,7 +443,7 @@ void yf::Sort::Impl::configure(const xmlNode *ptr, bool test_only, if (ptr->type != XML_ELEMENT_NODE) continue; if (!strcmp((const char *) ptr->name, "sort")) - { + { const struct _xmlAttr *attr; for (attr = ptr->properties; attr; attr = attr->next) { @@ -452,7 +453,7 @@ void yf::Sort::Impl::configure(const xmlNode *ptr, bool test_only, if (m_prefetch < 0) { throw mp::filter::FilterException( - "Bad or missing value for attribute " + + "Bad or missing value for attribute " + std::string((const char *) attr->name)); } } @@ -481,7 +482,7 @@ void yf::Sort::Impl::configure(const xmlNode *ptr, bool test_only, else { throw mp::filter::FilterException - ("Bad element " + ("Bad element " + std::string((const char *) ptr->name) + " in sort filter"); } @@ -500,6 +501,7 @@ void yf::Sort::Frontend::handle_records(mp::Package &package, Odr_int start_pos, ResultSetPtr s, Odr_oid *syntax, + Z_RecordComposition *comp, const char *resultSetId) { if (records && records->which == Z_Records_DBOSD && start_pos == 1) @@ -539,6 +541,7 @@ void yf::Sort::Frontend::handle_records(mp::Package &package, *p_req->numberOfRecordsRequested = end_pos - pos + 1; p_req->preferredRecordSyntax = syntax; p_req->resultSetId = odr_strdup(odr, resultSetId); + p_req->recordComposition = comp; present_package.request() = p_apdu; present_package.move(); @@ -568,7 +571,7 @@ void yf::Sort::Frontend::handle_records(mp::Package &package, void yf::Sort::Frontend::handle_search(mp::Package &package, Z_APDU *apdu_req) { - Z_SearchRequest *req = apdu_req->u.searchRequest; + Z_SearchRequest *req = apdu_req->u.searchRequest; std::string resultSetId = req->resultSetName; Package b_package(package.session(), package.origin()); mp::odr odr; @@ -581,19 +584,19 @@ void yf::Sort::Frontend::handle_search(mp::Package &package, Z_APDU *apdu_req) Sets_it sets_it = m_sets.find(req->resultSetName); if (sets_it != m_sets.end()) { - // result set already exist + // result set already exist // if replace indicator is off: we return diagnostic if // result set already exist. if (*req->replaceIndicator == 0) { - Z_APDU *apdu = + Z_APDU *apdu = odr.create_searchResponse( apdu_req, YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF, 0); package.response() = apdu; return; - } + } m_sets.erase(resultSetId); } ResultSetPtr s(new ResultSet); @@ -604,16 +607,19 @@ void yf::Sort::Frontend::handle_search(mp::Package &package, Z_APDU *apdu_req) Z_APDU_searchResponse) { Z_SearchResponse *res = gdu_res->u.z3950->u.searchResponse; + Z_RecordComposition *record_comp = + mp::util::piggyback_to_RecordComposition(odr, + *res->resultCount, req); s->hit_count = *res->resultCount; handle_records(b_package, apdu_req, res->records, 1, s, - syntax, resultSetId.c_str()); + syntax, record_comp, resultSetId.c_str()); package.response() = gdu_res; } } void yf::Sort::Frontend::handle_present(mp::Package &package, Z_APDU *apdu_req) { - Z_PresentRequest *req = apdu_req->u.presentRequest; + Z_PresentRequest *req = apdu_req->u.presentRequest; std::string resultSetId = req->resultSetId; Package b_package(package.session(), package.origin()); mp::odr odr; @@ -627,7 +633,7 @@ void yf::Sort::Frontend::handle_present(mp::Package &package, Z_APDU *apdu_req) Sets_it sets_it = m_sets.find(resultSetId); if (sets_it == m_sets.end()) { - Z_APDU *apdu = + Z_APDU *apdu = odr.create_presentResponse( apdu_req, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, @@ -640,7 +646,7 @@ void yf::Sort::Frontend::handle_present(mp::Package &package, Z_APDU *apdu_req) for (; it != rset->record_lists.end(); it++) if ((*it)->cmp(req->preferredRecordSyntax)) { - if (*req->resultSetStartPoint - 1 + *req->numberOfRecordsRequested + if (*req->resultSetStartPoint - 1 + *req->numberOfRecordsRequested <= (*it)->size()) { int i; @@ -649,9 +655,9 @@ void yf::Sort::Frontend::handle_present(mp::Package &package, Z_APDU *apdu_req) *p_res->nextResultSetPosition = *req->resultSetStartPoint + *req->numberOfRecordsRequested; - *p_res->numberOfRecordsReturned = + *p_res->numberOfRecordsReturned = *req->numberOfRecordsRequested; - p_res->records = (Z_Records *) + p_res->records = (Z_Records *) odr_malloc(odr, sizeof(*p_res->records)); p_res->records->which = Z_Records_DBOSD; Z_NamePlusRecordList *nprl = (Z_NamePlusRecordList *) @@ -676,8 +682,9 @@ void yf::Sort::Frontend::handle_present(mp::Package &package, Z_APDU *apdu_req) Z_APDU_presentResponse) { Z_PresentResponse *res = gdu_res->u.z3950->u.presentResponse; - handle_records(b_package, apdu_req, res->records, - start, rset, syntax, resultSetId.c_str()); + handle_records(b_package, apdu_req, res->records, + start, rset, syntax, req->recordComposition, + resultSetId.c_str()); package.response() = gdu_res; } }