X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=e1449ec508f89ec52869b618fab020e58f812ef2;hb=48bd1822e09cb4e5545c3e0a0178e45a664da8c6;hp=901aa31705da21cfefd5baa7da0248cfb80b5e81;hpb=5a0004a1d8cdf8258c8b823d9026939411d2238f;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index 901aa31..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.82 2006-05-14 20:03:19 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 @@ -577,7 +577,7 @@ static void set_esn(Z_RecordComposition **comp_p, const char *esn, NMEM nmem) static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) { -#if HAVE_XML2 +#if YAZ_HAVE_XML2 yaz_record_conv_t rc = 0; const char *match_schema = 0; int *match_syntax = 0; @@ -1002,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; } } } @@ -1069,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) @@ -1091,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; @@ -1390,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 ); @@ -1470,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, @@ -1516,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; @@ -1736,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, @@ -2194,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)) { @@ -2232,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.82 $"); + 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, @@ -2705,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