Example #1
0
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();
}