metaproxy  1.21.0
Public Member Functions | Private Types | Private Member Functions | Private Attributes | Friends | List of all members
metaproxy_1::filter::Sort::Frontend Class Reference
Inheritance diagram for metaproxy_1::filter::Sort::Frontend:
Inheritance graph
Collaboration diagram for metaproxy_1::filter::Sort::Frontend:
Collaboration graph

Public Member Functions

 Frontend (Impl *impl)
 
 ~Frontend ()
 

Private Types

typedef std::map< std::string, ResultSetPtr >::iterator Sets_it
 

Private Member Functions

void handle_package (mp::Package &package)
 
void handle_search (mp::Package &package, Z_APDU *apdu_req)
 
void handle_present (mp::Package &package, Z_APDU *apdu_req)
 
void handle_records (mp::Package &package, Z_APDU *apdu_reqq, Z_Records *records, Odr_int start_pos, ResultSetPtr s, Odr_oid *syntax, Z_RecordComposition *comp, const char *resultSetId)
 

Private Attributes

Implm_p
 
bool m_is_virtual
 
bool m_in_use
 
std::map< std::string, ResultSetPtrm_sets
 

Friends

class Impl
 

Detailed Description

Definition at line 97 of file filter_sort.cpp.

Member Typedef Documentation

◆ Sets_it

typedef std::map<std::string, ResultSetPtr>::iterator metaproxy_1::filter::Sort::Frontend::Sets_it
private

Definition at line 103 of file filter_sort.cpp.

Constructor & Destructor Documentation

◆ Frontend()

mp::filter::Sort::Frontend::Frontend ( Impl impl)

Definition at line 375 of file filter_sort.cpp.

◆ ~Frontend()

mp::filter::Sort::Frontend::~Frontend ( )

Definition at line 380 of file filter_sort.cpp.

381 {
382 }

Member Function Documentation

◆ handle_package()

void mp::filter::Sort::Frontend::handle_package ( mp::Package &  package)
private

Definition at line 706 of file filter_sort.cpp.

707 {
708  Z_GDU *gdu = package.request().get();
709  if (gdu && gdu->which == Z_GDU_Z3950)
710  {
711  Z_APDU *apdu_req = gdu->u.z3950;
712  switch (apdu_req->which)
713  {
714  case Z_APDU_searchRequest:
715  handle_search(package, apdu_req);
716  return;
717  case Z_APDU_presentRequest:
718  handle_present(package, apdu_req);
719  return;
720  }
721  }
722  package.move();
723 }
void handle_search(mp::Package &package, Z_APDU *apdu_req)
void handle_present(mp::Package &package, Z_APDU *apdu_req)

◆ handle_present()

void mp::filter::Sort::Frontend::handle_present ( mp::Package &  package,
Z_APDU *  apdu_req 
)
private

Definition at line 627 of file filter_sort.cpp.

628 {
629  Z_PresentRequest *req = apdu_req->u.presentRequest;
630  std::string resultSetId = req->resultSetId;
631  mp::odr odr;
632  Odr_oid *syntax = 0;
633  Odr_int start = *req->resultSetStartPoint;
634 
635  if (req->preferredRecordSyntax)
636  syntax = odr_oiddup(odr, req->preferredRecordSyntax);
637 
638  Sets_it sets_it = m_sets.find(resultSetId);
639  if (sets_it == m_sets.end())
640  {
641  Z_APDU *apdu =
642  odr.create_presentResponse(
643  apdu_req,
644  YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
645  resultSetId.c_str());
646  package.response() = apdu;
647  return;
648  }
649  ResultSetPtr rset = sets_it->second;
650  std::list<RecordListPtr>::const_iterator it = rset->record_lists.begin();
651  for (; it != rset->record_lists.end(); it++)
652  if ((*it)->cmp(req->preferredRecordSyntax))
653  {
654  if (*req->resultSetStartPoint - 1 + *req->numberOfRecordsRequested
655  <= (*it)->size())
656  {
657  int i;
658  Z_APDU *p_apdu = zget_APDU(odr, Z_APDU_presentResponse);
659  Z_PresentResponse *p_res = p_apdu->u.presentResponse;
660 
661  *p_res->nextResultSetPosition = *req->resultSetStartPoint +
662  *req->numberOfRecordsRequested;
663  *p_res->numberOfRecordsReturned =
664  *req->numberOfRecordsRequested;
665  p_res->records = (Z_Records *)
666  odr_malloc(odr, sizeof(*p_res->records));
667  p_res->records->which = Z_Records_DBOSD;
668  Z_NamePlusRecordList *nprl = (Z_NamePlusRecordList *)
669  odr_malloc(odr, sizeof(*nprl));
670  p_res->records->u.databaseOrSurDiagnostics = nprl;
671  nprl->num_records = *req->numberOfRecordsRequested;
672  nprl->records = (Z_NamePlusRecord **)
673  odr_malloc(odr, nprl->num_records * sizeof(*nprl->records));
674  for (i = 0; i < nprl->num_records; i++)
675  {
676  int pos = i + *req->resultSetStartPoint - 1;
677  nprl->records[i] = (*it)->get(pos, m_p->m_ascending);
678  }
679  package.response() = p_apdu;
680  return;
681  }
682  break;
683  }
684 
685 
686  Package b_package(package.session(), package.origin());
687  b_package.copy_filter(package);
688  b_package.request() = apdu_req;
689  b_package.move();
690  Z_GDU *gdu_res = b_package.response().get();
691  if (gdu_res && gdu_res->which == Z_GDU_Z3950 && gdu_res->u.z3950->which ==
692  Z_APDU_presentResponse)
693  {
694  Z_PresentResponse *res = gdu_res->u.z3950->u.presentResponse;
695  handle_records(package, apdu_req, res->records,
696  start, rset, syntax, req->recordComposition,
697  resultSetId.c_str());
698  package.response() = gdu_res;
699  }
700  else
701  package.response() = b_package.response();
702  if (b_package.session().is_closed())
703  b_package.session().close();
704 }
std::map< std::string, ResultSetPtr >::iterator Sets_it
std::map< std::string, ResultSetPtr > m_sets
void handle_records(mp::Package &package, Z_APDU *apdu_reqq, Z_Records *records, Odr_int start_pos, ResultSetPtr s, Odr_oid *syntax, Z_RecordComposition *comp, const char *resultSetId)
boost::shared_ptr< ResultSet > ResultSetPtr
Definition: filter_sort.hpp:36

References metaproxy_1::filter::Sort::m_p.

◆ handle_records()

void mp::filter::Sort::Frontend::handle_records ( mp::Package &  package,
Z_APDU *  apdu_reqq,
Z_Records *  records,
Odr_int  start_pos,
ResultSetPtr  s,
Odr_oid *  syntax,
Z_RecordComposition *  comp,
const char *  resultSetId 
)
private

Definition at line 498 of file filter_sort.cpp.

506 {
507  if (records && records->which == Z_Records_DBOSD && start_pos == 1)
508  {
509  std::list<RecordListPtr>::const_iterator it = s->record_lists.begin();
510 
511  for (; it != s->record_lists.end(); it++)
512  if ((*it)->cmp(syntax))
513  return;
514 
515  Z_NamePlusRecordList *nprl = records->u.databaseOrSurDiagnostics;
516  int i; // i is number of records fetched in last response
517 
518  int pos = 1;
519  RecordListPtr rlp(new RecordList(syntax,
520  m_p->m_namespaces.c_str(),
521  m_p->m_xpath_expr.c_str(),
522  m_p->m_debug));
523  for (i = 0; i < nprl->num_records; i++, pos++)
524  rlp->add(nprl->records[i]);
525 
526  int end_pos = m_p->m_prefetch;
527  if (end_pos > s->hit_count)
528  end_pos = s->hit_count;
529  while (i && pos <= end_pos)
530  {
531  mp::odr odr;
532  i = 0;
533 
534  Package present_package(package.session(), package.origin());
535  present_package.copy_filter(package);
536 
537  Z_APDU *p_apdu = zget_APDU(odr, Z_APDU_presentRequest);
538  Z_PresentRequest *p_req = p_apdu->u.presentRequest;
539 
540  *p_req->resultSetStartPoint = pos;
541  *p_req->numberOfRecordsRequested = end_pos - pos + 1;
542  p_req->preferredRecordSyntax = syntax;
543  p_req->resultSetId = odr_strdup(odr, resultSetId);
544  p_req->recordComposition = comp;
545 
546  present_package.request() = p_apdu;
547  present_package.move();
548 
549  Z_GDU *gdu_res = present_package.response().get();
550  if (gdu_res && gdu_res->which == Z_GDU_Z3950 &&
551  gdu_res->u.z3950->which == Z_APDU_presentResponse)
552  {
553  Z_PresentResponse *res = gdu_res->u.z3950->u.presentResponse;
554  Z_Records *records = res->records;
555  if (records && records->which == Z_Records_DBOSD)
556  {
557  Z_NamePlusRecordList *nprl =
558  records->u.databaseOrSurDiagnostics;
559  for (i = 0; i < nprl->num_records; i++, pos++)
560  rlp->add(nprl->records[i]);
561  }
562  }
563  }
564  s->record_lists.push_back(rlp);
565  rlp->sort();
566 
567  for (i = 0; i < nprl->num_records; i++)
568  nprl->records[i] = rlp->get(i, m_p->m_ascending);
569  }
570 }
boost::shared_ptr< RecordList > RecordListPtr
Definition: filter_sort.hpp:37

References metaproxy_1::filter::Sort::m_p.

◆ handle_search()

void mp::filter::Sort::Frontend::handle_search ( mp::Package &  package,
Z_APDU *  apdu_req 
)
private

Definition at line 572 of file filter_sort.cpp.

573 {
574  Z_SearchRequest *req = apdu_req->u.searchRequest;
575  std::string resultSetId = req->resultSetName;
576  mp::odr odr;
577  Odr_oid *syntax = 0;
578 
579  if (req->preferredRecordSyntax)
580  syntax = odr_oiddup(odr, req->preferredRecordSyntax);
581 
582  Sets_it sets_it = m_sets.find(req->resultSetName);
583  if (sets_it != m_sets.end())
584  {
585  // result set already exist
586  // if replace indicator is off: we return diagnostic if
587  // result set already exist.
588  if (*req->replaceIndicator == 0)
589  {
590  Z_APDU *apdu =
591  odr.create_searchResponse(
592  apdu_req,
593  YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF,
594  0);
595  package.response() = apdu;
596  return;
597  }
598  m_sets.erase(resultSetId);
599  }
600  ResultSetPtr s(new ResultSet);
601  m_sets[resultSetId] = s;
602 
603  Package b_package(package.session(), package.origin());
604  b_package.copy_filter(package);
605  b_package.request() = apdu_req;
606  b_package.move();
607 
608  Z_GDU *gdu_res = b_package.response().get();
609  if (gdu_res && gdu_res->which == Z_GDU_Z3950 && gdu_res->u.z3950->which ==
610  Z_APDU_searchResponse)
611  {
612  Z_SearchResponse *res = gdu_res->u.z3950->u.searchResponse;
613  Z_RecordComposition *record_comp =
614  mp::util::piggyback_to_RecordComposition(odr,
615  *res->resultCount, req);
616  s->hit_count = *res->resultCount;
617  handle_records(package, apdu_req, res->records, 1, s,
618  syntax, record_comp, resultSetId.c_str());
619  package.response() = gdu_res;
620  }
621  else
622  package.response() = b_package.response();
623  if (b_package.session().is_closed())
624  b_package.session().close();
625 }

Friends And Related Function Documentation

◆ Impl

friend class Impl
friend

Definition at line 98 of file filter_sort.cpp.

Member Data Documentation

◆ m_in_use

bool metaproxy_1::filter::Sort::Frontend::m_in_use
private

Definition at line 101 of file filter_sort.cpp.

◆ m_is_virtual

bool metaproxy_1::filter::Sort::Frontend::m_is_virtual
private

Definition at line 100 of file filter_sort.cpp.

◆ m_p

Impl* metaproxy_1::filter::Sort::Frontend::m_p
private

Definition at line 99 of file filter_sort.cpp.

◆ m_sets

std::map<std::string, ResultSetPtr> metaproxy_1::filter::Sort::Frontend::m_sets
private

Definition at line 102 of file filter_sort.cpp.


The documentation for this class was generated from the following file: