21 #include <metaproxy/package.hpp>
22 #include <metaproxy/util.hpp>
27 #include <yaz/z-core.h>
29 #include <yaz/pquery.h>
31 #include <boost/thread/mutex.hpp>
41 namespace yf = mp::filter;
49 void process(metaproxy_1::Package &package);
56 yf::ZeeRexExplain::ZeeRexExplain() : m_p(new
Impl)
60 yf::ZeeRexExplain::~ZeeRexExplain()
64 void yf::ZeeRexExplain::configure(
const xmlNode *xmlnode,
bool test_only,
67 m_p->configure(xmlnode);
70 void yf::ZeeRexExplain::process(mp::Package &package)
const
72 m_p->process(package);
75 void yf::ZeeRexExplain::Impl::configure(
const xmlNode *confignode)
77 const xmlNode * dbnode;
79 for (dbnode = confignode->children; dbnode; dbnode = dbnode->next){
80 if (dbnode->type != XML_ELEMENT_NODE)
84 mp::xml::check_element_mp(dbnode,
"database");
86 for (
struct _xmlAttr *attr = dbnode->properties;
87 attr; attr = attr->next){
89 mp::xml::check_attribute(attr,
"",
"name");
90 database = mp::xml::get_text(attr);
92 std::cout << database <<
"\n";
94 const xmlNode *explainnode;
95 for (explainnode = dbnode->children;
96 explainnode; explainnode = explainnode->next){
97 if (explainnode->type != XML_ELEMENT_NODE)
103 m_database_explain.insert(std::make_pair(database, explainnode));
109 void yf::ZeeRexExplain::Impl::process(mp::Package &package)
111 Z_GDU *zgdu_req = package.request().get();
114 if (!zgdu_req || !(zgdu_req->which == Z_GDU_HTTP_Request)){
121 mp::odr odr_de(ODR_DECODE);
122 Z_SRW_PDU *sru_pdu_req = 0;
124 mp::odr odr_en(ODR_ENCODE);
126 Z_SRW_PDU *sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response);
131 const xmlNode *explainnode = 0;
132 std::map<std::string, const xmlNode *>::iterator idbexp;
133 idbexp = m_database_explain.find(sruinfo.
database);
136 if (idbexp != m_database_explain.end()){
138 explainnode = idbexp->second;
153 char *stylesheet = 0;
154 Z_SRW_diagnostic *diagnostic = 0;
155 int num_diagnostic = 0;
158 package, odr_de, odr_en,
159 &diagnostic, &num_diagnostic, &soap,
163 sruinfo, explainnode);
165 sru_pdu_res, charset, stylesheet);
166 package.session().close();
171 if (sru_pdu_req->which != Z_SRW_explain_request)
180 Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
182 sru_pdu_res->u.explain_response->diagnostics = diagnostic;
183 sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
187 sruinfo, explainnode, er_req);
189 sru_pdu_res, charset, stylesheet);
194 package.session().close();
202 return new mp::filter::ZeeRexExplain;
struct metaproxy_1_filter_struct metaproxy_1_filter_zeerex_explain
static mp::filter::Base * filter_creator()