+ std::string m_result_set_id;
+ Databases m_databases;
+ int m_result_set_size;
+ yazpp_1::Yaz_Z_Query m_query;
+ time_t m_time_last_use;
+ void timestamp();
+ BackendSet(
+ const std::string &result_set_id,
+ const Databases &databases,
+ const yazpp_1::Yaz_Z_Query &query);
+ bool search(
+ Package &frontend_package,
+ const Z_APDU *apdu_req,
+ const BackendInstancePtr bp);
+ };
+ class SessionShared::BackendInstance {
+ friend class Rep;
+ friend class BackendClass;
+ friend class BackendSet;
+ public:
+ mp::Session m_session;
+ BackendSetList m_sets;
+ bool m_in_use;
+ int m_sequence_this;
+ int m_result_set_sequence;
+ time_t m_time_last_use;
+ mp::Package * m_close_package;
+ ~BackendInstance();
+ };
+ class SessionShared::BackendClass : boost::noncopyable {
+ friend class Rep;
+ friend struct Frontend;
+ bool m_named_result_sets;
+ BackendInstanceList m_backend_list;
+ BackendInstancePtr create_backend(const Package &package);
+ void remove_backend(BackendInstancePtr b);
+ BackendInstancePtr get_backend(const Package &package);
+ void use_backend(BackendInstancePtr b);
+ void release_backend(BackendInstancePtr b);
+ void expire();
+ yazpp_1::GDU m_init_request;
+ yazpp_1::GDU m_init_response;
+ boost::mutex m_mutex_backend_class;
+ int m_sequence_top;
+ time_t m_backend_set_ttl;
+ time_t m_backend_expiry_ttl;
+ size_t m_backend_set_max;
+ public:
+ BackendClass(const yazpp_1::GDU &init_request,
+ int resultset_ttl,
+ int resultset_max,
+ int session_ttl);
+ ~BackendClass();
+ };
+ class SessionShared::FrontendSet {
+ Databases m_databases;
+ yazpp_1::Yaz_Z_Query m_query;
+ public:
+ const Databases &get_databases();
+ const yazpp_1::Yaz_Z_Query &get_query();
+ FrontendSet(
+ const Databases &databases,
+ const yazpp_1::Yaz_Z_Query &query);
+ FrontendSet();
+ };
+ struct SessionShared::Frontend {
+ Frontend(Rep *rep);
+ ~Frontend();
+ bool m_is_virtual;
+ bool m_in_use;
+ Z_Options m_init_options;
+ void search(Package &package, Z_APDU *apdu);
+ void present(Package &package, Z_APDU *apdu);
+ void scan(Package &package, Z_APDU *apdu);
+
+ void get_set(mp::Package &package,
+ const Z_APDU *apdu_req,
+ const Databases &databases,
+ yazpp_1::Yaz_Z_Query &query,
+ BackendInstancePtr &found_backend,
+ BackendSetPtr &found_set);
+ void override_set(BackendInstancePtr &found_backend,
+ std::string &result_set_id);
+
+ Rep *m_p;
+ BackendClassPtr m_backend_class;
+ FrontendSets m_frontend_sets;
+ };
+ class SessionShared::Rep {
+ friend class SessionShared;
+ friend struct Frontend;
+
+ FrontendPtr get_frontend(Package &package);
+ void release_frontend(Package &package);
+ Rep();
+ public:
+ void expire();
+ private:
+ void init(Package &package, const Z_GDU *gdu,
+ FrontendPtr frontend);
+ boost::mutex m_mutex;
+ boost::condition m_cond_session_ready;
+ std::map<mp::Session, FrontendPtr> m_clients;
+
+ BackendClassMap m_backend_map;
+ boost::mutex m_mutex_backend_map;
+ boost::thread_group m_thrds;
+ int m_resultset_ttl;
+ int m_resultset_max;
+ int m_session_ttl;