23 #include <metaproxy/package.hpp>
24 #include <metaproxy/util.hpp>
30 #include <yaz/pquery.h>
31 #include <yaz/oid_db.h>
33 #include <yaz/otherinfo.h>
34 #include <yaz/facet.h>
36 #include <boost/thread/mutex.hpp>
37 #include <boost/thread/condition.hpp>
46 namespace yf = mp::filter;
61 void process(metaproxy_1::Package &package);
75 void sru(metaproxy_1::Package &package, Z_GDU *zgdu_req);
77 mp::odr &odr_en, Z_Query *z_query,
78 const Z_SRW_searchRetrieveRequest *req
85 Z_SRW_PDU *sru_pdu_res,
86 const Z_SRW_PDU *sru_pdu_req
93 mp::Package &z3950_package,
95 Z_SRW_PDU *sru_pdu_res,
96 Z_SRW_searchRetrieveRequest
const *sr_req,
102 mp::Package &package,
104 Z_SRW_PDU *sru_pdu_res,
105 Z_SRW_searchRetrieveRequest
const *sr_req
110 Z_SRW_searchRetrieveResponse *srw_res,
116 Z_SRW_searchRetrieveResponse *srw_res,
117 Z_DefaultDiagFormat *ddf
124 yf::SRUtoZ3950::SRUtoZ3950() : m_p(new
Impl)
128 yf::SRUtoZ3950::~SRUtoZ3950()
132 void yf::SRUtoZ3950::configure(
const xmlNode *xmlnode,
bool test_only,
135 m_p->configure(xmlnode);
138 void yf::SRUtoZ3950::process(mp::Package &package)
const
140 m_p->process(package);
143 yf::SRUtoZ3950::Impl::Impl()
148 void yf::SRUtoZ3950::Impl::configure(
const xmlNode *confignode)
150 const xmlNode * dbnode;
152 for (dbnode = confignode->children; dbnode; dbnode = dbnode->next)
154 if (dbnode->type != XML_ELEMENT_NODE)
157 if (!strcmp((
const char *) dbnode->name,
"database"))
159 std::string database;
161 for (
struct _xmlAttr *attr = dbnode->properties;
162 attr; attr = attr->next)
164 mp::xml::check_attribute(attr,
"",
"name");
165 database = mp::xml::get_text(attr);
167 const xmlNode *explainnode;
168 for (explainnode = dbnode->children;
169 explainnode; explainnode = explainnode->next)
171 if (explainnode->type == XML_ELEMENT_NODE)
173 m_database_explain.insert(
174 std::make_pair(database, explainnode));
180 else if (!strcmp((
const char *) dbnode->name,
"stylesheet"))
182 default_stylesheet = mp::xml::get_text(dbnode);
184 else if (!strcmp((
const char *) dbnode->name,
"limit"))
186 const struct _xmlAttr *attr;
187 for (attr = dbnode->properties; attr; attr = attr->next)
189 if (!strcmp((
const char *) attr->name,
"retrieve"))
191 mp::xml::get_int(attr->children, 0);
193 throw mp::filter::FilterException(
194 "Bad attribute " + std::string((
const char *)
200 throw mp::filter::FilterException
202 + std::string((
const char *) dbnode->name)
209 void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req)
213 mp::odr odr_de(ODR_DECODE);
214 Z_SRW_PDU *sru_pdu_req = 0;
216 mp::odr odr_en(ODR_ENCODE);
220 std::map<std::string, const xmlNode *>::iterator idbexp;
221 idbexp = m_database_explain.find(sruinfo.
database);
224 const xmlNode *explainnode = 0;
225 if (idbexp != m_database_explain.end())
227 explainnode = idbexp->second;
233 const char *stylesheet = 0;
234 Z_SRW_diagnostic *diagnostic = 0;
235 int num_diagnostic = 0;
240 &num_diagnostic, &soap,
245 Z_SRW_PDU *sru_pdu_res = yaz_srw_get(odr_en,
246 Z_SRW_explain_response);
247 sru_pdu_res->u.explain_response->diagnostics = diagnostic;
248 sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
250 sruinfo, explainnode);
252 sru_pdu_res, charset, stylesheet);
256 metaproxy_1::odr odr;
258 odr.create_HTTP_Response(package.session(),
259 zgdu_req->u.HTTP_Request, 400);
260 package.response() = zgdu_res;
265 bool enable_package_log =
false;
268 Z_SRW_extra_arg *arg;
270 for ( arg = sru_pdu_req->extra_args; arg; arg = arg->next)
271 if (!strcmp(arg->name,
"x-target"))
273 zurl = std::string(arg->value);
275 else if (!strcmp(arg->name,
"x-max-sockets"))
277 package.origin().set_max_sockets(atoi(arg->value));
279 else if (!strcmp(arg->name,
"x-session-id"))
281 package.origin().set_custom_session(arg->value);
283 else if (!strcmp(arg->name,
"x-log-enable"))
285 if (*arg->value ==
'1')
287 enable_package_log =
true;
288 package.log_enable();
291 else if (!strncmp(arg->name,
"x-client-", 9) && arg->value)
295 dbargs += mp_util::uri_encode(arg->name + 9);
297 dbargs += mp_util::uri_encode(arg->value);
302 Package z3950_package(package.session(), package.origin());
303 z3950_package.copy_filter(package);
305 Z_SRW_PDU *sru_pdu_res = 0;
306 if (sru_pdu_req->which == Z_SRW_explain_request)
308 Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request;
309 stylesheet = er_req->stylesheet;
310 sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_explain_response,
312 sru_pdu_res->u.explain_response->diagnostics = diagnostic;
313 sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
315 sruinfo, explainnode, er_req);
317 else if (sru_pdu_req->which == Z_SRW_searchRetrieve_request)
319 Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
320 stylesheet = sr_req->stylesheet;
321 sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_searchRetrieve_response,
323 sru_pdu_res->u.response->diagnostics = diagnostic;
324 sru_pdu_res->u.response->num_diagnostics = num_diagnostic;
328 sru_pdu_res, sr_req);
330 if (ok && z3950_init_request(package, odr_en,
331 zurl, sru_pdu_res, sru_pdu_req))
333 ok = z3950_search_request(package, z3950_package, odr_en,
334 sru_pdu_res, sr_req, zurl, dbargs);
337 && sru_pdu_res->u.response->numberOfRecords
338 && *(sru_pdu_res->u.response->numberOfRecords))
340 ok = z3950_present_request(package, odr_en,
343 z3950_close_request(package);
346 else if (sru_pdu_req->which == Z_SRW_scan_request)
348 stylesheet = sru_pdu_req->u.scan_request->stylesheet;
349 sru_pdu_res = yaz_srw_get_pdu_e(odr_en, Z_SRW_scan_response,
351 sru_pdu_res->u.scan_response->diagnostics = diagnostic;
352 sru_pdu_res->u.scan_response->num_diagnostics = num_diagnostic;
355 yaz_add_srw_diagnostic(odr_en,
356 &sru_pdu_res->u.scan_response->diagnostics,
357 &sru_pdu_res->u.scan_response->num_diagnostics,
358 YAZ_SRW_UNSUPP_OPERATION,
"scan");
363 yaz_srw_get_pdu_e(odr_en, Z_SRW_explain_response, sru_pdu_req);
364 sru_pdu_res->u.explain_response->diagnostics = diagnostic;
365 sru_pdu_res->u.explain_response->num_diagnostics = num_diagnostic;
366 yaz_add_srw_diagnostic(odr_en, &diagnostic, &num_diagnostic,
367 YAZ_SRW_UNSUPP_OPERATION,
"unknown");
369 if (enable_package_log)
372 package.log_reset(l);
377 wrbuf_puts(w,
"<log>\n");
378 wrbuf_xmlputs(w, l.c_str());
379 wrbuf_puts(w,
"</log>");
381 sru_pdu_res->extraResponseData_len = w.len();
382 sru_pdu_res->extraResponseData_buf =
383 odr_strdup(odr_en, wrbuf_cstr(w));
386 if (!stylesheet && default_stylesheet.length())
387 stylesheet = default_stylesheet.c_str();
391 sru_pdu_res, charset, stylesheet);
395 yf::SRUtoZ3950::Frontend::Frontend() : m_in_use(true)
399 yf::SRUtoZ3950::Frontend::~Frontend()
404 yf::SRUtoZ3950::FrontendPtr yf::SRUtoZ3950::Impl::get_frontend(
405 mp::Package &package)
407 boost::mutex::scoped_lock lock(m_mutex_session);
409 std::map<mp::Session,yf::SRUtoZ3950::FrontendPtr>::iterator it;
413 it = m_clients.find(package.session());
414 if (it == m_clients.end())
417 if (!it->second->m_in_use)
419 it->second->m_in_use =
true;
422 m_cond_session_ready.wait(lock);
425 m_clients[package.session()] = f;
430 void yf::SRUtoZ3950::Impl::release_frontend(mp::Package &package)
432 boost::mutex::scoped_lock lock(m_mutex_session);
433 std::map<mp::Session,FrontendPtr>::iterator it;
435 it = m_clients.find(package.session());
436 if (it != m_clients.end())
438 if (package.session().is_closed())
444 it->second->m_in_use =
false;
446 m_cond_session_ready.notify_all();
450 void yf::SRUtoZ3950::Impl::process(mp::Package &package)
454 Z_GDU *zgdu_req = package.request().get();
456 if (zgdu_req && zgdu_req->which == Z_GDU_HTTP_Request)
458 sru(package, zgdu_req);
464 release_frontend(package);
468 yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
471 Z_SRW_PDU *sru_pdu_res,
472 const Z_SRW_PDU *sru_pdu_req)
const
475 Package z3950_package(package.session(), package.origin());
476 z3950_package.copy_filter(package);
479 Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_initRequest);
480 Z_InitRequest *init_req = apdu->u.initRequest;
482 Z_IdAuthentication *auth = NULL;
483 if (sru_pdu_req->username && !sru_pdu_req->password)
485 auth = (Z_IdAuthentication *) odr_malloc(odr_en,
sizeof(Z_IdAuthentication));
486 auth->which = Z_IdAuthentication_open;
487 auth->u.open = odr_strdup(odr_en, sru_pdu_req->username);
489 else if (sru_pdu_req->username && sru_pdu_req->password)
491 auth = (Z_IdAuthentication *) odr_malloc(odr_en,
sizeof(Z_IdAuthentication));
492 auth->which = Z_IdAuthentication_idPass;
493 auth->u.idPass = (Z_IdPass *) odr_malloc(odr_en,
sizeof(Z_IdPass));
494 auth->u.idPass->groupId = NULL;
495 auth->u.idPass->password = odr_strdup(odr_en, sru_pdu_req->password);
496 auth->u.idPass->userId = odr_strdup(odr_en, sru_pdu_req->username);
499 init_req->idAuthentication = auth;
501 *init_req->preferredMessageSize = 10*1024*1024;
502 *init_req->maximumRecordSize = 10*1024*1024;
504 ODR_MASK_SET(init_req->options, Z_Options_search);
505 ODR_MASK_SET(init_req->options, Z_Options_present);
506 ODR_MASK_SET(init_req->options, Z_Options_namedResultSets);
507 ODR_MASK_SET(init_req->options, Z_Options_scan);
509 ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_1);
510 ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_2);
511 ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_3);
516 std::list<std::string> dblist;
517 mp_util::split_zurl(zurl, host, dblist);
518 mp_util::set_vhost_otherinfo(&init_req->otherInfo, odr_en, host, 1);
521 Z_GDU *zgdu_req = package.request().get();
522 if (zgdu_req->which == Z_GDU_HTTP_Request)
524 Z_HTTP_Request *hreq = zgdu_req->u.HTTP_Request;
525 const char *peer_name =
526 z_HTTP_header_lookup(hreq->headers,
"X-Forwarded-For");
529 yaz_oi_set_string_oid(&init_req->otherInfo, odr_en,
530 yaz_oid_userinfo_client_ip, 1, peer_name);
534 z3950_package.request() = apdu;
537 z3950_package.move();
540 Z_GDU *z3950_gdu = z3950_package.response().get();
542 int error = YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE;
543 const char *addinfo = 0;
544 if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950
545 && z3950_gdu->u.z3950->which == Z_APDU_initResponse)
547 Z_InitResponse *initrs = z3950_gdu->u.z3950->u.initResponse;
553 Z_DefaultDiagFormat *df = yaz_decode_init_diag(no, initrs);
557 yaz_add_srw_diagnostic(odr_en,
558 &(sru_pdu_res->u.response->diagnostics),
559 &(sru_pdu_res->u.response->num_diagnostics),
560 yaz_diag_bib1_to_srw(*df->condition),
568 error = YAZ_SRW_AUTHENTICATION_ERROR;
571 addinfo =
"sru_z3950: expected initResponse";
572 yaz_add_srw_diagnostic(odr_en,
573 &(sru_pdu_res->u.response->diagnostics),
574 &(sru_pdu_res->u.response->num_diagnostics),
579 bool yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package)
const
581 Package z3950_package(package.session(), package.origin());
582 z3950_package.copy_filter(package);
583 z3950_package.session().close();
585 z3950_package.move();
587 if (z3950_package.session().is_closed())
594 bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
595 mp::Package &z3950_package,
597 Z_SRW_PDU *sru_pdu_res,
598 Z_SRW_searchRetrieveRequest
601 std::string dbappend)
const
604 assert(sru_pdu_res->u.response);
606 Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_searchRequest);
607 Z_SearchRequest *z_searchRequest = apdu->u.searchRequest;
609 if (!mp_util::set_databases_from_zurl(odr_en, zurl,
610 &z_searchRequest->num_databaseNames,
611 &z_searchRequest->databaseNames))
615 if (sr_req->database)
616 db = sr_req->database;
620 if (dbappend.length())
625 z_searchRequest->num_databaseNames = 1;
626 z_searchRequest->databaseNames = (
char**)
627 odr_malloc(odr_en,
sizeof(
char *));
628 z_searchRequest->databaseNames[0] = odr_strdup(odr_en, db.c_str());
630 if (sr_req->facetList)
632 Z_OtherInformation **oi = &z_searchRequest->additionalSearchInfo;
633 yaz_oi_set_facetlist(oi, odr_en, sr_req->facetList);
635 Z_Query *z_query = (Z_Query *) odr_malloc(odr_en,
sizeof(Z_Query));
636 z_searchRequest->query = z_query;
638 int sru_diagnostic = z3950_build_query(odr_en, z_query, sr_req);
641 yaz_add_srw_diagnostic(odr_en,
642 &(sru_pdu_res->u.response->diagnostics),
643 &(sru_pdu_res->u.response->num_diagnostics),
649 z3950_package.request() = apdu;
651 z3950_package.move();
653 Z_GDU *z3950_gdu = z3950_package.response().get();
655 if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950
656 || z3950_gdu->u.z3950->which != Z_APDU_searchResponse
657 || !z3950_gdu->u.z3950->u.searchResponse
658 || !z3950_gdu->u.z3950->u.searchResponse->searchStatus)
660 yaz_add_srw_diagnostic(odr_en,
661 &(sru_pdu_res->u.response->diagnostics),
662 &(sru_pdu_res->u.response->num_diagnostics),
663 YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0);
667 Z_SearchResponse *sr = z3950_gdu->u.z3950->u.searchResponse;
669 if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response,
674 Z_FacetList *fl = yaz_oi_get_facetlist(&sr->additionalSearchInfo);
676 fl = yaz_oi_get_facetlist(&sr->otherInfo);
677 sru_pdu_res->u.response->facetList = fl;
678 sru_pdu_res->u.response->numberOfRecords
679 = odr_intdup(odr_en, *sr->resultCount);
683 bool yf::SRUtoZ3950::Impl::z3950_present_request(
684 mp::Package &package,
686 Z_SRW_PDU *sru_pdu_res,
687 const Z_SRW_searchRetrieveRequest *sr_req)
690 assert(sru_pdu_res->u.response);
697 if (sr_req->maximumRecords)
698 max_recs = *sr_req->maximumRecords;
699 if (sr_req->startRecord)
700 start = *sr_req->startRecord;
706 bool send_z3950_present =
true;
709 if (sr_req->recordXPath)
711 send_z3950_present =
false;
712 yaz_add_srw_diagnostic(odr_en,
713 &(sru_pdu_res->u.response->diagnostics),
714 &(sru_pdu_res->u.response->num_diagnostics),
715 YAZ_SRW_XPATH_RETRIEVAL_UNSUPP, 0);
720 if (sr_req->resultSetTTL)
722 send_z3950_present =
false;
723 yaz_add_srw_diagnostic(odr_en,
724 &(sru_pdu_res->u.response->diagnostics),
725 &(sru_pdu_res->u.response->num_diagnostics),
726 YAZ_SRW_RESULT_SETS_UNSUPP, 0);
730 if (sr_req->sort_type != Z_SRW_sort_type_none)
732 send_z3950_present =
false;
733 yaz_add_srw_diagnostic(odr_en,
734 &(sru_pdu_res->u.response->diagnostics),
735 &(sru_pdu_res->u.response->num_diagnostics),
736 YAZ_SRW_SORT_UNSUPP, 0);
740 if (start < 0 || start > *sru_pdu_res->u.response->numberOfRecords)
742 send_z3950_present =
false;
743 yaz_add_srw_diagnostic(odr_en,
744 &(sru_pdu_res->u.response->diagnostics),
745 &(sru_pdu_res->u.response->num_diagnostics),
746 YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0);
752 send_z3950_present =
false;
753 yaz_add_srw_diagnostic(odr_en,
754 &(sru_pdu_res->u.response->diagnostics),
755 &(sru_pdu_res->u.response->num_diagnostics),
756 YAZ_SRW_UNSUPP_PARAMETER_VALUE,
761 if (!send_z3950_present)
764 if (conf_max_recs > 0 && max_recs > conf_max_recs)
765 max_recs = conf_max_recs;
767 if (max_recs > *sru_pdu_res->u.response->numberOfRecords - start)
768 max_recs = *sru_pdu_res->u.response->numberOfRecords - start + 1;
770 Z_SRW_searchRetrieveResponse *sru_res = sru_pdu_res->u.response;
771 sru_res->records = (Z_SRW_record *)
772 odr_malloc(odr_en, max_recs *
sizeof(Z_SRW_record));
774 while (num < max_recs)
777 Package z3950_package(package.session(), package.origin());
778 z3950_package.copy_filter(package);
779 Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_presentRequest);
781 assert(apdu->u.presentRequest);
783 *apdu->u.presentRequest->resultSetStartPoint = start + num;
784 *apdu->u.presentRequest->numberOfRecordsRequested = max_recs - num;
787 int record_packing = Z_SRW_recordPacking_XML;
788 if (sr_req->recordPacking &&
's' == *(sr_req->recordPacking))
789 record_packing = Z_SRW_recordPacking_string;
792 apdu->u.presentRequest->preferredRecordSyntax
793 = odr_oiddup(odr_en, yaz_oid_recsyn_xml);
796 if (sr_req->recordSchema)
798 apdu->u.presentRequest->recordComposition
799 = (Z_RecordComposition *)
800 odr_malloc(odr_en,
sizeof(Z_RecordComposition));
801 apdu->u.presentRequest->recordComposition->which
802 = Z_RecordComp_simple;
803 apdu->u.presentRequest->recordComposition->u.simple
806 sr_req->recordSchema);
810 z3950_package.request() = apdu;
813 z3950_package.move();
816 Z_GDU *z3950_gdu = z3950_package.response().get();
817 if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950
818 || z3950_gdu->u.z3950->which != Z_APDU_presentResponse
819 || !z3950_gdu->u.z3950->u.presentResponse)
822 yaz_add_srw_diagnostic(odr_en,
823 &(sru_pdu_res->u.response->diagnostics),
824 &(sru_pdu_res->u.response->num_diagnostics),
825 YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0);
830 Z_PresentResponse *pr = z3950_gdu->u.z3950->u.presentResponse;
833 if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response,
838 if (!pr->records || pr->records->which != Z_Records_DBOSD)
844 pr->records->u.databaseOrSurDiagnostics->num_records;
845 for (
int i = 0; i < returned_recs; i++)
847 int position = i + *apdu->u.presentRequest->resultSetStartPoint;
848 Z_NamePlusRecord *npr
849 = pr->records->u.databaseOrSurDiagnostics->records[i];
851 sru_res->records[i + num].recordPacking = record_packing;
853 if (npr->which == Z_NamePlusRecord_surrogateDiagnostic)
855 Z_DiagRec *p = npr->u.surrogateDiagnostic;
856 if (p->which == Z_DiagRec_defaultFormat)
858 Z_DefaultDiagFormat *df = p->u.defaultFormat;
859 int c = yaz_diag_bib1_to_srw(*df->condition);
861 yaz_mk_sru_surrogate(
862 odr_en, sru_res->records + i + num, position,
867 yaz_mk_sru_surrogate(
868 odr_en, sru_res->records + i + num, position,
869 YAZ_SRW_RECORD_TEMPORARILY_UNAVAILABLE, 0);
872 else if (npr->which == Z_NamePlusRecord_databaseRecord &&
873 npr->u.databaseRecord->direct_reference
874 && !oid_oidcmp(npr->u.databaseRecord->direct_reference,
878 Z_External *r = npr->u.databaseRecord;
879 sru_res->records[i + num].recordPosition =
880 odr_intdup(odr_en, position);
881 sru_res->records[i + num].recordSchema = sr_req->recordSchema;
882 sru_res->records[i + num].recordData_buf
883 = odr_strdupn(odr_en,
884 (
const char *)r->u.octet_aligned->buf,
885 r->u.octet_aligned->len);
886 sru_res->records[i + num].recordData_len
887 = r->u.octet_aligned->len;
892 yaz_mk_sru_surrogate(
893 odr_en, sru_res->records + i + num, position,
894 YAZ_SRW_RECORD_NOT_AVAILABLE_IN_THIS_SCHEMA, 0);
897 num += returned_recs;
900 sru_res->num_records = num;
901 if (start - 1 + num < *sru_pdu_res->u.response->numberOfRecords)
902 sru_res->nextRecordPosition =
903 odr_intdup(odr_en, start + num);
907 int yf::SRUtoZ3950::Impl::z3950_build_query(
908 mp::odr &odr_en, Z_Query *z_query,
909 const Z_SRW_searchRetrieveRequest *req
912 if (!strcmp(req->queryType,
"cql"))
914 Z_External *ext = (Z_External *)
915 odr_malloc(odr_en,
sizeof(*ext));
916 ext->direct_reference =
917 odr_getoidbystr(odr_en,
"1.2.840.10003.16.2");
918 ext->indirect_reference = 0;
920 ext->which = Z_External_CQL;
921 ext->u.cql = odr_strdup(odr_en, req->query);
923 z_query->which = Z_Query_type_104;
924 z_query->u.type_104 = ext;
928 if (!strcmp(req->queryType,
"pqf"))
930 Z_RPNQuery *RPNquery;
931 YAZ_PQF_Parser pqf_parser;
933 pqf_parser = yaz_pqf_create ();
935 RPNquery = yaz_pqf_parse (pqf_parser, odr_en, req->query);
936 yaz_pqf_destroy(pqf_parser);
939 return YAZ_SRW_QUERY_SYNTAX_ERROR;
941 z_query->which = Z_Query_type_1;
942 z_query->u.type_1 = RPNquery;
947 if (!strcmp(req->queryType,
"ccl"))
949 z_query->which = Z_Query_type_2;
950 z_query->u.type_2 = odr_create_Odr_oct(odr_en, req->query,
955 return YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED;
958 bool yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(
960 Z_SRW_searchRetrieveResponse
962 Z_Records *records)
const
966 && records->which == Z_Records_NSD
967 && records->u.nonSurrogateDiagnostic)
969 z3950_to_srw_diag(odr_en, sru_res,
970 records->u.nonSurrogateDiagnostic);
976 int yf::SRUtoZ3950::Impl::z3950_to_srw_diag(
978 Z_SRW_searchRetrieveResponse *sru_res,
979 Z_DefaultDiagFormat *ddf)
const
981 int bib1_code = *ddf->condition;
982 sru_res->num_diagnostics = 1;
983 sru_res->diagnostics = (Z_SRW_diagnostic *)
984 odr_malloc(odr_en,
sizeof(*sru_res->diagnostics));
985 yaz_mk_std_diagnostic(odr_en, sru_res->diagnostics,
986 yaz_diag_bib1_to_srw(bib1_code),
993 return new mp::filter::SRUtoZ3950;
struct metaproxy_1_filter_struct metaproxy_1_filter_sru_z3950
static mp::filter::Base * filter_creator()