X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=73d443ab8e02cd7913dada69b3844259e48c751a;hb=7b43d0bb4e3c154246bdaba51b78e9861fd3bd97;hp=dbc9af1beb57771a4f966b01c333fff91635f109;hpb=1ee98ea192555da1959c4012736f7797cc5f91df;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index dbc9af1..73d443a 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.52 2005-04-14 11:59:46 adam Exp $ + * $Id: seshigh.c,v 1.57 2005-06-13 10:27:00 adam Exp $ */ /** * \file seshigh.c @@ -506,7 +506,8 @@ static int srw_bend_init(association *assoc, Z_SRW_diagnostic **d, int *num) if (!(binitres = (*cb->bend_init)(assoc->init))) { assoc->state = ASSOC_DEAD; - yaz_add_srw_diagnostic(assoc->encode, d, num, 3, 0); + yaz_add_srw_diagnostic(assoc->encode, d, num, + YAZ_SRW_AUTHENTICATION_ERROR, 0); return 0; } assoc->backend = binitres->handle; @@ -712,10 +713,7 @@ static void srw_bend_search(association *assoc, request *req, *http_code = 200; yaz_log(log_requestdetail, "Got SRW SearchRetrieveRequest"); srw_bend_init(assoc, &srw_res->diagnostics, &srw_res->num_diagnostics); - if (srw_req->sort_type != Z_SRW_sort_type_none) - yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, 80, 0); - else if (srw_res->num_diagnostics == 0 && assoc->init) + if (srw_res->num_diagnostics == 0 && assoc->init) { bend_search_rr rr; rr.setname = "default"; @@ -723,6 +721,7 @@ static void srw_bend_search(association *assoc, request *req, rr.num_bases = 1; rr.basenames = &srw_req->database; rr.referenceId = 0; + rr.srw_sortKeys = 0; rr.query = (Z_Query *) odr_malloc (assoc->decode, sizeof(*rr.query)); rr.query->u.type_1 = 0; @@ -772,7 +771,7 @@ static void srw_bend_search(association *assoc, request *req, 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); - srw_error = 10; + srw_error = YAZ_SRW_QUERY_SYNTAX_ERROR; } rr.query->which = Z_Query_type_1; @@ -783,7 +782,8 @@ static void srw_bend_search(association *assoc, request *req, else { yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, 11, 0); + &srw_res->num_diagnostics, + YAZ_SRW_UNSUPP_QUERY_TYPE, 0); } if (rr.query->u.type_1) { @@ -791,6 +791,9 @@ static void srw_bend_search(association *assoc, request *req, rr.decode = assoc->decode; rr.print = assoc->print; rr.request = req; + if ( srw_req->sort.sortKeys ) + rr.srw_sortKeys = odr_strdup(assoc->encode, + srw_req->sort.sortKeys ); rr.association = assoc; rr.fd = 0; rr.hits = 0; @@ -802,7 +805,7 @@ static void srw_bend_search(association *assoc, request *req, (assoc->init->bend_search)(assoc->backend, &rr); if (rr.errcode) { - if (rr.errcode == 109) /* database unavailable */ + if (rr.errcode == YAZ_BIB1_DATABASE_UNAVAILABLE) { *http_code = 404; } @@ -832,7 +835,7 @@ static void srw_bend_search(association *assoc, request *req, { yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, &srw_res->num_diagnostics, - 61, 0); + YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0); } else { @@ -848,25 +851,25 @@ static void srw_bend_search(association *assoc, request *req, number * sizeof(*srw_res->records)); for (i = 0; irecords[j].recordPacking = packing; - srw_res->records[j].recordData_buf = 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++; + int errcode; + + srw_res->records[j].recordPacking = packing; + srw_res->records[j].recordData_buf = 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++; } srw_res->num_records = j; if (!j) @@ -1094,12 +1097,13 @@ static void srw_bend_scan(association *assoc, request *req, else { yaz_add_srw_diagnostic(assoc->encode, &srw_res->diagnostics, - &srw_res->num_diagnostics, 4, "scan"); + &srw_res->num_diagnostics, + YAZ_SRW_UNSUPP_OPERATION, "scan"); } if (bsrr->errcode) { int srw_error; - if (bsrr->errcode == 109) /* database unavailable */ + if (bsrr->errcode == YAZ_BIB1_DATABASE_UNAVAILABLE) { *http_code = 404; return; @@ -1639,8 +1643,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) /* no backend. return error */ binitres = odr_malloc(assoc->encode, sizeof(*binitres)); binitres->errstring = 0; - binitres->errcode = 1; - iochan_settimeout(assoc->client_chan, 10); + binitres->errcode = YAZ_BIB1_PERMANENT_SYSTEM_ERROR; + iochan_settimeout(assoc->client_chan, 10); } if ((assoc->init->bend_sort)) yaz_log (YLOG_DEBUG, "Sort handler installed"); @@ -1760,7 +1764,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.52 $"); + version = odr_strdup(assoc->encode, "$Revision: 1.57 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; resp->implementationVersion = odr_prepend(assoc->encode, @@ -1893,6 +1897,9 @@ static Z_Records *pack_records(association *a, char *setname, int start, freq.referenceId = referenceId; freq.schema = 0; (*a->init->bend_fetch)(a->backend, &freq); + + *next = freq.last_in_set ? 0 : recno + 1; + /* backend should be able to signal whether error is system-wide or only pertaining to current record */ if (freq.errcode) @@ -1903,7 +1910,8 @@ static Z_Records *pack_records(association *a, char *setname, int start, *pres = Z_PresentStatus_failure; /* for 'present request out of range', set addinfo to record position if not set */ - if (freq.errcode == 13 && freq.errstring == 0) + if (freq.errcode == YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE && + freq.errstring == 0) { sprintf (s, "%d", recno); freq.errstring = s; @@ -1916,9 +1924,13 @@ static Z_Records *pack_records(association *a, char *setname, int start, surrogatediagrec(a, freq.basename, freq.errcode, freq.errstring); reclist->num_records++; - *next = freq.last_in_set ? 0 : recno + 1; continue; } + if (freq.record == 0) /* no error and no record ? */ + { + *next = 0; /* signal end-of-set and stop */ + break; + } if (freq.len >= 0) this_length = freq.len; else @@ -1945,7 +1957,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist->records[reclist->num_records] = surrogatediagrec(a, freq.basename, 16, 0); reclist->num_records++; - *next = freq.last_in_set ? 0 : recno + 1; dumped_records += this_length; continue; } @@ -1957,7 +1968,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, reclist->records[reclist->num_records] = surrogatediagrec(a, freq.basename, 17, 0); reclist->num_records++; - *next = freq.last_in_set ? 0 : recno + 1; dumped_records += this_length; continue; } @@ -1983,7 +1993,6 @@ static Z_Records *pack_records(association *a, char *setname, int start, return 0; reclist->records[reclist->num_records] = thisrec; reclist->num_records++; - *next = freq.last_in_set ? 0 : recno + 1; } *num = reclist->num_records; return records; @@ -2002,6 +2011,7 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, bsrr->association = assoc; bsrr->referenceId = req->referenceId; save_referenceId (reqb, bsrr->referenceId); + bsrr->srw_sortKeys = 0; yaz_log (log_requestdetail, "ResultSet '%s'", req->resultSetName); if (req->databaseNames) @@ -2335,9 +2345,9 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) for (i = 0; i < req->num_databaseNames; i++) yaz_log (log_requestdetail, "Database '%s'", req->databaseNames[i]); } - yaz_log(log_requestdetail, "pos %d step %d entries %d", - *req->preferredPositionInResponse, *res->stepSize, - *req->numberOfTermsRequested); + bsrr->scanClause = 0; + bsrr->errcode = 0; + bsrr->errstring = 0; bsrr->num_bases = req->num_databaseNames; bsrr->basenames = req->databaseNames; bsrr->num_entries = *req->numberOfTermsRequested; @@ -2469,7 +2479,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) wrbuf_printf(wr, "Partial"); wrbuf_printf(wr, " %d+%d %d ", - *req->preferredPositionInResponse, + (req->preferredPositionInResponse ? + *req->preferredPositionInResponse : 1), *req->numberOfTermsRequested, (res->stepSize ? *res->stepSize : 0)); wrbuf_scan_term(wr, req->termListAndStartPoint,