X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=6b0f80ec4064422abd15e1fe84c4132eb34f6165;hb=3ee7ef4088b265faffbdcabe3eb13d5f04a3b832;hp=3cc1b38473be053790f9ce08ffc47f9d4c668735;hpb=5008c98db7e9ca6291347b6ecddb946aff92d0fe;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index 3cc1b38..6b0f80e 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.80 2006-05-09 13:39:47 adam Exp $ + * $Id: seshigh.c,v 1.85 2006-05-31 16:20:41 quinn Exp $ */ /** * \file seshigh.c @@ -582,10 +582,6 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) const char *match_schema = 0; int *match_syntax = 0; - if (!assoc->server) - { - yaz_log(YLOG_LOG, "no assoc->server"); - } if (assoc->server) { int r; @@ -595,8 +591,6 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) const char *backend_schema = 0; Odr_oid *backend_syntax = 0; - yaz_log(YLOG_LOG, "found assoc->server"); - r = yaz_retrieval_request(assoc->server->retrieval, input_schema, input_syntax_raw, @@ -605,7 +599,6 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) &rc, &backend_schema, &backend_syntax); - yaz_log(YLOG_LOG, "yaz_retrieval_request r=%d", r); if (r == -1) /* error ? */ { const char *details = yaz_retrieval_get_error( @@ -677,7 +670,6 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) rr->output_format = oi ? oi->value : VAL_NONE; rr->output_format_raw = match_syntax; } - yaz_log(YLOG_LOG, "match_scheam=%s", match_schema); if (match_schema) rr->schema = odr_strdup(rr->stream, match_schema); return 0; @@ -1010,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; } } } @@ -2240,7 +2282,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.80 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.85 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, @@ -2656,9 +2698,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;