X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fseshigh.c;h=28830c2f0a5427926d9af1c2cb2213cbe4e6db29;hb=699e7501d441803e6abd38bb8771cef20846a0d6;hp=261b617f74448e767d6ab813300f6dfcce9c2afc;hpb=6d146b66bddee1a1f0857b548c614047db43693f;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index 261b617..28830c2 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.95 2006-07-31 12:15:02 adam Exp $ + * $Id: seshigh.c,v 1.104 2006-11-14 08:37:38 adam Exp $ */ /** * \file seshigh.c @@ -108,7 +108,7 @@ static int log_request = 0; /* one-line logs for requests */ static int log_requestdetail = 0; /* more detailed stuff */ /** get_logbits sets global loglevel bits */ -static void get_logbits() +static void get_logbits(void) { /* needs to be called after parsing cmd-line args that can set loglevels!*/ if (!logbits_set) { @@ -339,8 +339,18 @@ void ir_session(IOCHAN h, int event) return; } assoc->cs_get_mask = EVENT_INPUT; - if ((res = cs_get(conn, &assoc->input_buffer, - &assoc->input_buffer_len)) <= 0) + res = cs_get(conn, &assoc->input_buffer, + &assoc->input_buffer_len); + if (res < 0 && cs_errno(conn) == CSBUFSIZE) + { + yaz_log(log_session, "Connection error: %s res=%d", + cs_errmsg(cs_errno(conn)), res); + req = request_get(&assoc->incoming); /* get a new request */ + do_close_req(assoc, Z_Close_protocolError, + "Incoming package too large", req); + return; + } + else if (res <= 0) { yaz_log(log_sessiondetail, "Connection closed by client"); cs_close(conn); @@ -378,7 +388,7 @@ void ir_session(IOCHAN h, int event) yaz_log(YLOG_WARN, "PDU dump:"); odr_dumpBER(yaz_log_file(), assoc->input_buffer, res); request_release(req); - do_close(assoc, Z_Close_protocolError,"Malformed package"); + do_close(assoc, Z_Close_protocolError, "Malformed package"); } else { @@ -509,9 +519,6 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num, Z_S yaz_log(log_requestdetail, "srw_bend_init config=%s", cb->configname); assoc_init_reset(assoc); - assoc->maximumRecordSize = 3000000; - assoc->preferredMessageSize = 3000000; - if (sr->username) { Z_IdAuthentication *auth = odr_malloc(assoc->decode, sizeof(*auth)); @@ -558,33 +565,6 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num, Z_S 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 @@ -595,7 +575,7 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) if (assoc->server) { int r; - const char *input_schema = get_esn(rr->comp); + const char *input_schema = yaz_get_esn(rr->comp); Odr_oid *input_syntax_raw = rr->request_format_raw; const char *backend_schema = 0; @@ -640,7 +620,7 @@ static int retrieve_fetch(association *assoc, bend_fetch_rr *rr) } if (backend_schema) { - set_esn(&rr->comp, backend_schema, rr->stream->mem); + yaz_set_esn(&rr->comp, backend_schema, rr->stream->mem); } if (backend_syntax) { @@ -1006,114 +986,112 @@ static void srw_bend_search(association *assoc, request *req, srw_res->resultSetIdleTime = odr_intdup(assoc->encode, *rr.srw_setnameIdleTime ); } - if (number > 0) + + if ((rr.hits > 0 && 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); + } + else if (number > 0) { int i; + int ok = 1; + if (start + number > rr.hits) + number = rr.hits - start + 1; - if (start > rr.hits) + /* Call bend_present if defined */ + if (assoc->init->bend_present) { - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0); + 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); + + 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, + srw_error, bprr->errstring); + ok = 0; + } } - else + + if (ok) { - int ok = 1; - if (start + number > rr.hits) - number = rr.hits - start + 1; - - /* Call bend_present if defined */ - if (assoc->init->bend_present) + 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; idecode, 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); + int errcode; + const char *addinfo = 0; - if (!bprr->request) - return; - if (bprr->errcode) + 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, + &addinfo); + if (errcode) { - srw_error = yaz_diag_bib1_to_srw (bprr->errcode); yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, &srw_res->num_diagnostics, - 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, - &addinfo); - if (errcode) - { - yaz_add_srw_diagnostic(assoc->encode, - &srw_res->diagnostics, - &srw_res->num_diagnostics, - yaz_diag_bib1_to_srw (errcode), - addinfo); - - break; - } - if (srw_res->records[j].recordData_buf) - j++; + break; } - srw_res->num_records = j; - if (!j) - srw_res->records = 0; + if (srw_res->records[j].recordData_buf) + j++; } + srw_res->num_records = j; + if (!j) + srw_res->records = 0; } } } @@ -1472,24 +1450,60 @@ static void srw_bend_update(association *assoc, request *req, rr.uri = 0; rr.message = 0; rr.details = 0; - + + if ( rr.operation == 0 ){ + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "action" ); + return; + } yaz_log(YLOG_DEBUG, "basename = %s", rr.basenames[0] ); yaz_log(YLOG_DEBUG, "Operation = %s", rr.operation ); if ( !strcmp( rr.operation, "delete" ) ){ if ( !srw_req->recordId ){ - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - 7, "recordId" ); + if ( srw_req->record.recordData_len ){ + if ( srw_req->record.recordSchema == 0 ){ + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordSchema" ); + } + else { + rr.record_schema = odr_strdup(assoc->encode, + srw_req->record.recordSchema ); + } + switch (srw_req->record.recordPacking) + { + case Z_SRW_recordPacking_string: + rr.record_packing = "string"; + break; + case Z_SRW_recordPacking_XML: + rr.record_packing = "xml"; + break; + case Z_SRW_recordPacking_URL: + rr.record_packing = "url"; + break; + } + rr.record_data = odr_strdupn(assoc->encode, + srw_req->record.recordData_buf, + srw_req->record.recordData_len ); + rr.request_extra_record = srw_req->extra_record; + } + else { + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordIdentifier OR recordData" ); + } } else { rr.record_id = srw_req->recordId; + if ( srw_req->record.recordData_len ){ + yaz_add_sru_update_diagnostic(assoc->encode, + &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordData" ); + } } - if ( !srw_req->recordVersion ){ - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - 7, "recordVersion" ); - } - else { + if ( srw_req->recordVersion ){ rr.record_version = odr_strdup( assoc->encode, srw_req->recordVersion ); @@ -1505,17 +1519,17 @@ static void srw_bend_update(association *assoc, request *req, } else if ( !strcmp( rr.operation, "replace" ) ){ if ( !srw_req->recordId ){ - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - 7, "recordId" ); + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordIdentifier" ); } else { 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, - 7, "recordSchema" ); + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordSchema" ); } else { rr.record_schema = odr_strdup(assoc->encode, @@ -1540,21 +1554,20 @@ static void srw_bend_update(association *assoc, request *req, rr.request_extra_record = srw_req->extra_record; } else { - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - 7, "recordData" ); + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordData" ); } if (srw_req->extraRequestData) rr.extra_request_data = odr_strdup(assoc->encode, srw_req->extraRequestData ); } - else if ( !strcmp( rr.operation, "insert" ) ) - { + 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, - 7, "recordSchema" ); + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordSchema" ); } else { rr.record_schema = odr_strdup(assoc->encode, @@ -1581,13 +1594,18 @@ static void srw_bend_update(association *assoc, request *req, rr.request_extra_record = srw_req->extra_record; } else - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, - 7, "recordData" ); + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 9, "recordData" ); if ( srw_req->extraRequestData ) rr.extra_request_data = odr_strdup(assoc->encode, srw_req->extraRequestData ); } + else { + yaz_add_sru_update_diagnostic(assoc->encode, &srw_res->diagnostics, + &srw_res->num_diagnostics, + 100, rr.operation ); + } if (srw_res->num_diagnostics == 0) { if ( assoc->init->bend_srw_update) @@ -2298,13 +2316,12 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) } yaz_log(log_requestdetail, "Negotiated to v%d: %s", assoc->version, options); - assoc->maximumRecordSize = *req->maximumRecordSize; - if (cb && assoc->maximumRecordSize > cb->maxrecordsize) - assoc->maximumRecordSize = cb->maxrecordsize; - assoc->preferredMessageSize = *req->preferredMessageSize; - if (assoc->preferredMessageSize > assoc->maximumRecordSize) - assoc->preferredMessageSize = assoc->maximumRecordSize; + if (*req->maximumRecordSize < assoc->maximumRecordSize) + assoc->maximumRecordSize = *req->maximumRecordSize; + + if (*req->preferredMessageSize < assoc->preferredMessageSize) + assoc->preferredMessageSize = *req->preferredMessageSize; resp->preferredMessageSize = &assoc->preferredMessageSize; resp->maximumRecordSize = &assoc->maximumRecordSize; @@ -2317,7 +2334,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.95 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.104 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode,