X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=96058d5cbdbc45116a1247dee5593ee4bd0b282c;hb=deb4dce69ad5af12594d5712c8b50d8b84f8d9a0;hp=31ef8661e23d3561cb6d871091af502d8dbeb656;hpb=79bf9f1b8b224b6b7323b280fca704591ac17324;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index 31ef866..96058d5 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -1,10 +1,16 @@ /* - * Copyright (c) 1995, Index Data + * Copyright (c) 1995-1998, Index Data * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.68 1997-09-29 13:18:59 adam + * Revision 1.70 1998-01-29 13:15:35 adam + * Implemented sort for the backend interface. + * + * Revision 1.69 1997/09/30 11:48:12 adam + * Fixed bug introduced by previous commit. + * + * Revision 1.68 1997/09/29 13:18:59 adam * Added function, oid_ent_to_oid, to replace the function * oid_getoidbyent, which is not thread safe. * @@ -274,6 +280,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, static Z_APDU *process_presentRequest(association *assoc, request *reqb, int *fd); static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd); +static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd); static void process_close(association *assoc, request *reqb); static FILE *apduf = 0; /* for use in static mode */ @@ -543,6 +550,15 @@ static int process_request(association *assoc) res = process_presentRequest(assoc, req, &fd); break; case Z_APDU_scanRequest: res = process_scanRequest(assoc, req, &fd); break; + case Z_APDU_sortRequest: + if (assoc->bend_sort) + res = process_sortRequest(assoc, req, &fd); + else + { + logf(LOG_WARN, "Cannot handle SORT APDU"); + return -1; + } + break; case Z_APDU_close: process_close(assoc, req); return 0; default: @@ -680,6 +696,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) binitreq.stream = assoc->encode; binitreq.configname = "default-config"; binitreq.auth = req->idAuthentication; + binitreq.bend_sort = NULL; if (!(binitres = bend_init(&binitreq))) { logf(LOG_WARN, "Bad response from backend."); @@ -687,6 +704,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) } assoc->backend = binitres->handle; + if ((assoc->bend_sort = binitreq.bend_sort)) + logf (LOG_DEBUG, "Sort handler installed"); resp->referenceId = req->referenceId; *options = '\0'; /* let's tell the client what we can do */ @@ -722,7 +741,11 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) ODR_MASK_SET(resp->options, Z_Options_concurrentOperations); strcat(options, " concurop"); } - + if (ODR_MASK_GET(req->options, Z_Options_sort && binitreq.bend_sort)) + { + ODR_MASK_SET(resp->options, Z_Options_sort); + strcat(options, " sort"); + } if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1)) { ODR_MASK_SET(resp->protocolVersion, Z_ProtocolVersion_1); @@ -790,7 +813,8 @@ static Z_Records *diagrec(association *assoc, int error, char *addinfo) #else rec->u.nonSurrogateDiagnostic = dr; #endif - dr->diagnosticSetId = oid_ent_to_oid(&bib1, oid); + dr->diagnosticSetId = odr_oiddup (assoc->encode, + oid_ent_to_oid(&bib1, oid)); dr->condition = err; dr->which = Z_DiagForm_v2AddInfo; dr->addinfo = addinfo ? addinfo : ""; @@ -821,7 +845,8 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname, rec->u.surrogateDiagnostic = drec; drec->which = Z_DiagRec_defaultFormat; drec->u.defaultFormat = dr; - dr->diagnosticSetId = oid_ent_to_oid(&bib1, oid); + dr->diagnosticSetId = odr_oiddup (assoc->encode, + oid_ent_to_oid(&bib1, oid)); dr->condition = err; dr->which = Z_DiagForm_v2AddInfo; dr->addinfo = addinfo ? addinfo : ""; @@ -853,7 +878,8 @@ static Z_DiagRecs *diagrecs(association *assoc, int error, char *addinfo) drec->which = Z_DiagRec_defaultFormat; drec->u.defaultFormat = rec; - rec->diagnosticSetId = oid_ent_to_oid(&bib1, oid); + rec->diagnosticSetId = odr_oiddup (assoc->encode, + oid_ent_to_oid(&bib1, oid)); rec->condition = err; rec->which = Z_DiagForm_v2AddInfo; rec->addinfo = addinfo ? addinfo : ""; @@ -968,7 +994,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, recform.oclass = CLASS_RECSYN; recform.value = fres->format; thisext->direct_reference = odr_oiddup(a->encode, - oid_ent_to_oid(&recform, oid)); + oid_ent_to_oid(&recform, oid)); thisext->indirect_reference = 0; thisext->descriptor = 0; if (fres->len < 0) /* Structured data */ @@ -1230,7 +1256,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) bend_scanresult *srs; oident *attset; - logf(LOG_LOG, "Got scanrequest"); + logf(LOG_LOG, "Got ScanRequest"); *scanStatus = Z_Scan_failure; *numberOfEntriesReturned = 0; @@ -1322,6 +1348,43 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) return apdu; } +static Z_APDU *process_sortRequest(association *assoc, request *reqb, + int *fd) +{ + Z_SortRequest *req = reqb->request->u.sortRequest; + Z_SortResponse *res = odr_malloc (assoc->encode, sizeof(*res)); + bend_sortrequest bsrq; + bend_sortresult *bsrt; + Z_APDU *apdu = odr_malloc (assoc->encode, sizeof(*apdu)); + + logf(LOG_LOG, "Got SortRequest."); + + bsrq.num_input_setnames = req->inputResultSetNames->num_strings; + bsrq.input_setnames = req->inputResultSetNames->strings; + bsrq.output_setname = req->sortedResultSetName; + bsrq.sort_sequence = req->sortSequence; + bsrq.stream = assoc->encode; + + bsrt = odr_malloc (assoc->encode, sizeof(*bsrt)); + bsrt->sort_status = Z_SortStatus_failure; + bsrt->errcode = 0; + bsrt->errstring = 0; + + (*assoc->bend_sort)(assoc->backend, &bsrq, bsrt); + + res->referenceId = req->referenceId; + res->sortStatus = odr_malloc (assoc->encode, sizeof(*res->sortStatus)); + *res->sortStatus = bsrt->sort_status; + res->resultSetStatus = 0; + if (bsrt->errcode) + res->diagnostics = diagrecs(assoc, bsrt->errcode, bsrt->errstring); + res->otherInfo = 0; + + apdu->which = Z_APDU_sortResponse; + apdu->u.sortResponse = res; + return apdu; +} + static void process_close(association *assoc, request *reqb) { Z_Close *req = reqb->request->u.close; @@ -1339,7 +1402,7 @@ static void process_close(association *assoc, request *reqb) "unspecified" }; - logf(LOG_LOG, "Got close, reason %s, message %s", + logf(LOG_LOG, "Got Close, reason %s, message %s", reasons[*req->closeReason], req->diagnosticInformation ? req->diagnosticInformation : "NULL"); if (assoc->version < 3) /* to make do_force respond with close */