X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=server%2Fseshigh.c;h=542143254c32ff109e3940470242fc60111365b8;hb=962f5f857455567d9b56cc17d96eb95608a0222e;hp=5ad762fd575fb4ffed8a49fab1bdea61df7e523d;hpb=2156e17830e0e3ba739800d6616fa045b0fe5565;p=yaz-moved-to-github.git diff --git a/server/seshigh.c b/server/seshigh.c index 5ad762f..5421432 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,19 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.76 1998-05-27 16:57:07 adam + * Revision 1.80 1998-09-02 12:41:53 adam + * Added decode stream in bend search structures. + * + * Revision 1.79 1998/08/19 16:10:08 adam + * Changed som member names of DeleteResultSetRequest/Response. + * + * Revision 1.78 1998/08/03 10:23:55 adam + * Fixed bug regarding Options for Sort. + * + * 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 +314,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 +412,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 +440,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 +538,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 +596,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 +604,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 +616,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 +765,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 +781,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 +797,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"); @@ -793,7 +823,7 @@ 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)) + if (ODR_MASK_GET(req->options, Z_Options_sort) && binitreq.bend_sort) { ODR_MASK_SET(resp->options, Z_Options_sort); strcat(options, " sort"); @@ -1162,6 +1192,7 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, bsrr->basenames = req->databaseNames; bsrr->query = req->query; bsrr->stream = assoc->encode; + bsrr->decode = assoc->decode; bsrr->errcode = 0; bsrr->hits = 0; bsrr->errstring = NULL; @@ -1180,6 +1211,7 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, bsrq.basenames = req->databaseNames; bsrq.query = req->query; bsrq.stream = assoc->encode; + bsrq.decode = assoc->decode; if (!(bsrt = bend_search(assoc->backend, &bsrq, fd))) return 0; bsrr->hits = bsrt->hits; @@ -1569,6 +1601,43 @@ 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_resultSetList; + 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->deleteListStatuses = 0; + res->numberNotDeleted = 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 +1660,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)