return 0;
}
-static void srw_bend_search(association *assoc, request *req,
+static void srw_bend_search(association *assoc,
Z_SRW_PDU *sr,
Z_SRW_PDU *res,
int *http_code)
rr.errcode = 0;
rr.errstring = 0;
rr.search_info = 0;
+ rr.search_input = 0;
yaz_log_zquery_level(log_requestdetail,rr.query);
(assoc->init->bend_search)(assoc->backend, &rr);
(srw_res->numberOfRecords ?
*srw_res->numberOfRecords : 0));
}
- wrbuf_printf(wr, " %s " ODR_INT_PRINTF " +%d",
+ wrbuf_printf(wr, " %s " ODR_INT_PRINTF "+%d",
(srw_res->resultSetId ?
srw_res->resultSetId : "-"),
(srw_req->startRecord ? *srw_req->startRecord : 1),
}
}
-static char *srw_bend_explain_default(void *handle, bend_explain_rr *rr)
+static char *srw_bend_explain_default(bend_explain_rr *rr)
{
#if YAZ_HAVE_XML2
xmlNodePtr ptr = (xmlNode *) rr->server_node_ptr;
return 0;
}
-static void srw_bend_explain(association *assoc, request *req,
+static void srw_bend_explain(association *assoc,
Z_SRW_PDU *sr,
Z_SRW_explainResponse *srw_res,
int *http_code)
if (assoc->init->bend_explain)
(*assoc->init->bend_explain)(assoc->backend, &rr);
else
- srw_bend_explain_default(assoc->backend, &rr);
+ srw_bend_explain_default(&rr);
if (rr.explain_buf)
{
}
}
-static void srw_bend_scan(association *assoc, request *req,
+static void srw_bend_scan(association *assoc,
Z_SRW_PDU *sr,
Z_SRW_scanResponse *srw_res,
int *http_code)
}
-static void srw_bend_update(association *assoc, request *req,
+static void srw_bend_update(association *assoc,
Z_SRW_PDU *sr,
Z_SRW_updateResponse *srw_res,
int *http_code)
}
else
{
- srw_bend_search(assoc, req, sr, res, &http_code);
+ srw_bend_search(assoc, sr, res, &http_code);
}
if (http_code == 200)
soap_package->u.generic->p = res;
res->u.explain_response->diagnostics = diagnostic;
res->u.explain_response->num_diagnostics = num_diagnostic;
}
- srw_bend_explain(assoc, req, sr,
- res->u.explain_response, &http_code);
+ srw_bend_explain(assoc, sr, res->u.explain_response, &http_code);
if (http_code == 200)
soap_package->u.generic->p = res;
}
res->u.scan_response->diagnostics = diagnostic;
res->u.scan_response->num_diagnostics = num_diagnostic;
}
- srw_bend_scan(assoc, req, sr,
- res->u.scan_response, &http_code);
+ srw_bend_scan(assoc, sr, res->u.scan_response, &http_code);
if (http_code == 200)
soap_package->u.generic->p = res;
}
res->u.update_response->num_diagnostics = num_diagnostic;
}
yaz_log(YLOG_DEBUG, "num_diag = %d", res->u.update_response->num_diagnostics );
- srw_bend_update(assoc, req, sr,
- res->u.update_response, &http_code);
+ srw_bend_update(assoc, sr, res->u.update_response, &http_code);
if (http_code == 200)
soap_package->u.generic->p = res;
}
}
else
{
- yaz_log(YLOG_DEBUG, " result unavailble");
+ yaz_log(YLOG_DEBUG, " result unavailable");
retval = -1;
}
return retval;
*/
static int process_z_response(association *assoc, request *req, Z_APDU *res)
{
- Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*res));
+ Z_GDU *gres = (Z_GDU *) odr_malloc(assoc->encode, sizeof(*gres));
gres->which = Z_GDU_Z3950;
gres->u.z3950 = res;
yaz_log(log_requestdetail, "Config: %s",
cb->configname);
- iochan_settimeout(assoc->client_chan, cb->idle_timeout * 60);
+ iochan_settimeout(assoc->client_chan, cb->idle_timeout);
/* we have a backend control block, so call that init function */
if (!(binitres = (*cb->bend_init)(assoc->init)))
(Z_Records *) odr_malloc(a->encode, sizeof(*records));
Z_NamePlusRecordList *reclist =
(Z_NamePlusRecordList *) odr_malloc(a->encode, sizeof(*reclist));
- Z_NamePlusRecord **list =
- (Z_NamePlusRecord **) odr_malloc(a->encode, sizeof(*list) * toget);
records->which = Z_Records_DBOSD;
records->u.databaseOrSurDiagnostics = reclist;
reclist->num_records = 0;
- reclist->records = list;
+
+ if (toget < 0)
+ return diagrec(a, YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE, 0);
+ else if (toget == 0)
+ reclist->records = odr_nullval();
+ else
+ reclist->records = (Z_NamePlusRecord **)
+ odr_malloc(a->encode, sizeof(*reclist->records) * toget);
+
*pres = Z_PresentStatus_success;
*num = 0;
*next = 0;
{
yaz_log(log_requestdetail, " Dropped last normal-sized record");
*pres = Z_PresentStatus_partial_2;
+ if (*next > 0)
+ (*next)--;
break;
}
/* record can only be fetched by itself */
{
yaz_log(YLOG_DEBUG, " Dropped it");
reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 16, 0);
+ surrogatediagrec(
+ a, freq.basename,
+ YAZ_BIB1_RECORD_EXCEEDS_PREFERRED_MESSAGE_SIZE, 0);
reclist->num_records++;
dumped_records += this_length;
continue;
"this=%d max=%d",
this_length, a->maximumRecordSize);
reclist->records[reclist->num_records] =
- surrogatediagrec(a, freq.basename, 17, 0);
+ surrogatediagrec(
+ a, freq.basename,
+ YAZ_BIB1_RECORD_EXCEEDS_MAXIMUM_RECORD_SIZE, 0);
reclist->num_records++;
dumped_records += this_length;
continue;
thisrec->which = Z_NamePlusRecord_databaseRecord;
if (!freq.output_format)
- freq.output_format = freq.request_format;
+ {
+ yaz_log(YLOG_WARN, "bend_fetch output_format not set");
+ return 0;
+ }
thisrec->u.databaseRecord = z_ext_record_oid(
a->encode, freq.output_format, freq.record, freq.len);
if (!thisrec->u.databaseRecord)
bsrr->errcode = 0;
bsrr->errstring = NULL;
bsrr->search_info = NULL;
+ bsrr->search_input = req->otherInfo;
if (assoc->server && assoc->server->cql_transform
&& req->query->which == Z_Query_type_104