void yaz_rpnquery2xml(const Z_RPNQuery *rpn, xmlDocPtr *docp) { Z_Query query; query.which = Z_Query_type_1; query.u.type_1 = (Z_RPNQuery *) rpn; yaz_query2xml(&query, docp); }
void yf::QueryRewrite::Rep::process(mp::Package &package) const { Z_GDU *gdu = package.request().get(); if (gdu && gdu->which == Z_GDU_Z3950) { Z_APDU *apdu_req = gdu->u.z3950; if (apdu_req->which == Z_APDU_searchRequest) { int error_code = 0; const char *addinfo = 0; mp::odr odr; Z_SearchRequest *req = apdu_req->u.searchRequest; if (m_stylesheet) { xmlDocPtr doc_input = 0; yaz_query2xml(req->query, &doc_input); if (doc_input) { xmlDocPtr doc_res = xsltApplyStylesheet(m_stylesheet, doc_input, 0); if (!doc_res) { error_code = YAZ_BIB1_MALFORMED_QUERY; addinfo = "XSLT transform failed for query"; } else { const xmlNode *root_element = xmlDocGetRootElement(doc_res); yaz_xml2query(root_element, &req->query, odr, &error_code, &addinfo); xmlFreeDoc(doc_res); } xmlFreeDoc(doc_input); } } if (!error_code && charset_to.length() && charset_from.length() && (req->query->which == Z_Query_type_1 || req->query->which == Z_Query_type_101)) { yaz_iconv_t cd = yaz_iconv_open(charset_to.c_str(), charset_from.c_str()); if (cd) { int r = yaz_query_charset_convert_rpnquery_check( req->query->u.type_1, odr, cd); yaz_iconv_close(cd); if (r) { /* query could not be char converted */ error_code = YAZ_BIB1_MALFORMED_QUERY; addinfo = "could not convert query to target charset"; } } } if (error_code) { Z_APDU *f_apdu = odr.create_searchResponse(apdu_req, error_code, addinfo); package.response() = f_apdu; return; } package.request() = gdu; } } package.move(); }