From: Adam Dickmeiss Date: Thu, 29 Jan 1998 13:15:35 +0000 (+0000) Subject: Implemented sort for the backend interface. X-Git-Tag: YAZ.1.8~538 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=7d30eaa32473c738d9fe494a526044e9cb9be658 Implemented sort for the backend interface. --- diff --git a/include/backend.h b/include/backend.h index b4ffc12..6039087 100644 --- a/include/backend.h +++ b/include/backend.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995-1997, Index Data. + * Copyright (c) 1995-1998, Index Data. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation, in whole or in part, for any purpose, is hereby granted, @@ -24,7 +24,10 @@ * OF THIS SOFTWARE. * * $Log: backend.h,v $ - * Revision 1.16 1997-09-17 12:10:31 adam + * Revision 1.17 1998-01-29 13:15:35 adam + * Implemented sort for the backend interface. + * + * Revision 1.16 1997/09/17 12:10:31 adam * YAZ version 1.4. * */ @@ -40,21 +43,6 @@ extern "C" { #endif -typedef struct bend_initrequest -{ - char *configname; - Z_IdAuthentication *auth; - ODR stream; /* encoding stream */ -} bend_initrequest; - -typedef struct bend_initresult -{ - int errcode; /* 0==OK */ - char *errstring; /* system error string or NULL */ - void *handle; /* private handle to the backend module */ -} bend_initresult; - -YAZ_EXPORT bend_initresult MDF *bend_init(bend_initrequest *r); typedef struct bend_searchrequest { @@ -153,6 +141,41 @@ YAZ_EXPORT bend_deleteresult *bend_deleteresponse(void *handle); YAZ_EXPORT void bend_close(void *handle); +typedef struct bend_sortrequest +{ + int num_input_setnames; + char **input_setnames; + char *output_setname; + Z_SortKeySpecList *sort_sequence; + ODR stream; +} bend_sortrequest; + +typedef struct bend_sortresult +{ + int sort_status; + int errcode; + char *errstring; +} bend_sortresult; + +typedef struct bend_initrequest +{ + char *configname; + Z_IdAuthentication *auth; + ODR stream; /* encoding stream */ + + int (*bend_sort) (void *handle, bend_sortrequest *req, + bend_sortresult *res); +} bend_initrequest; + +typedef struct bend_initresult +{ + int errcode; /* 0==OK */ + char *errstring; /* system error string or NULL */ + void *handle; /* private handle to the backend module */ +} bend_initresult; + +YAZ_EXPORT bend_initresult MDF *bend_init(bend_initrequest *r); + #ifdef __cplusplus } #endif diff --git a/server/seshigh.c b/server/seshigh.c index 57389f2..96058d5 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -1,10 +1,13 @@ /* - * 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.69 1997-09-30 11:48:12 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 @@ -277,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 */ @@ -546,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: @@ -683,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."); @@ -690,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 */ @@ -725,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); @@ -1236,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; @@ -1328,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; @@ -1345,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 */