X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=e1449ec508f89ec52869b618fab020e58f812ef2;hb=48bd1822e09cb4e5545c3e0a0178e45a664da8c6;hp=6c8d071f0594dd6fb9c7c7d0b6396d649b3d6b36;hpb=fd9523b748576c5dabf640a18fcf3e95ced15dbd;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index 6c8d071..e1449ec 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: seshigh.c,v 1.72 2006-03-16 12:30:03 adam Exp $ + * $Id: seshigh.c,v 1.89 2006-07-06 14:16:00 marc Exp $ */ /** * \file seshigh.c @@ -50,7 +50,7 @@ #include #endif -#if HAVE_XML2 +#if YAZ_HAVE_XML2 #include #include #endif @@ -184,8 +184,7 @@ association *create_association(IOCHAN channel, COMSTACK link, request_initq(&anew->incoming); request_initq(&anew->outgoing); anew->proto = cs_getproto(link); - anew->cql_transform = 0; - anew->server_node_ptr = 0; + anew->server = 0; return anew; } @@ -360,10 +359,10 @@ void ir_session(IOCHAN h, int event) if (!z_GDU(assoc->decode, &req->gdu_request, 0, 0)) { yaz_log(YLOG_WARN, "ODR error on incoming PDU: %s [element %s] " - "[near byte %d] ", + "[near byte %ld] ", odr_errmsg(odr_geterror(assoc->decode)), odr_getelement(assoc->decode), - odr_offset(assoc->decode)); + (long) odr_offset(assoc->decode)); if (assoc->decode->error != OHTTP) { yaz_log(YLOG_WARN, "PDU dump:"); @@ -488,7 +487,7 @@ static void assoc_init_reset(association *assoc) yaz_log(log_requestdetail, "peer %s", assoc->init->peer_name); } -static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num) +static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num, Z_SRW_PDU *sr) { statserv_options_block *cb = statserv_getcontrol(); if (!assoc->init) @@ -502,6 +501,26 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num) assoc->maximumRecordSize = 3000000; assoc->preferredMessageSize = 3000000; + + if (sr->username) + { + Z_IdAuthentication *auth = odr_malloc(assoc->decode, sizeof(*auth)); + int len; + + len = strlen(sr->username) + 1; + if (sr->password) + len += strlen(sr->password) + 2; + auth->which = Z_IdAuthentication_open; + auth->u.open = odr_malloc(assoc->decode, len); + strcpy(auth->u.open, sr->username); + if (sr->password && *sr->password) + { + strcat(auth->u.open, "/"); + strcat(auth->u.open, sr->password); + } + assoc->init->auth = auth; + } + #if 1 ce = yaz_set_proposal_charneg(assoc->decode, &encoding, 1, 0, 0, 1); assoc->init->charneg_request = ce->u.charNeg3; @@ -515,6 +534,7 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num) return 0; } assoc->backend = binitres->handle; + assoc->init->auth = 0; if (binitres->errcode) { int srw_code = yaz_diag_bib1_to_srw(binitres->errcode); @@ -528,6 +548,136 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num) return 1; } +static const char *get_esn(Z_RecordComposition *comp) +{ + if (comp && comp->which == Z_RecordComp_complex) + { + if (comp->u.complex->generic + && comp->u.complex->generic->elementSpec + && (comp->u.complex->generic->elementSpec->which == + Z_ElementSpec_elementSetName)) + return comp->u.complex->generic->elementSpec->u.elementSetName; + } + else if (comp && comp->which == Z_RecordComp_simple && + comp->u.simple->which == Z_ElementSetNames_generic) + return comp->u.simple->u.generic; + return 0; +} + +static void set_esn(Z_RecordComposition **comp_p, const char *esn, NMEM nmem) +{ + Z_RecordComposition *comp = nmem_malloc(nmem, sizeof(*comp)); + + comp->which = Z_RecordComp_simple; + comp->u.simple = nmem_malloc(nmem, sizeof(*comp->u.simple)); + comp->u.simple->which = Z_ElementSetNames_generic; + comp->u.simple->u.generic = nmem_strdup(nmem, esn); + *comp_p = comp; +} + +static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) +{ +#if YAZ_HAVE_XML2 + yaz_record_conv_t rc = 0; + const char *match_schema = 0; + int *match_syntax = 0; + + if (assoc->server) + { + int r; + const char *input_schema = get_esn(rr->comp); + Odr_oid *input_syntax_raw = rr->request_format_raw; + + const char *backend_schema = 0; + Odr_oid *backend_syntax = 0; + + r = yaz_retrieval_request(assoc->server->retrieval, + input_schema, + input_syntax_raw, + &match_schema, + &match_syntax, + &rc, + &backend_schema, + &backend_syntax); + if (r == -1) /* error ? */ + { + const char *details = yaz_retrieval_get_error( + assoc->server->retrieval); + + rr->errcode = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; + if (details) + rr->errstring = odr_strdup(rr->stream, details); + return -1; + } + else if (r == 1 || r == 3) + { + const char *details = input_schema; + rr->errcode = YAZ_BIB1_ELEMENT_SET_NAMES_UNSUPP; + if (details) + rr->errstring = odr_strdup(rr->stream, details); + return -1; + } + else if (r == 2) + { + rr->errcode = YAZ_BIB1_RECORD_SYNTAX_UNSUPP; + if (input_syntax_raw) + { + char oidbuf[OID_STR_MAX]; + oid_to_dotstring(input_syntax_raw, oidbuf); + rr->errstring = odr_strdup(rr->stream, oidbuf); + } + return -1; + } + if (backend_schema) + { + set_esn(&rr->comp, backend_schema, rr->stream->mem); + } + if (backend_syntax) + { + oident *oident_syntax = oid_getentbyoid(backend_syntax); + + rr->request_format_raw = backend_syntax; + + if (oident_syntax) + rr->request_format = oident_syntax->value; + else + rr->request_format = VAL_NONE; + } + } + (*assoc->init->bend_fetch)(assoc->backend, rr); + if (rc && rr->record && rr->errcode == 0 && rr->len > 0) + { /* post conversion must take place .. */ + WRBUF output_record = wrbuf_alloc(); + int r = yaz_record_conv_record(rc, rr->record, rr->len, output_record); + if (r) + { + const char *details = yaz_record_conv_get_error(rc); + rr->errcode = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; + if (details) + rr->errstring = odr_strdup(rr->stream, details); + } + else + { + rr->len = wrbuf_len(output_record); + rr->record = odr_malloc(rr->stream, rr->len); + memcpy(rr->record, wrbuf_buf(output_record), rr->len); + } + wrbuf_free(output_record, 1); + } + if (match_syntax) + { + struct oident *oi = oid_getentbyoid(match_syntax); + rr->output_format = oi ? oi->value : VAL_NONE; + rr->output_format_raw = match_syntax; + } + if (match_schema) + rr->schema = odr_strdup(rr->stream, match_schema); + return 0; +#else + (*assoc->init->bend_fetch)(assoc->backend, rr); +#endif +} + static int srw_bend_fetch(association *assoc, int pos, Z_SRW_searchRetrieveRequest *srw_req, Z_SRW_record *record) @@ -540,7 +690,7 @@ static int srw_bend_fetch(association *assoc, int pos, rr.referenceId = 0; rr.request_format = VAL_TEXT_XML; rr.request_format_raw = yaz_oidval_to_z3950oid(assoc->decode, - CLASS_TRANSYN, + CLASS_RECSYN, VAL_TEXT_XML); rr.comp = (Z_RecordComposition *) odr_malloc(assoc->decode, sizeof(*rr.comp)); @@ -581,8 +731,6 @@ static int srw_bend_fetch(association *assoc, int pos, rr.len = 0; rr.record = 0; rr.last_in_set = 0; - rr.output_format = VAL_TEXT_XML; - rr.output_format_raw = 0; rr.errcode = 0; rr.errstring = 0; rr.surrogate_flag = 0; @@ -591,7 +739,7 @@ static int srw_bend_fetch(association *assoc, int pos, if (!assoc->init->bend_fetch) return 1; - (*assoc->init->bend_fetch)(assoc->backend, &rr); + retrieve_fetch(assoc, &rr); if (rr.errcode && rr.surrogate_flag) { @@ -642,7 +790,7 @@ static int cql2pqf(ODR odr, const char *cql, cql_transform_t ct, int r; int srw_errcode = 0; const char *add = 0; - char rpn_buf[512]; + char rpn_buf[5120]; r = cql_parser_string(cp, cql); if (r) @@ -708,16 +856,17 @@ static int cql2pqf_scan(ODR odr, const char *cql, cql_transform_t ct, } static void srw_bend_search(association *assoc, request *req, - Z_SRW_searchRetrieveRequest *srw_req, + Z_SRW_PDU *sr, Z_SRW_searchRetrieveResponse *srw_res, int *http_code) { int srw_error = 0; Z_External *ext; + Z_SRW_searchRetrieveRequest *srw_req = sr->u.request; *http_code = 200; yaz_log(log_requestdetail, "Got SRW SearchRetrieveRequest"); - srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics); + srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr); if (srw_res->num_diagnostics == 0 && assoc->init) { bend_search_rr rr; @@ -734,10 +883,11 @@ static void srw_bend_search(association *assoc, request *req, if (srw_req->query_type == Z_SRW_query_type_cql) { - if (assoc->cql_transform) + if (assoc->server && assoc->server->cql_transform) { int srw_errcode = cql2pqf(assoc->encode, srw_req->query.cql, - assoc->cql_transform, rr.query); + assoc->server->cql_transform, + rr.query); if (srw_errcode) { yaz_add_srw_diagnostic(assoc->encode, @@ -775,8 +925,8 @@ static void srw_bend_search(association *assoc, request *req, 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 %d", - code, 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; } @@ -852,50 +1002,100 @@ static void srw_bend_search(association *assoc, request *req, } else { - int j = 0; - int packing = Z_SRW_recordPacking_string; + int ok = 1; if (start + number > rr.hits) number = rr.hits - start + 1; - if (srw_req->recordPacking){ - if (!strcmp(srw_req->recordPacking, "xml")) - packing = Z_SRW_recordPacking_XML; - if (!strcmp(srw_req->recordPacking, "url")) - packing = Z_SRW_recordPacking_URL; - } - srw_res->records = (Z_SRW_record *) - odr_malloc(assoc->encode, - number * sizeof(*srw_res->records)); - - srw_res->extra_records = (Z_SRW_extra_record **) - odr_malloc(assoc->encode, - number*sizeof(*srw_res->extra_records)); - - for (i = 0; iinit->bend_present) { - int errcode; + bend_present_rr *bprr = (bend_present_rr*) + odr_malloc (assoc->decode, sizeof(*bprr)); + bprr->setname = "default"; + bprr->start = start; + bprr->number = number; + bprr->format = VAL_TEXT_XML; + 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->request = req; + bprr->association = assoc; + bprr->errcode = 0; + bprr->errstring = NULL; + (*assoc->init->bend_present)(assoc->backend, bprr); - srw_res->records[j].recordPacking = packing; - srw_res->records[j].recordData_buf = 0; - srw_res->extra_records[j] = 0; - yaz_log(YLOG_DEBUG, "srw_bend_fetch %d", i+start); - errcode = srw_bend_fetch(assoc, i+start, srw_req, - srw_res->records + j); - if (errcode) + if (!bprr->request) + return; + 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, - yaz_diag_bib1_to_srw (errcode), - rr.errstring); + srw_error, bprr->errstring); + ok = 0; + } + } + + if (ok) + { + int j = 0; + int packing = Z_SRW_recordPacking_string; + if (srw_req->recordPacking){ + if (!strcmp(srw_req->recordPacking, "xml")) + packing = Z_SRW_recordPacking_XML; + if (!strcmp(srw_req->recordPacking, "url")) + packing = Z_SRW_recordPacking_URL; + } + srw_res->records = (Z_SRW_record *) + odr_malloc(assoc->encode, + number * sizeof(*srw_res->records)); + + srw_res->extra_records = (Z_SRW_extra_record **) + odr_malloc(assoc->encode, + number*sizeof(*srw_res->extra_records)); + + for (i = 0; irecords[j].recordPacking = packing; + srw_res->records[j].recordData_buf = 0; + srw_res->extra_records[j] = 0; + yaz_log(YLOG_DEBUG, "srw_bend_fetch %d", i+start); + errcode = srw_bend_fetch(assoc, i+start, srw_req, + srw_res->records + j); + if (errcode) + { + yaz_add_srw_diagnostic(assoc->encode, + &srw_res->diagnostics, + &srw_res->num_diagnostics, + yaz_diag_bib1_to_srw (errcode), + rr.errstring); + + break; + } + if (srw_res->records[j].recordData_buf) + j++; } - if (srw_res->records[j].recordData_buf) - j++; + srw_res->num_records = j; + if (!j) + srw_res->records = 0; } - srw_res->num_records = j; - if (!j) - srw_res->records = 0; } } } @@ -919,6 +1119,8 @@ static void srw_bend_search(association *assoc, request *req, break; } wrbuf_printf(wr, "SRWSearch "); + wrbuf_printf(wr, srw_req->database); + wrbuf_printf(wr, " "); if (srw_res->num_diagnostics) wrbuf_printf(wr, "ERROR %s", srw_res->diagnostics[0].uri); else if (*http_code != 200) @@ -941,7 +1143,7 @@ static void srw_bend_search(association *assoc, request *req, static char *srw_bend_explain_default(void *handle, bend_explain_rr *rr) { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 xmlNodePtr ptr = rr->server_node_ptr; if (!ptr) return 0; @@ -976,13 +1178,14 @@ static char *srw_bend_explain_default(void *handle, bend_explain_rr *rr) } static void srw_bend_explain(association *assoc, request *req, - Z_SRW_explainRequest *srw_req, + Z_SRW_PDU *sr, Z_SRW_explainResponse *srw_res, int *http_code) { + 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); + srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr); if (assoc->init) { bend_explain_rr rr; @@ -992,7 +1195,10 @@ static void srw_bend_explain(association *assoc, request *req, rr.print = assoc->print; rr.explain_buf = 0; rr.database = srw_req->database; - rr.server_node_ptr = assoc->server_node_ptr; + if (assoc->server) + rr.server_node_ptr = assoc->server->server_node_ptr; + else + rr.server_node_ptr = 0; rr.schema = "http://explain.z3950.org/dtd/2.0/"; if (assoc->init->bend_explain) (*assoc->init->bend_explain)(assoc->backend, &rr); @@ -1020,14 +1226,15 @@ static void srw_bend_explain(association *assoc, request *req, } static void srw_bend_scan(association *assoc, request *req, - Z_SRW_scanRequest *srw_req, + Z_SRW_PDU *sr, Z_SRW_scanResponse *srw_res, int *http_code) { + Z_SRW_scanRequest *srw_req = sr->u.scan_request; yaz_log(log_requestdetail, "Got SRW ScanRequest"); *http_code = 200; - srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics); + srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr); if (srw_res->num_diagnostics == 0 && assoc->init) { struct scan_entry *save_entries; @@ -1089,7 +1296,8 @@ static void srw_bend_scan(association *assoc, request *req, (*assoc->init->bend_scan))(assoc->backend, bsrr); } else if (srw_req->query_type == Z_SRW_query_type_cql - && assoc->init->bend_scan && assoc->cql_transform) + && assoc->init->bend_scan && assoc->server + && assoc->server->cql_transform) { int srw_error; bsrr->scanClause = 0; @@ -1097,7 +1305,7 @@ static void srw_bend_scan(association *assoc, request *req, bsrr->term = odr_malloc(assoc->decode, sizeof(*bsrr->term)); srw_error = cql2pqf_scan(assoc->encode, srw_req->scanClause.cql, - assoc->cql_transform, + assoc->server->cql_transform, bsrr->term); if (srw_error) yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, @@ -1204,14 +1412,15 @@ static void srw_bend_scan(association *assoc, request *req, } static void srw_bend_update(association *assoc, request *req, - Z_SRW_updateRequest *srw_req, + Z_SRW_PDU *sr, Z_SRW_updateResponse *srw_res, int *http_code) { + Z_SRW_updateRequest *srw_req = sr->u.update_request; yaz_log(YLOG_DEBUG, "Got SRW UpdateRequest"); 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); + srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics, sr); if (assoc->init) { bend_update_rr rr; @@ -1233,8 +1442,9 @@ static void srw_bend_update(association *assoc, request *req, rr.response_extra_record = 0; rr.extra_request_data = 0; rr.extra_response_data = 0; - rr.errcode = 0; - rr.errstring = 0; + rr.uri = 0; + rr.message = 0; + rr.details = 0; yaz_log(YLOG_DEBUG, "basename = %s", rr.basenames[0] ); yaz_log(YLOG_DEBUG, "Operation = %s", rr.operation ); @@ -1313,6 +1523,7 @@ static void srw_bend_update(association *assoc, request *req, } else if ( !strcmp( rr.operation, "insert" ) ) { + rr.record_id = srw_req->recordId; if ( srw_req->record.recordSchema == 0 ){ yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, &srw_res->num_diagnostics, @@ -1359,11 +1570,14 @@ static void srw_bend_update(association *assoc, request *req, return; } } - if (rr.errcode) - yaz_add_srw_diagnostic(assoc->encode, - &srw_res->diagnostics, - &srw_res->num_diagnostics, - rr.errcode, rr.errstring); + + if (rr.uri) + yaz_add_srw_diagnostic_uri(assoc->encode, + &srw_res->diagnostics, + &srw_res->num_diagnostics, + rr.uri, + rr.message, + rr.details); srw_res->recordId = rr.record_id; srw_res->operationStatus = rr.operation_status; srw_res->recordVersion = rr.record_version; @@ -1432,10 +1646,12 @@ static void process_http_request(association *assoc, request *req) p = z_get_HTTP_Response(o, 404); r = 1; } - if (r == 2 && assoc->docpath && hreq->path[0] == '/' + if (r == 2 && assoc->server && assoc->server->docpath + && hreq->path[0] == '/' && /* check if path is a proper prefix of documentroot */ - strncmp(hreq->path+1, assoc->docpath, strlen(assoc->docpath)) + strncmp(hreq->path+1, assoc->server->docpath, + strlen(assoc->server->docpath)) == 0) { if (!check_path(hreq->path)) @@ -1463,6 +1679,7 @@ static void process_http_request(association *assoc, request *req) yaz_mime_types_add(types, "html", "text/html"); yaz_mime_types_add(types, "htm", "text/html"); yaz_mime_types_add(types, "txt", "text/plain"); + yaz_mime_types_add(types, "js", "application/x-javascript"); yaz_mime_types_add(types, "gif", "image/gif"); yaz_mime_types_add(types, "png", "image/png"); @@ -1516,7 +1733,7 @@ static void process_http_request(association *assoc, request *req) } else { - srw_bend_search(assoc, req, sr->u.request, res->u.response, + srw_bend_search(assoc, req, sr, res->u.response, &http_code); } if (http_code == 200) @@ -1531,7 +1748,7 @@ static void process_http_request(association *assoc, request *req) res->u.explain_response->diagnostics = diagnostic; res->u.explain_response->num_diagnostics = num_diagnostic; } - srw_bend_explain(assoc, req, sr->u.explain_request, + srw_bend_explain(assoc, req, sr, res->u.explain_response, &http_code); if (http_code == 200) soap_package->u.generic->p = res; @@ -1545,7 +1762,7 @@ static void process_http_request(association *assoc, request *req) res->u.scan_response->diagnostics = diagnostic; res->u.scan_response->num_diagnostics = num_diagnostic; } - srw_bend_scan(assoc, req, sr->u.scan_request, + srw_bend_scan(assoc, req, sr, res->u.scan_response, &http_code); if (http_code == 200) soap_package->u.generic->p = res; @@ -1560,7 +1777,7 @@ static void process_http_request(association *assoc, request *req) 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->u.update_request, + srw_bend_update(assoc, req, sr, res->u.update_response, &http_code); if (http_code == 200) soap_package->u.generic->p = res; @@ -1576,7 +1793,7 @@ static void process_http_request(association *assoc, request *req) if (http_code == 200 || http_code == 500) { static Z_SOAP_Handler soap_handlers[4] = { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec}, {"http://www.loc.gov/zing/srw/v1.0/", 0, @@ -1591,8 +1808,8 @@ static void process_http_request(association *assoc, request *req) p = z_get_HTTP_Response(o, 200); hres = p->u.HTTP_Response; - if (!stylesheet) - stylesheet = assoc->stylesheet; + if (!stylesheet && assoc->server) + stylesheet = assoc->server->stylesheet; /* empty stylesheet means NO stylesheet */ if (stylesheet && *stylesheet == '\0') @@ -2034,7 +2251,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) strcat(options, " negotiation"); } - ODR_MASK_SET(resp->options, Z_Options_triggerResourceCtrl); + if (ODR_MASK_GET(req->options, Z_Options_triggerResourceCtrl)) + ODR_MASK_SET(resp->options, Z_Options_triggerResourceCtrl); if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1)) { @@ -2072,7 +2290,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.72 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.89 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, @@ -2236,7 +2454,8 @@ static Z_Records *pack_records(association *a, char *setname, int start, freq.print = a->print; freq.referenceId = referenceId; freq.schema = 0; - (*a->init->bend_fetch)(a->backend, &freq); + + retrieve_fetch(a, &freq); *next = freq.last_in_set ? 0 : recno + 1; @@ -2381,14 +2600,14 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, bsrr->errstring = NULL; bsrr->search_info = NULL; - if (assoc->cql_transform && - req->query->which == Z_Query_type_104 && - req->query->u.type_104->which == Z_External_CQL) + if (assoc->server && assoc->server->cql_transform + && req->query->which == Z_Query_type_104 + && req->query->u.type_104->which == Z_External_CQL) { /* have a CQL query and a CQL to PQF transform .. */ int srw_errcode = cql2pqf(bsrr->stream, req->query->u.type_104->u.cql, - assoc->cql_transform, bsrr->query); + assoc->server->cql_transform, bsrr->query); if (srw_errcode) bsrr->errcode = yaz_diag_srw_to_bib1(srw_errcode); } @@ -2487,9 +2706,39 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, form = VAL_NONE; else form = prefformat->value; - resp->records = pack_records(assoc, req->resultSetName, 1, - toget, compp, next, presst, form, req->referenceId, - req->preferredRecordSyntax, NULL); + + /* Call bend_present if defined */ + if (assoc->init->bend_present) + { + bend_present_rr *bprr = (bend_present_rr *) + nmem_malloc (reqb->request_mem, sizeof(*bprr)); + bprr->setname = req->resultSetName; + bprr->start = 1; + bprr->number = *toget; + bprr->format = form; + bprr->comp = compp; + bprr->referenceId = req->referenceId; + bprr->stream = assoc->encode; + bprr->print = assoc->print; + bprr->request = reqb; + bprr->association = assoc; + bprr->errcode = 0; + bprr->errstring = NULL; + (*assoc->init->bend_present)(assoc->backend, bprr); + + if (!bprr->request) + return 0; + if (bprr->errcode) + { + resp->records = diagrec(assoc, bprr->errcode, bprr->errstring); + *resp->presentStatus = Z_PresentStatus_failure; + } + } + + if (!resp->records) + resp->records = pack_records(assoc, req->resultSetName, 1, + toget, compp, next, presst, form, req->referenceId, + req->preferredRecordSyntax, NULL); if (!resp->records) return 0; resp->numberOfRecordsReturned = toget; @@ -2514,7 +2763,17 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, if (log_request) { + int i; WRBUF wr = wrbuf_alloc(); + /* int num_databaseNames; + Z_DatabaseName **databaseNames; */ + for (i = 0 ; i < req->num_databaseNames; i++){ + if (i) + wrbuf_printf(wr, ","); + wrbuf_printf(wr, req->databaseNames[i]); + } + wrbuf_printf(wr, " "); + if (bsrt->errcode) wrbuf_printf(wr, "ERROR %d", bsrt->errcode); else