<?xml version="1.0" encoding="UTF-8"?>
-<!-- $Id: config.xsd,v 1.19 2006-06-20 22:29:38 adam Exp $ -->
+<!-- $Id: config.xsd,v 1.20 2006-06-21 09:16:53 adam Exp $ -->
<!--
This Schema prescribes the format of YP2 configuration files.
Invoke it like this:
</xs:element>
</xs:sequence>
-
<!-- type="virt_db" or type="multi" -->
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="config:virtual"/>
<!-- No elements included -->
<!-- type="session_shared" -->
- <!-- No example configuration to deduce from yet -->
+ <xs:sequence>
+ <xs:element minOccurs="0" name="resultset">
+ <xs:complexType>
+ <xs:attribute name="ttl" type="xs:integer"/>
+ <xs:attribute name="max" type="xs:integer"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element minOccurs="0" name="session">
+ <xs:complexType>
+ <xs:attribute name="ttl" type="xs:integer"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
<!-- type="template" -->
<!-- No example configuration to deduce from yet -->
-/* $Id: filter_session_shared.cpp,v 1.13 2006-06-20 22:27:45 adam Exp $
+/* $Id: filter_session_shared.cpp,v 1.14 2006-06-21 09:16:54 adam Exp $
Copyright (c) 2005-2006, Index Data.
See the LICENSE file for details
time_t m_backend_expiry_ttl;
size_t m_backend_set_max;
public:
- BackendClass(const yazpp_1::GDU &init_request);
+ BackendClass(const yazpp_1::GDU &init_request,
+ int resultset_ttl,
+ int resultset_max,
+ int session_ttl);
~BackendClass();
};
class SessionShared::FrontendSet {
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;
};
}
}
}
-yf::SessionShared::BackendClass::BackendClass(const yazpp_1::GDU &init_request)
+yf::SessionShared::BackendClass::BackendClass(const yazpp_1::GDU &init_request,
+ int resultset_ttl,
+ int resultset_max,
+ int session_ttl)
: m_named_result_sets(false), m_init_request(init_request),
- m_sequence_top(0), m_backend_set_ttl(30),
- m_backend_expiry_ttl(30), m_backend_set_max(10)
+ m_sequence_top(0), m_backend_set_ttl(resultset_ttl),
+ m_backend_expiry_ttl(session_ttl), m_backend_set_max(resultset_max)
{}
yf::SessionShared::BackendClass::~BackendClass()
it = m_backend_map.find(k);
if (it == m_backend_map.end())
{
- BackendClassPtr b(new BackendClass(gdu->u.z3950));
+ BackendClassPtr b(new BackendClass(gdu->u.z3950,
+ m_resultset_ttl,
+ m_resultset_max,
+ m_session_ttl));
m_backend_map[k] = b;
frontend->m_backend_class = b;
std::cout << "SessionShared::Rep::init new session "
yf::SessionShared::Rep::Rep()
{
+ m_resultset_ttl = 30;
+ m_resultset_max = 10;
+ m_session_ttl = 90;
yf::SessionShared::Worker w(this);
m_thrds.add_thread(new boost::thread(w));
}
m_p->release_frontend(package);
}
+void yf::SessionShared::configure(const xmlNode *ptr)
+{
+ for (ptr = ptr->children; ptr; ptr = ptr->next)
+ {
+ if (ptr->type != XML_ELEMENT_NODE)
+ continue;
+ if (!strcmp((const char *) ptr->name, "resultset"))
+ {
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "ttl"))
+ m_p->m_resultset_ttl =
+ mp::xml::get_int(attr->children, 30);
+ else if (!strcmp((const char *) attr->name, "max"))
+ {
+ m_p->m_resultset_max =
+ mp::xml::get_int(attr->children, 10);
+ }
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ }
+ else if (!strcmp((const char *) ptr->name, "session"))
+ {
+ const struct _xmlAttr *attr;
+ for (attr = ptr->properties; attr; attr = attr->next)
+ {
+ if (!strcmp((const char *) attr->name, "ttl"))
+ m_p->m_session_ttl =
+ mp::xml::get_int(attr->children, 120);
+ else
+ throw mp::filter::FilterException(
+ "Bad attribute " + std::string((const char *)
+ attr->name));
+ }
+ }
+ else
+ {
+ throw mp::filter::FilterException("Bad element "
+ + std::string((const char *)
+ ptr->name));
+ }
+ }
+}
+
static mp::filter::Base* filter_creator()
{
return new mp::filter::SessionShared;
-/* $Id: xmlutil.hpp,v 1.7 2006-06-19 13:08:00 adam Exp $
+/* $Id: xmlutil.hpp,v 1.8 2006-06-21 09:16:54 adam Exp $
Copyright (c) 2005-2006, Index Data.
See the LICENSE file for details
namespace xml {
std::string get_text(const xmlNode *ptr);
bool get_bool(const xmlNode *ptr, bool default_value);
+ int get_int(const xmlNode *ptr, int default_value);
bool is_element(const xmlNode *ptr,
const std::string &ns,
const std::string &name);