#include <libxml/tree.h>
#endif
+#include <yaz/facet.h>
#include <yaz/xmalloc.h>
#include <yaz/comstack.h>
#include "eventl.h"
Z_OPACRecord *opac = 0;
if (yaz_xml_to_opac(mt, wrbuf_buf(output_record),
wrbuf_len(output_record),
- &opac, 0 /* iconv */, rr->stream->mem)
+ &opac, 0 /* iconv */, rr->stream->mem, 0)
&& opac)
{
rr->len = -1;
if (r)
{
rr->errcode = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
+ rr->surrogate_flag = 1;
if (details)
rr->errstring = odr_strdup(rr->stream, details);
}
rr.present_number = srw_req->maximumRecords ?
*srw_req->maximumRecords : 0;
- if (srw_req->query_type == Z_SRW_query_type_cql)
+ if (!srw_req->queryType || !strcmp(srw_req->queryType, "cql"))
{
if (assoc->server && assoc->server->cql_transform)
{
- int srw_errcode = cql2pqf(assoc->encode, srw_req->query.cql,
+ int srw_errcode = cql2pqf(assoc->encode, srw_req->query,
assoc->server->cql_transform,
rr.query,
&rr.srw_sortKeys);
ext->indirect_reference = 0;
ext->descriptor = 0;
ext->which = Z_External_CQL;
- ext->u.cql = srw_req->query.cql;
+ ext->u.cql = srw_req->query;
rr.query->which = Z_Query_type_104;
rr.query->u.type_104 = ext;
}
}
- else if (srw_req->query_type == Z_SRW_query_type_pqf)
+ 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.pqf);
+ RPNquery = yaz_pqf_parse(pqf_parser, assoc->decode, srw_req->query);
if (!RPNquery)
{
const char *pqf_msg;
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);
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 */
res->extraResponseData_buf = rr.extra_response_data;
res->extraResponseData_len = strlen(rr.extra_response_data);
}
- if (rr.estimated_hit_count || rr.partial_resultset)
+ if (strcmp(res->srw_version, "2.") > 0)
+ {
+ if (rr.estimated_hit_count)
+ srw_res->resultCountPrecision =
+ odr_strdup(assoc->encode, "estimate");
+ else if (rr.partial_resultset)
+ srw_res->resultCountPrecision =
+ odr_strdup(assoc->encode, "minimum");
+ else
+ srw_res->resultCountPrecision =
+ odr_strdup(assoc->encode, "exact");
+ }
+ else if (rr.estimated_hit_count || rr.partial_resultset)
{
yaz_add_srw_diagnostic(
assoc->encode,
}
if (log_request)
{
- const char *querystr = "?";
- const char *querytype = "?";
WRBUF wr = wrbuf_alloc();
- switch (srw_req->query_type)
- {
- case Z_SRW_query_type_cql:
- querytype = "CQL";
- querystr = srw_req->query.cql;
- break;
- case Z_SRW_query_type_pqf:
- querytype = "PQF";
- querystr = srw_req->query.pqf;
- break;
- }
wrbuf_printf(wr, "SRWSearch %s ", srw_req->database);
if (srw_res->num_diagnostics)
wrbuf_printf(wr, "ERROR %s", srw_res->diagnostics[0].uri);
srw_res->resultSetId : "-"),
(srw_req->startRecord ? *srw_req->startRecord : 1),
srw_res->num_records);
- yaz_log(log_request, "%s %s: %s", wrbuf_cstr(wr), querytype, querystr);
+ yaz_log(log_request, "%s %s: %s", wrbuf_cstr(wr), srw_req->queryType,
+ srw_req->query);
wrbuf_destroy(wr);
}
}
{
Z_SRW_explainRequest *srw_req = sr->u.explain_request;
yaz_log(log_requestdetail, "Got SRW ExplainRequest");
- *http_code = 404;
srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr);
+ if (!assoc->init && srw_res->num_diagnostics == 0)
+ *http_code = 404;
if (assoc->init)
{
bend_explain_rr rr;
static void srw_bend_scan(association *assoc,
Z_SRW_PDU *sr,
- Z_SRW_scanResponse *srw_res,
+ Z_SRW_PDU *res,
int *http_code)
{
Z_SRW_scanRequest *srw_req = sr->u.scan_request;
+ Z_SRW_scanResponse *srw_res = res->u.scan_response;
yaz_log(log_requestdetail, "Got SRW ScanRequest");
*http_code = 200;
bsrr->step_size = &step_size;
bsrr->entries = 0;
bsrr->setname = 0;
+ bsrr->extra_args = sr->extra_args;
+ bsrr->extra_response_data = 0;
if (bsrr->num_entries > 0)
{
}
save_entries = bsrr->entries; /* save it so we can compare later */
- if (srw_req->query_type == Z_SRW_query_type_pqf &&
+ if (srw_req->queryType && !strcmp(srw_req->queryType, "pqf") &&
assoc->init->bend_scan)
{
YAZ_PQF_Parser pqf_parser = yaz_pqf_create();
bsrr->term = yaz_pqf_scan(pqf_parser, assoc->decode,
&bsrr->attributeset,
- srw_req->scanClause.pqf);
+ srw_req->scanClause);
yaz_pqf_destroy(pqf_parser);
bsrr->scanClause = 0;
((int (*)(void *, bend_scan_rr *))
(*assoc->init->bend_scan))(assoc->backend, bsrr);
}
- else if (srw_req->query_type == Z_SRW_query_type_cql
+ else if ((!srw_req->queryType || !strcmp(srw_req->queryType, "cql"))
&& assoc->init->bend_scan && assoc->server
&& assoc->server->cql_transform)
{
bsrr->term = (Z_AttributesPlusTerm *)
odr_malloc(assoc->decode, sizeof(*bsrr->term));
srw_error = cql2pqf_scan(assoc->encode,
- srw_req->scanClause.cql,
+ srw_req->scanClause,
assoc->server->cql_transform,
bsrr->term);
if (srw_error)
(*assoc->init->bend_scan))(assoc->backend, bsrr);
}
}
- else if (srw_req->query_type == Z_SRW_query_type_cql
+ else if ((!srw_req->queryType || !strcmp(srw_req->queryType, "cql"))
&& assoc->init->bend_srw_scan)
{
bsrr->term = 0;
bsrr->attributeset = 0;
- bsrr->scanClause = srw_req->scanClause.cql;
+ bsrr->scanClause = srw_req->scanClause;
((int (*)(void *, bend_scan_rr *))
(*assoc->init->bend_srw_scan))(assoc->backend, bsrr);
}
&srw_res->num_diagnostics,
YAZ_SRW_UNSUPP_OPERATION, "scan");
}
+ if (bsrr->extra_response_data)
+ {
+ res->extraResponseData_buf = bsrr->extra_response_data;
+ res->extraResponseData_len = strlen(bsrr->extra_response_data);
+ }
if (bsrr->errcode)
{
int srw_error;
if (log_request)
{
WRBUF wr = wrbuf_alloc();
- const char *querytype = 0;
- const char *querystr = 0;
-
- switch(srw_req->query_type)
- {
- case Z_SRW_query_type_pqf:
- querytype = "PQF";
- querystr = srw_req->scanClause.pqf;
- break;
- case Z_SRW_query_type_cql:
- querytype = "CQL";
- querystr = srw_req->scanClause.cql;
- break;
- default:
- querytype = "UNKNOWN";
- querystr = "";
- }
-
wrbuf_printf(wr, "SRWScan %s ", srw_req->database);
if (srw_res->num_diagnostics)
(srw_req->maximumTerms ?
*srw_req->maximumTerms : 1));
/* there is no step size in SRU/W ??? */
- wrbuf_printf(wr, "%s: %s ", querytype, querystr);
+ wrbuf_printf(wr, "%s: %s ", srw_req->queryType, srw_req->scanClause);
yaz_log(log_request, "%s ", wrbuf_cstr(wr) );
wrbuf_destroy(wr);
}
Z_SRW_updateRequest *srw_req = sr->u.update_request;
yaz_log(log_session, "SRWUpdate action=%s", srw_req->operation);
yaz_log(YLOG_DEBUG, "num_diag = %d", srw_res->num_diagnostics );
- *http_code = 404;
srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr);
+ if (!assoc->init && srw_res->num_diagnostics == 0)
+ *http_code = 404;
if (assoc->init)
{
bend_update_rr rr;
res->u.scan_response->diagnostics = diagnostic;
res->u.scan_response->num_diagnostics = num_diagnostic;
}
- srw_bend_scan(assoc, sr, res->u.scan_response, &http_code);
+ srw_bend_scan(assoc, sr, res, &http_code);
if (http_code == 200)
soap_package->u.generic->p = res;
}
hres->code = http_code;
strcpy(ctype, "text/xml");
- if (charset && strlen(charset) < sizeof(ctype)-30)
- {
- strcat(ctype, "; charset=");
- strcat(ctype, charset);
- }
z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
}
else
bsrr->errcode = 0;
bsrr->errstring = NULL;
bsrr->search_info = NULL;
- bsrr->search_input = req->otherInfo;
+ bsrr->search_input = req->additionalSearchInfo;
+ if (!bsrr->search_input)
+ bsrr->search_input = req->otherInfo;
bsrr->present_number = *req->mediumSetPresentNumber;
if (assoc->server && assoc->server->cql_transform
bsrr->setname = yaz_oi_get_string_oid(&req->otherInfo,
yaz_oid_userinfo_scan_set, 1, 0);
bsrr->entries = 0;
+ bsrr->extra_args = 0;
+ bsrr->extra_response_data = 0;
/* For YAZ 2.0 and earlier it was the backend handler that
initialized entries (member display_term did not exist)
YAZ 2.0 and later sets 'entries' and initialize all members
{
Z_Entry *e;
Z_TermInfo *t;
- Odr_oct *o;
tab[i] = e = (Z_Entry *)odr_malloc(assoc->encode, sizeof(*e));
if (bsrr->entries[i].occurrences >= 0)
t->term = (Z_Term *)
odr_malloc(assoc->encode, sizeof(*t->term));
t->term->which = Z_Term_general;
- t->term->u.general = o =
- (Odr_oct *)odr_malloc(assoc->encode, sizeof(Odr_oct));
- o->buf = (unsigned char *)
- odr_malloc(assoc->encode, o->len = o->size =
- strlen(bsrr->entries[i].term));
- memcpy(o->buf, bsrr->entries[i].term, o->len);
+ t->term->u.general =
+ odr_create_Odr_oct(assoc->encode,
+ bsrr->entries[i].term,
+ strlen(bsrr->entries[i].term));
yaz_log(YLOG_DEBUG, " term #%d: '%s' (" ODR_INT_PRINTF ")", i,
bsrr->entries[i].term, bsrr->entries[i].occurrences);
}