X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fseshigh.c;h=3e10403b25b5e0a7a8a1ba0896b105f6ba1b812d;hb=fab857282ce150ffb962753bf98132deae20b8c9;hp=c10ae91e388b0070a6a1a579fb198920bd64ce5a;hpb=5a52bdfe653f1b89343722aa0294276d9a113e97;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index c10ae91..3e10403 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data * See the file LICENSE for details. - * - * $Id: seshigh.c,v 1.123 2007-07-27 08:05:52 adam Exp $ */ /** * \file seshigh.c @@ -76,6 +74,7 @@ #include #include +#include static void process_gdu_request(association *assoc, request *req); static int process_z_request(association *assoc, request *req, char **msg); @@ -736,29 +735,7 @@ static int srw_bend_fetch(association *assoc, int pos, if (rr.errcode && rr.surrogate_flag) { int code = yaz_diag_bib1_to_srw(rr.errcode); - const char *message = yaz_diag_srw_str(code); - int len = 200; - if (message) - len += strlen(message); - if (rr.errstring) - len += strlen(rr.errstring); - - record->recordData_buf = (char *) odr_malloc(o, len); - - sprintf(record->recordData_buf, "\n" - " info:srw/diagnostic/1/%d\n", code); - if (rr.errstring) - sprintf(record->recordData_buf + strlen(record->recordData_buf), - "
%s
\n", rr.errstring); - if (message) - sprintf(record->recordData_buf + strlen(record->recordData_buf), - " %s\n", message); - sprintf(record->recordData_buf + strlen(record->recordData_buf), - "
\n"); - record->recordData_len = strlen(record->recordData_buf); - record->recordPosition = odr_intdup(o, pos); - record->recordSchema = "info:srw/schema/1/diagnostics-v1.1"; + yaz_mk_sru_surrogate(o, record, pos, code, rr.errstring); return 0; } else if (rr.len >= 0) @@ -766,10 +743,8 @@ static int srw_bend_fetch(association *assoc, int pos, record->recordData_buf = rr.record; record->recordData_len = rr.len; record->recordPosition = odr_intdup(o, pos); - if (rr.schema) - record->recordSchema = odr_strdup(o, rr.schema); - else - record->recordSchema = 0; + record->recordSchema = odr_strdup_null( + o, rr.schema ? rr.schema : srw_req->recordSchema); } if (rr.errcode) { @@ -852,6 +827,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, @@ -1781,8 +1775,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) { @@ -1799,7 +1793,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) { @@ -1813,7 +1808,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) { @@ -1827,7 +1823,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) { @@ -2357,7 +2354,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.123 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.128 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, @@ -2600,10 +2597,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, if (!(thisrec = (Z_NamePlusRecord *) odr_malloc(a->encode, sizeof(*thisrec)))) return 0; - if (freq.basename) - thisrec->databaseName = odr_strdup(a->encode, freq.basename); - else - thisrec->databaseName = 0; + thisrec->databaseName = odr_strdup_null(a->encode, freq.basename); thisrec->which = Z_NamePlusRecord_databaseRecord; if (!freq.output_format) @@ -2675,6 +2669,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 */