void pqftoxmlquery(const char *pqf) { YAZ_PQF_Parser parser = yaz_pqf_create(); ODR odr = odr_createmem(ODR_ENCODE); Z_RPNQuery *rpn; if (!parser) { fprintf(stderr, "%s: cannot create parser\n", prog); exit(1); } if (!odr) { fprintf(stderr, "%s: cannot create parser\n", prog); exit(1); } rpn = yaz_pqf_parse(parser, odr, pqf); yaz_pqf_destroy(parser); if (!rpn) { fprintf(stderr, "%s: pqf parse error for query %s\n", prog, pqf); exit(2); } else { xmlDocPtr doc = 0; yaz_rpnquery2xml(rpn, &doc); if (!doc) { fprintf(stderr, "%s: yaz_rpnquery2xml failed for query %s\n", prog, pqf); exit(3); } else { xmlChar *buf_out = 0; int len_out = 0; xmlDocDumpMemory(doc, &buf_out, &len_out); if (!len_out || !buf_out) { fprintf(stderr, "%s: xmlDocDumpMemory failed for query %s\n", prog, pqf); exit(4); } else { if (fwrite(buf_out, len_out, 1, stdout) != 1) { fprintf(stderr, "%s: write failed\n", prog); exit(5); } } xmlFreeDoc(doc); } } odr_destroy(odr); }
enum pqf2xml_status pqf2xml_text(const char *pqf, const char *expect_xml, const char *expect_pqf) { YAZ_PQF_Parser parser = yaz_pqf_create(); ODR odr = odr_createmem(ODR_ENCODE); Z_RPNQuery *rpn; enum pqf2xml_status status = XML_NO_ERROR; YAZ_CHECK(parser); YAZ_CHECK(odr); rpn = yaz_pqf_parse(parser, odr, pqf); yaz_pqf_destroy(parser); if (!rpn) status = PQF_FAILED; else { #if YAZ_HAVE_XML2 xmlDocPtr doc = 0; yaz_rpnquery2xml(rpn, &doc); if (!doc) status = QUERY2XML_FAILED; else { char *buf_out; int len_out; xmlDocDumpMemory(doc, (xmlChar **) &buf_out, &len_out); if (len_out == (int) strlen(expect_xml) && memcmp(buf_out, expect_xml, len_out) == 0) { Z_Query *query2 = 0; int error_code = 0; const char *addinfo = 0; const xmlNode *root_element = xmlDocGetRootElement(doc); ODR odr2 = odr_createmem(ODR_ENCODE); yaz_xml2query(root_element, &query2, odr2, &error_code, &addinfo); if (error_code || !query2) status = XML_NO_MATCH; else { WRBUF w = wrbuf_alloc(); yaz_query_to_wrbuf(w, query2); if (!expect_pqf || strcmp(expect_pqf, wrbuf_cstr(w)) == 0) status = XML_MATCH; else { status = XML_NO_MATCH; printf("Result: %s\n", wrbuf_cstr(w)); } wrbuf_destroy(w); } odr_destroy(odr2); } else { printf("%.*s\n", len_out, buf_out); status = XML_NO_MATCH; } xmlFreeDoc(doc); xmlFree(buf_out); } #else status = QUERY2XML_FAILED; #endif } odr_destroy(odr); return status; }