From: Adam Dickmeiss Date: Mon, 20 Jul 1998 12:38:41 +0000 (+0000) Subject: Implemented delete result set service to server API. X-Git-Tag: YAZ.1.8~459 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=3060b77b776350c6e677c06b3070542dba5c42b6;hp=1b29df1d940a30bca2af0fb5c7e19961520bf230 Implemented delete result set service to server API. --- diff --git a/include/backend.h b/include/backend.h index 9e2f43f..2eb7be4 100644 --- a/include/backend.h +++ b/include/backend.h @@ -24,7 +24,10 @@ * OF THIS SOFTWARE. * * $Log: backend.h,v $ - * Revision 1.20 1998-05-27 16:57:06 adam + * Revision 1.21 1998-07-20 12:38:41 adam + * Implemented delete result set service to server API. + * + * Revision 1.20 1998/05/27 16:57:06 adam * Support for surrogate diagnostic records added for bend_fetch. * * Revision 1.19 1998/03/31 11:07:45 adam @@ -172,21 +175,16 @@ YAZ_EXPORT bend_scanresult *bend_scan(void *handle, bend_scanrequest *r, int *fd); YAZ_EXPORT bend_scanresult *bend_scanresponse(void *handle); -typedef struct bend_deleterequest -{ - char *setname; -} bend_deleterequest; - -typedef struct bend_deleteresult -{ - int errcode; /* 0==success */ - char *errstring; /* system error string or NULL */ -} bend_deleteresult; - -YAZ_EXPORT bend_deleteresult *bend_delete(void *handle, - bend_deleterequest *r, int *fd); -YAZ_EXPORT bend_deleteresult *bend_deleteresponse(void *handle); +/* delete handler */ +typedef struct bend_delete_rr { + int function; + int num_setnames; + char **setnames; + int delete_status; + ODR stream; +} bend_delete_rr; +/* close handler */ YAZ_EXPORT void bend_close(void *handle); /* sort handler */ @@ -225,6 +223,7 @@ typedef struct bend_initrequest int (*bend_search) (void *handle, bend_search_rr *rr); int (*bend_present) (void *handle, bend_present_rr *rr); int (*bend_esrequest) (void *handle, bend_esrequest_rr *rr); + int (*bend_delete)(void *handle, bend_delete_rr *rr); } bend_initrequest; typedef struct bend_initresult @@ -248,7 +247,6 @@ YAZ_EXPORT int bend_backend_respond (bend_association a, bend_request req); YAZ_EXPORT void bend_request_setdata(bend_request r, void *p); YAZ_EXPORT void *bend_request_getdata(bend_request r); - #ifdef __cplusplus } #endif diff --git a/server/seshigh.c b/server/seshigh.c index 5ad762f..ced78e1 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.76 1998-05-27 16:57:07 adam + * Revision 1.77 1998-07-20 12:38:42 adam + * Implemented delete result set service to server API. + * + * Revision 1.76 1998/05/27 16:57:07 adam * Support for surrogate diagnostic records added for bend_fetch. * * Revision 1.75 1998/05/18 10:13:07 adam @@ -302,6 +305,8 @@ 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); void save_referenceId (request *reqb, Z_ReferenceId *refid); +static Z_APDU *process_deleteRequest(association *assoc, request *reqb, + int *fd); static FILE *apduf = 0; /* for use in static mode */ static statserv_options_block *control_block = 0; @@ -398,12 +403,12 @@ void destroy_association(association *h) xfree(h); } -static void do_close(association *a, int reason, char *message) +static void do_close_req(association *a, int reason, char *message, + request *req) { Z_APDU apdu; Z_Close *cls = zget_Close(a->encode); - request *req = request_get(&a->outgoing); - + /* Purge request queue */ while (request_deq(&a->incoming)); while (request_deq(&a->outgoing)); @@ -426,6 +431,11 @@ static void do_close(association *a, int reason, char *message) a->state = ASSOC_DEAD; } +static void do_close(association *a, int reason, char *message) +{ + do_close_req (a, reason, message, request_get(&a->outgoing)); +} + /* * This is where PDUs from the client are read and the further * processing is initiated. Flow of control moves down through the @@ -519,7 +529,8 @@ void ir_session(IOCHAN h, int event) { request_deq(&assoc->incoming); if (process_request(assoc, req) < 0) - do_close(assoc, Z_Close_systemProblem, "Unknown error"); + do_close_req(assoc, Z_Close_systemProblem, "Unknown error", + req); } } if (event & EVENT_OUTPUT) @@ -576,7 +587,6 @@ static int process_request(association *assoc, request *req) res = process_presentRequest(assoc, req, &fd); break; case Z_APDU_scanRequest: res = process_scanRequest(assoc, req, &fd); break; -/* Chas: Added in from DALI */ case Z_APDU_extendedServicesRequest: if (assoc->bend_esrequest) res = process_ESRequest(assoc, req, &fd); @@ -585,7 +595,6 @@ static int process_request(association *assoc, request *req) logf(LOG_WARN, "Cannot handle EXTENDED SERVICES APDU"); return -1; } -/* Chas: End of addition from DALI */ break; case Z_APDU_sortRequest: if (assoc->bend_sort) @@ -598,6 +607,15 @@ static int process_request(association *assoc, request *req) break; case Z_APDU_close: process_close(assoc, req); return 0; + case Z_APDU_deleteResultSetRequest: + if (assoc->bend_delete) + res = process_deleteRequest(assoc, req, &fd); + else + { + logf (LOG_WARN, "Cannot handle Delete APDU"); + return -1; + } + break; default: logf(LOG_WARN, "Bad APDU received"); return -1; @@ -738,6 +756,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) binitreq.bend_search = NULL; binitreq.bend_present = NULL; binitreq.bend_esrequest = NULL; + binitreq.bend_delete = NULL; if (!(binitres = bend_init(&binitreq))) { logf(LOG_WARN, "Bad response from backend."); @@ -753,6 +772,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) logf (LOG_DEBUG, "Present handler installed"); if ((assoc->bend_esrequest = (int (*)())binitreq.bend_esrequest)) logf (LOG_DEBUG, "ESRequest handler installed"); + if ((assoc->bend_delete = (int (*)())binitreq.bend_delete)) + logf (LOG_DEBUG, "Delete handler installed"); resp->referenceId = req->referenceId; *options = '\0'; @@ -767,7 +788,7 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb) ODR_MASK_SET(resp->options, Z_Options_present); strcat(options, " prst"); } - if (ODR_MASK_GET(req->options, Z_Options_delSet)) + if (ODR_MASK_GET(req->options, Z_Options_delSet) && binitreq.bend_delete) { ODR_MASK_SET(resp->options, Z_Options_delSet); strcat(options, " del"); @@ -1569,6 +1590,45 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, return apdu; } +static Z_APDU *process_deleteRequest(association *assoc, request *reqb, + int *fd) +{ + Z_DeleteResultSetRequest *req = reqb->request->u.deleteResultSetRequest; + Z_DeleteResultSetResponse *res = (Z_DeleteResultSetResponse *) + odr_malloc (assoc->encode, sizeof(*res)); + bend_delete_rr *bdrr = (bend_delete_rr *) + odr_malloc (assoc->encode, sizeof(*bdrr)); + Z_APDU *apdu = (Z_APDU *)odr_malloc (assoc->encode, sizeof(*apdu)); + + logf(LOG_LOG, "Got DeleteRequest."); + + bdrr->num_setnames = req->num_ids; + bdrr->setnames = req->resultSetList; + bdrr->stream = assoc->encode; + bdrr->function = *req->deleteFunction; + + ((int (*)(void *, bend_delete_rr *)) + (*assoc->bend_delete))(assoc->backend, bdrr); + + res->referenceId = req->referenceId; + + res->deleteOperationStatus = (int *) + odr_malloc (assoc->encode, sizeof(*res->deleteOperationStatus)); + *res->deleteOperationStatus = bdrr->delete_status; + + res->num_statuses = 0; + res->deleteListStatuses = 0; + res->numberNotDeleted = 0; + res->num_bulkStatuses = 0; + res->bulkStatuses = 0; + res->deleteMessage = 0; + res->otherInfo = 0; + + apdu->which = Z_APDU_deleteResultSetResponse; + apdu->u.deleteResultSetResponse = res; + return apdu; +} + static void process_close(association *assoc, request *reqb) { Z_Close *req = reqb->request->u.close; @@ -1591,7 +1651,8 @@ static void process_close(association *assoc, request *reqb) req->diagnosticInformation : "NULL"); if (assoc->version < 3) /* to make do_force respond with close */ assoc->version = 3; - do_close(assoc, Z_Close_finished, "Association terminated by client"); + do_close_req(assoc, Z_Close_finished, "Association terminated by client", + reqb); } void save_referenceId (request *reqb, Z_ReferenceId *refid) diff --git a/server/session.h b/server/session.h index 251b89e..79f5604 100644 --- a/server/session.h +++ b/server/session.h @@ -4,7 +4,10 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: session.h,v $ - * Revision 1.16 1998-03-31 11:07:45 adam + * Revision 1.17 1998-07-20 12:38:43 adam + * Implemented delete result set service to server API. + * + * Revision 1.16 1998/03/31 11:07:45 adam * Furhter work on UNIverse resource report. * Added Extended Services handling in frontend server. * @@ -138,6 +141,7 @@ typedef struct association int (*bend_search) (); int (*bend_present) (); int (*bend_esrequest) (); + int (*bend_delete) (); } association; association *create_association(IOCHAN channel, COMSTACK link); diff --git a/ztest/ztest.c b/ztest/ztest.c index 614df28..6bcf04d 100644 --- a/ztest/ztest.c +++ b/ztest/ztest.c @@ -7,7 +7,10 @@ * Chas Woodfield, Fretwell Downing Datasystems. * * $Log: ztest.c,v $ - * Revision 1.11 1998-06-09 13:55:08 adam + * Revision 1.12 1998-07-20 12:38:44 adam + * Implemented delete result set service to server API. + * + * Revision 1.11 1998/06/09 13:55:08 adam * Minor changes. * * Revision 1.10 1998/05/27 16:55:54 adam @@ -63,6 +66,7 @@ int ztest_search (void *handle, bend_search_rr *rr); int ztest_sort (void *handle, bend_sort_rr *rr); int ztest_present (void *handle, bend_present_rr *rr); int ztest_esrequest (void *handle, bend_esrequest_rr *rr); +int ztest_delete (void *handle, bend_delete_rr *rr); bend_initresult *bend_init(bend_initrequest *q) { @@ -76,6 +80,7 @@ bend_initresult *bend_init(bend_initrequest *q) q->bend_search = ztest_search; /* register search handler */ q->bend_present = ztest_present; /* register present handle */ q->bend_esrequest = ztest_esrequest; + q->bend_delete = ztest_delete; return r; } @@ -96,6 +101,15 @@ int ztest_esrequest (void *handle, bend_esrequest_rr *rr) return 0; } +int ztest_delete (void *handle, bend_delete_rr *rr) +{ + if (rr->num_setnames == 1 && !strcmp (rr->setnames[0], "1")) + rr->delete_status = Z_DeleteStatus_success; + else + rr->delete_status = Z_DeleteStatus_resultSetDidNotExist; + return 0; +} + /* Obsolete bend_search, never called because handler is registered */ bend_searchresult *bend_search(void *handle, bend_searchrequest *q, int *fd) { @@ -238,11 +252,6 @@ bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *q, int *num) return r; } -bend_deleteresult *bend_delete(void *handle, bend_deleterequest *q, int *num) -{ - return 0; -} - /* * silly dummy-scan what reads words from a file. */