- int j = 0;
- int packing = Z_SRW_recordPacking_string;
- if (start + number > rr.hits)
- number = rr.hits - start + 1;
- if (srw_req->recordPacking &&
- !strcmp(srw_req->recordPacking, "xml"))
- packing = Z_SRW_recordPacking_XML;
- srw_res->records = (Z_SRW_record *)
- odr_malloc(assoc->encode,
- number * sizeof(*srw_res->records));
- for (i = 0; i<number; i++)
- {
- int errcode;
-
- srw_res->records[j].recordPacking = packing;
- srw_res->records[j].recordData_buf = 0;
- yaz_log(LOG_DEBUG, "srw_bend_fetch %d", i+start);
- errcode = srw_bend_fetch(assoc, i+start, srw_req,
- srw_res->records + j);
- if (errcode)
- {
- srw_res->num_diagnostics = 1;
- srw_res->diagnostics = (Z_SRW_diagnostic *)
- odr_malloc(assoc->encode,
- sizeof(*srw_res->diagnostics));
- srw_res->diagnostics[0].code =
- odr_intdup(assoc->encode,
- yaz_diag_bib1_to_srw (errcode));
- srw_res->diagnostics[0].details = rr.errstring;
- break;
+ /* CQL query to backend. Wrap it - Z39.50 style */
+ ext = (Z_External *) odr_malloc(assoc->decode, sizeof(*ext));
+ ext->direct_reference = odr_getoidbystr(assoc->decode,
+ "1.2.840.10003.16.2");
+ ext->indirect_reference = 0;
+ ext->descriptor = 0;
+ ext->which = Z_External_CQL;
+ ext->u.cql = srw_req->query;
+
+ rr.query->which = Z_Query_type_104;
+ rr.query->u.type_104 = ext;
+ }
+ }
+ else if (!strcmp(srw_req->queryType, "pqf"))
+ {
+ Z_RPNQuery *RPNquery;
+ YAZ_PQF_Parser pqf_parser;
+
+ pqf_parser = yaz_pqf_create();
+
+ RPNquery = yaz_pqf_parse(pqf_parser, assoc->decode, srw_req->query);
+ if (!RPNquery)
+ {
+ const char *pqf_msg;
+ size_t off;
+ int code = yaz_pqf_error(pqf_parser, &pqf_msg, &off);
+ yaz_log(log_requestdetail, "Parse error %d %s near offset %ld",
+ code, pqf_msg, (long) off);
+ srw_error = YAZ_SRW_QUERY_SYNTAX_ERROR;
+ }
+
+ rr.query->which = Z_Query_type_1;
+ rr.query->u.type_1 = RPNquery;
+
+ yaz_pqf_destroy(pqf_parser);
+ }
+ else
+ {
+ yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics,
+ &srw_res->num_diagnostics,
+ YAZ_SRW_UNSUPP_QUERY_TYPE, 0);
+ }
+ if (rr.query->u.type_1)
+ {
+ rr.stream = assoc->encode;
+ rr.decode = assoc->decode;
+ rr.print = assoc->print;
+ if (srw_req->sort.sortKeys)
+ rr.srw_sortKeys = odr_strdup(assoc->encode,
+ srw_req->sort.sortKeys);
+ rr.association = assoc;
+ rr.hits = 0;
+ rr.errcode = 0;
+ rr.errstring = 0;
+ rr.search_info = 0;
+ rr.search_input = 0;
+
+ if (srw_req->facetList)
+ yaz_oi_set_facetlist(&rr.search_input, assoc->encode,
+ srw_req->facetList);
+
+ yaz_log_zquery_level(log_requestdetail,rr.query);
+
+ (assoc->init->bend_search)(assoc->backend, &rr);
+ if (rr.errcode)
+ {
+ if (rr.errcode == YAZ_BIB1_DATABASE_UNAVAILABLE)
+ {
+ *http_code = 404;
+ }
+ else
+ {
+ srw_error = yaz_diag_bib1_to_srw(rr.errcode);
+ yaz_add_srw_diagnostic(assoc->encode,
+ &srw_res->diagnostics,
+ &srw_res->num_diagnostics,
+ srw_error, rr.errstring);
+ }
+ }
+ else
+ {
+ int number = srw_req->maximumRecords ?
+ odr_int_to_int(*srw_req->maximumRecords) : 0;
+ int start = srw_req->startRecord ?
+ odr_int_to_int(*srw_req->startRecord) : 1;
+
+ yaz_log(log_requestdetail, "Request to pack %d+%d out of "
+ ODR_INT_PRINTF,
+ start, number, rr.hits);
+
+ srw_res->numberOfRecords = odr_intdup(assoc->encode, rr.hits);
+ if (rr.srw_setname)
+ {
+ srw_res->resultSetId =
+ odr_strdup(assoc->encode, rr.srw_setname );
+ srw_res->resultSetIdleTime =
+ odr_intdup(assoc->encode, *rr.srw_setnameIdleTime );
+ }
+
+ srw_res->facetList = yaz_oi_get_facetlist(&rr.search_info);
+ if (start > rr.hits || start < 1)
+ {
+ /* if hits<=0 and start=1 we don't return a diagnostic */
+ if (start != 1)
+ yaz_add_srw_diagnostic(
+ assoc->encode,
+ &srw_res->diagnostics, &srw_res->num_diagnostics,
+ YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0);
+ }
+ else if (number > 0)
+ {
+ int i;
+ int ok = 1;
+ if (start + number > rr.hits)
+ number = odr_int_to_int(rr.hits) - start + 1;
+
+ /* Call bend_present if defined */
+ if (assoc->init->bend_present)
+ {
+ bend_present_rr *bprr = (bend_present_rr*)
+ odr_malloc(assoc->decode, sizeof(*bprr));
+ bprr->setname = "default";
+ bprr->start = start;
+ bprr->number = number;
+ if (srw_req->recordSchema)
+ {
+ bprr->comp = (Z_RecordComposition *) odr_malloc(assoc->decode,
+ sizeof(*bprr->comp));
+ bprr->comp->which = Z_RecordComp_simple;
+ bprr->comp->u.simple = (Z_ElementSetNames *)
+ odr_malloc(assoc->decode, sizeof(Z_ElementSetNames));
+ bprr->comp->u.simple->which = Z_ElementSetNames_generic;
+ bprr->comp->u.simple->u.generic = srw_req->recordSchema;
+ }
+ else
+ {
+ bprr->comp = 0;
+ }
+ bprr->stream = assoc->encode;
+ bprr->referenceId = 0;
+ bprr->print = assoc->print;
+ bprr->association = assoc;
+ bprr->errcode = 0;
+ bprr->errstring = NULL;
+ (*assoc->init->bend_present)(assoc->backend, bprr);
+
+ if (bprr->errcode)
+ {
+ srw_error = yaz_diag_bib1_to_srw(bprr->errcode);
+ yaz_add_srw_diagnostic(assoc->encode,
+ &srw_res->diagnostics,
+ &srw_res->num_diagnostics,
+ srw_error, bprr->errstring);
+ ok = 0;
+ }