X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=7b7db0c4058402216ebbab877713719eddb5a347;hb=87c5b79ec9ced76de948e833ef2f8eb561d2f77a;hp=1c4040c3d3f5f6c3b13a966711bb3404458e873d;hpb=7a98e9bfbb9d5fe7d44822a9838e3becbdce9363;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index 1c4040c..7b7db0c 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: seshigh.c,v 1.119 2007-05-08 08:22:36 adam Exp $ + * $Id: seshigh.c,v 1.127 2007-08-23 14:23:23 adam Exp $ */ /** * \file seshigh.c @@ -76,6 +76,7 @@ #include #include +#include static void process_gdu_request(association *assoc, request *req); static int process_z_request(association *assoc, request *req, char **msg); @@ -852,6 +853,25 @@ static int cql2pqf_scan(ODR odr, const char *cql, cql_transform_t ct, return 0; } + +static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset, + bend_search_rr *bsrr) { + char *ccl0; + struct ccl_rpn_node *node; + int errcode, pos; + + ccl0 = odr_strdupn(odr, (char*) ccl->buf, ccl->len); + if ((node = ccl_find_str(bibset, ccl0, &errcode, &pos)) == 0) { + bsrr->errstring = (char*) ccl_err_msg(errcode); + return 10; /* Query syntax error */ + } + + bsrr->query->which = Z_Query_type_1; + bsrr->query->u.type_1 = ccl_rpn_query(odr, node); + return 0; +} + + static void srw_bend_search(association *assoc, request *req, Z_SRW_PDU *sr, Z_SRW_searchRetrieveResponse *srw_res, @@ -990,12 +1010,14 @@ static void srw_bend_search(association *assoc, request *req, odr_intdup(assoc->encode, *rr.srw_setnameIdleTime ); } - if ((rr.hits > 0 && start > rr.hits) || start < 1) + if (start > rr.hits || start < 1) { - yaz_add_srw_diagnostic( - assoc->encode, - &srw_res->diagnostics, &srw_res->num_diagnostics, - YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0); + /* 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) { @@ -1264,6 +1286,7 @@ static void srw_bend_scan(association *assoc, request *req, bsrr->print = assoc->print; bsrr->step_size = odr_intdup(assoc->decode, 0); bsrr->entries = 0; + bsrr->setname = 0; if (bsrr->num_entries > 0) { @@ -1778,8 +1801,8 @@ static void process_http_request(association *assoc, request *req) if (sr->which == Z_SRW_searchRetrieve_request) { Z_SRW_PDU *res = - yaz_srw_get(assoc->encode, Z_SRW_searchRetrieve_response); - + yaz_srw_get_pdu(assoc->encode, Z_SRW_searchRetrieve_response, + sr->srw_version); stylesheet = sr->u.request->stylesheet; if (num_diagnostic) { @@ -1796,7 +1819,8 @@ static void process_http_request(association *assoc, request *req) } else if (sr->which == Z_SRW_explain_request) { - Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_explain_response); + Z_SRW_PDU *res = yaz_srw_get_pdu(o, Z_SRW_explain_response, + sr->srw_version); stylesheet = sr->u.explain_request->stylesheet; if (num_diagnostic) { @@ -1810,7 +1834,8 @@ static void process_http_request(association *assoc, request *req) } else if (sr->which == Z_SRW_scan_request) { - Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_scan_response); + Z_SRW_PDU *res = yaz_srw_get_pdu(o, Z_SRW_scan_response, + sr->srw_version); stylesheet = sr->u.scan_request->stylesheet; if (num_diagnostic) { @@ -1824,7 +1849,8 @@ static void process_http_request(association *assoc, request *req) } else if (sr->which == Z_SRW_update_request) { - Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_update_response); + Z_SRW_PDU *res = yaz_srw_get_pdu(o, Z_SRW_update_response, + sr->srw_version); yaz_log(YLOG_DEBUG, "handling SRW UpdateRequest"); if (num_diagnostic) { @@ -1855,7 +1881,7 @@ static void process_http_request(association *assoc, request *req) #endif {0, 0, 0} }; - char ctype[60]; + char ctype[80]; int ret; p = z_get_HTTP_Response(o, 200); hres = p->u.HTTP_Response; @@ -1873,7 +1899,7 @@ static void process_http_request(association *assoc, request *req) hres->code = http_code; strcpy(ctype, "text/xml"); - if (charset) + if (charset && strlen(charset) < sizeof(ctype)-30) { strcat(ctype, "; charset="); strcat(ctype, charset); @@ -2289,36 +2315,32 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) strcat(options, " sort"); } - if (!assoc->init->charneg_response && !assoc->init->charneg_request) + if (ODR_MASK_GET(req->options, Z_Options_negotiationModel)) { - if (assoc->init->query_charset) + Z_OtherInformationUnit *p0; + + if (!assoc->init->charneg_response) { - assoc->init->charneg_response = yaz_set_response_charneg( - assoc->encode, assoc->init->query_charset, 0, - assoc->init->records_in_same_charset); + if (assoc->init->query_charset) + { + assoc->init->charneg_response = yaz_set_response_charneg( + assoc->encode, assoc->init->query_charset, 0, + assoc->init->records_in_same_charset); + } + else + { + yaz_log(YLOG_WARN, "default query_charset not defined by backend"); + } } - else + if (assoc->init->charneg_response + && (p0=yaz_oi_update(&resp->otherInfo, assoc->encode, NULL, 0, 0))) { - yaz_log(YLOG_WARN, "default query_charset not defined by backend"); - } - } - if (assoc->init->charneg_response - && ODR_MASK_GET(req->options, Z_Options_negotiationModel)) - { - Z_OtherInformation **p; - Z_OtherInformationUnit *p0; - - yaz_oi_APDU(apdu, &p); - - if ((p0=yaz_oi_update(p, assoc->encode, NULL, 0, 0))) { - ODR_MASK_SET(resp->options, Z_Options_negotiationModel); - p0->which = Z_OtherInfo_externallyDefinedInfo; p0->information.externallyDefinedInfo = assoc->init->charneg_response; + ODR_MASK_SET(resp->options, Z_Options_negotiationModel); + strcat(options, " negotiation"); } - ODR_MASK_SET(resp->options, Z_Options_negotiationModel); - strcat(options, " negotiation"); } if (ODR_MASK_GET(req->options, Z_Options_triggerResourceCtrl)) ODR_MASK_SET(resp->options, Z_Options_triggerResourceCtrl); @@ -2358,7 +2380,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) assoc->init->implementation_name, odr_prepend(assoc->encode, "GFS", resp->implementationName)); - version = odr_strdup(assoc->encode, "$Revision: 1.119 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.127 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, @@ -2676,6 +2698,18 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, if (srw_errcode) bsrr->errcode = yaz_diag_srw_to_bib1(srw_errcode); } + + if (assoc->server && assoc->server->ccl_transform + && req->query->which == Z_Query_type_2) /*CCL*/ + { + /* have a CCL query and a CCL to PQF transform .. */ + int srw_errcode = + ccl2pqf(bsrr->stream, req->query->u.type_2, + assoc->server->ccl_transform, bsrr); + if (srw_errcode) + bsrr->errcode = yaz_diag_srw_to_bib1(srw_errcode); + } + if (!bsrr->errcode) (assoc->init->bend_search)(assoc->backend, bsrr); if (!bsrr->request) /* backend not ready with the search response */ @@ -3014,6 +3048,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) bsrr->stream = assoc->encode; bsrr->print = assoc->print; bsrr->step_size = res->stepSize; + bsrr->setname = yaz_oi_get_string_oid(&req->otherInfo, + yaz_oid_userinfo_scan_set, 1, 0); bsrr->entries = 0; /* For YAZ 2.0 and earlier it was the backend handler that initialized entries (member display_term did not exist) @@ -3127,35 +3163,32 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) int i; WRBUF wr = wrbuf_alloc(); wrbuf_printf(wr, "Scan "); - for (i = 0 ; i < req->num_databaseNames; i++){ + for (i = 0 ; i < req->num_databaseNames; i++) + { if (i) wrbuf_printf(wr, "+"); wrbuf_printf(wr, req->databaseNames[i]); } + wrbuf_printf(wr, " "); - if (bsrr->errcode){ + if (bsrr->errcode) wr_diag(wr, bsrr->errcode, bsrr->errstring); - wrbuf_printf(wr, " "); - } - else - wrbuf_printf(wr, "OK "); - /* else if (*res->scanStatus == Z_Scan_success) */ - /* wrbuf_printf(wr, "OK "); */ - /* else */ - /* wrbuf_printf(wr, "Partial "); */ - - if (*res->numberOfEntriesReturned) - wrbuf_printf(wr, "%d - ", *res->numberOfEntriesReturned); else - wrbuf_printf(wr, "0 - "); + wrbuf_printf(wr, "OK"); - wrbuf_printf(wr, "%d+%d+%d ", + wrbuf_printf(wr, " %d - %d+%d+%d", + res->numberOfEntriesReturned ? + *res->numberOfEntriesReturned : 0, (req->preferredPositionInResponse ? *req->preferredPositionInResponse : 1), *req->numberOfTermsRequested, (res->stepSize ? *res->stepSize : 1)); + + if (bsrr->setname) + wrbuf_printf(wr, "+%s", bsrr->setname); + wrbuf_printf(wr, " "); yaz_scan_to_wrbuf(wr, req->termListAndStartPoint, bsrr->attributeset); yaz_log(log_request, "%s", wrbuf_cstr(wr) );