metaproxy  1.21.0
Classes | Public Member Functions | Private Types | Private Attributes | List of all members
metaproxy_1::filter::VirtualDB Class Reference

#include <filter_virt_db.hpp>

Inheritance diagram for metaproxy_1::filter::VirtualDB:
Inheritance graph
Collaboration diagram for metaproxy_1::filter::VirtualDB:
Collaboration graph

Classes

struct  Backend
 
struct  Frontend
 
struct  Map
 
class  Rep
 
struct  Set
 

Public Member Functions

 ~VirtualDB ()
 
 VirtualDB ()
 
void process (metaproxy_1::Package &package) const
 
void configure (const xmlNode *ptr, bool test_only, const char *path)
 
void add_map_db2targets (std::string db, std::list< std::string > targets, std::string route)
 
void add_map_db2target (std::string db, std::string target, std::string route)
 

Private Types

typedef boost::shared_ptr< BackendBackendPtr
 
typedef boost::shared_ptr< FrontendFrontendPtr
 

Private Attributes

boost::scoped_ptr< Repm_p
 

Detailed Description

Definition at line 31 of file filter_virt_db.hpp.

Member Typedef Documentation

◆ BackendPtr

typedef boost::shared_ptr<Backend> metaproxy_1::filter::VirtualDB::BackendPtr
private

Definition at line 37 of file filter_virt_db.hpp.

◆ FrontendPtr

typedef boost::shared_ptr<Frontend> metaproxy_1::filter::VirtualDB::FrontendPtr
private

Definition at line 38 of file filter_virt_db.hpp.

Constructor & Destructor Documentation

◆ ~VirtualDB()

mp::filter::VirtualDB::~VirtualDB ( )

Definition at line 497 of file filter_virt_db.cpp.

497  {
498 }

◆ VirtualDB()

mp::filter::VirtualDB::VirtualDB ( )

Definition at line 492 of file filter_virt_db.cpp.

492  : m_p(new VirtualDB::Rep)
493 {
494  m_p->pass_vhosts = false;
495 }
boost::scoped_ptr< Rep > m_p

References m_p.

Member Function Documentation

◆ add_map_db2target()

void mp::filter::VirtualDB::add_map_db2target ( std::string  db,
std::string  target,
std::string  route 
)

Definition at line 724 of file filter_virt_db.cpp.

728 {
729  m_p->m_maps.push_back(
730  VirtualDB::Map(mp::util::database_name_normalize(db), target, route));
731 }

◆ add_map_db2targets()

void mp::filter::VirtualDB::add_map_db2targets ( std::string  db,
std::list< std::string >  targets,
std::string  route 
)

Definition at line 715 of file filter_virt_db.cpp.

718 {
719  m_p->m_maps.push_back(
720  VirtualDB::Map(mp::util::database_name_normalize(db), targets, route));
721 }

◆ configure()

void mp::filter::VirtualDB::configure ( const xmlNode *  ptr,
bool  test_only,
const char *  path 
)

Definition at line 844 of file filter_virt_db.cpp.

846 {
847  for (ptr = ptr->children; ptr; ptr = ptr->next)
848  {
849  if (ptr->type != XML_ELEMENT_NODE)
850  continue;
851  if (!strcmp((const char *) ptr->name, "pass-vhosts"))
852  {
853  m_p->pass_vhosts = mp::xml::get_bool(ptr, false);
854  }
855  else if (!strcmp((const char *) ptr->name, "virtual"))
856  {
857  std::string database;
858  std::list<std::string> targets;
859  xmlNode *v_node = ptr->children;
860  for (; v_node; v_node = v_node->next)
861  {
862  if (v_node->type != XML_ELEMENT_NODE)
863  continue;
864 
865  if (mp::xml::is_element_mp(v_node, "database"))
866  database = mp::xml::get_text(v_node);
867  else if (mp::xml::is_element_mp(v_node, "target"))
868  targets.push_back(mp::xml::get_text(v_node));
869  else
870  throw mp::filter::FilterException
871  ("Bad element "
872  + std::string((const char *) v_node->name)
873  + " in virtual section"
874  );
875  }
876  std::string route = mp::xml::get_route(ptr);
877 
878  VirtualDB::Map vmap(mp::util::database_name_normalize(database),
879  targets, route);
880  m_p->m_maps.push_back(vmap);
881  }
882  else
883  {
884  throw mp::filter::FilterException
885  ("Bad element "
886  + std::string((const char *) ptr->name)
887  + " in virt_db filter");
888  }
889  }
890 }

◆ process()

void mp::filter::VirtualDB::process ( metaproxy_1::Package &  package) const

Definition at line 733 of file filter_virt_db.cpp.

734 {
735  FrontendPtr f = m_p->get_frontend(package);
736 
737  Z_GDU *gdu = package.request().get();
738 
739  if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
740  Z_APDU_initRequest && !f->m_is_virtual)
741  {
742  Z_InitRequest *req = gdu->u.z3950->u.initRequest;
743 
744  std::list<std::string> vhosts;
745  mp::util::get_vhost_otherinfo(req->otherInfo, vhosts);
746 
747  if (vhosts.size() > 0 && m_p->pass_vhosts)
748  {
749  package.move();
750  }
751  else
752  {
753  f->m_init_gdu = gdu;
754 
755  mp::odr odr;
756  Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
757  Z_InitResponse *resp = apdu->u.initResponse;
758 
759  int i;
760  static const int masks[] = {
761  Z_Options_search,
762  Z_Options_present,
763  Z_Options_namedResultSets,
764  Z_Options_scan,
765  -1
766  };
767  for (i = 0; masks[i] != -1; i++)
768  if (ODR_MASK_GET(req->options, masks[i]))
769  ODR_MASK_SET(resp->options, masks[i]);
770 
771  static const int versions[] = {
772  Z_ProtocolVersion_1,
773  Z_ProtocolVersion_2,
774  Z_ProtocolVersion_3,
775  -1
776  };
777  for (i = 0; versions[i] != -1; i++)
778  if (ODR_MASK_GET(req->protocolVersion, versions[i]))
779  ODR_MASK_SET(resp->protocolVersion, versions[i]);
780  else
781  break;
782 
783  *resp->preferredMessageSize = *req->preferredMessageSize;
784  *resp->maximumRecordSize = *req->maximumRecordSize;
785 
786  package.response() = apdu;
787  f->m_is_virtual = true;
788  }
789  }
790  else if (!f->m_is_virtual)
791  package.move();
792  else if (gdu && gdu->which == Z_GDU_Z3950)
793  {
794  Z_APDU *apdu = gdu->u.z3950;
795  if (apdu->which == Z_APDU_initRequest)
796  {
797  mp::odr odr;
798 
799  package.response() = odr.create_close(
800  apdu,
801  Z_Close_protocolError,
802  "double init");
803 
804  package.session().close();
805  }
806  else if (apdu->which == Z_APDU_searchRequest)
807  {
808  f->search(package, apdu);
809  }
810  else if (apdu->which == Z_APDU_presentRequest)
811  {
812  f->present(package, apdu);
813  }
814  else if (apdu->which == Z_APDU_scanRequest)
815  {
816  f->scan(package, apdu);
817  }
818  else if (apdu->which == Z_APDU_close)
819  {
820  if (f->relay_apdu(package, apdu) == 0)
821  {
822  mp::odr odr;
823 
824  package.response() = odr.create_close(
825  apdu, Z_Close_finished, "virt_db");
826 
827  package.session().close();
828  }
829  }
830  else
831  {
832  mp::odr odr;
833 
834  package.response() = odr.create_close(
835  apdu, Z_Close_protocolError,
836  "unsupported APDU in filter_virt_db");
837 
838  package.session().close();
839  }
840  }
841  m_p->release_frontend(package);
842 }
boost::shared_ptr< Frontend > FrontendPtr

Member Data Documentation

◆ m_p

boost::scoped_ptr<Rep> metaproxy_1::filter::VirtualDB::m_p
private

Definition at line 52 of file filter_virt_db.hpp.

Referenced by VirtualDB().


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