X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=server%2Fseshigh.c;h=cb815fbf7bfb48568d5ac5766ed88c55f464f613;hp=b6ecb75b64b1f25a5566c5b1b1316e5548f25ed6;hb=c3a132ce4aea3bb358b185ef58781b4bef8745fc;hpb=afff2d64ae8758642c8e88bfebff9c00a982daa4 diff --git a/server/seshigh.c b/server/seshigh.c index b6ecb75..cb815fb 100644 --- a/server/seshigh.c +++ b/server/seshigh.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: seshigh.c,v $ - * Revision 1.10 1995-03-27 08:34:24 quinn + * Revision 1.13 1995-03-30 09:09:24 quinn + * Added state-handle and some support for asynchronous activities. + * + * Revision 1.12 1995/03/29 15:40:16 quinn + * Ongoing work. Statserv is now dynamic by default + * + * Revision 1.11 1995/03/28 09:16:21 quinn + * Added record packing to the search request + * + * Revision 1.10 1995/03/27 08:34:24 quinn * Added dynamic server functionality. * Released bindings to session.c (is now redundant) * @@ -88,6 +97,8 @@ void destroy_association(association *h) free(h->encode_buffer); if (h->input_buffer) free(h->input_buffer); + if (h->backend) + bend_close(h->backend); free(h); } @@ -186,6 +197,7 @@ static int process_initRequest(IOCHAN client, Z_InitRequest *req) association *assoc = iochan_getdata(client); bend_initrequest binitreq; bend_initresult *binitres; + Odr_bitmask options, protocolVersion; fprintf(stderr, "Got initRequest.\n"); if (req->implementationId) @@ -202,12 +214,27 @@ static int process_initRequest(IOCHAN client, Z_InitRequest *req) return -1; } + assoc->backend = binitres->handle; apdup = &apdu; apdu.which = Z_APDU_initResponse; apdu.u.initResponse = &resp; resp.referenceId = req->referenceId; - resp.options = req->options; /* should check these */ - resp.protocolVersion = req->protocolVersion; + ODR_MASK_ZERO(&options); + if (ODR_MASK_GET(req->options, Z_Options_search)) + ODR_MASK_SET(&options, Z_Options_search); + if (ODR_MASK_GET(req->options, Z_Options_present)) + ODR_MASK_SET(&options, Z_Options_present); + if (ODR_MASK_GET(req->options, Z_Options_delSet)) + ODR_MASK_SET(&options, Z_Options_delSet); + if (ODR_MASK_GET(req->options, Z_Options_namedResultSets)) + ODR_MASK_SET(&options, Z_Options_namedResultSets); + resp.options = &options; + ODR_MASK_ZERO(&protocolVersion); + if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_1)) + ODR_MASK_SET(&protocolVersion, Z_ProtocolVersion_1); + if (ODR_MASK_GET(req->protocolVersion, Z_ProtocolVersion_2)) + ODR_MASK_SET(&protocolVersion, Z_ProtocolVersion_2); + resp.protocolVersion = &protocolVersion; assoc->maximumRecordSize = *req->maximumRecordSize; /* * This is not so hot. The big todo for ODR is dynamic memory allocation @@ -222,8 +249,8 @@ static int process_initRequest(IOCHAN client, Z_InitRequest *req) resp.maximumRecordSize = &assoc->maximumRecordSize; resp.result = &result; resp.implementationId = "YAZ"; - resp.implementationName = "YAZ/Simple asynchronous test server"; - resp.implementationVersion = "$Revision: 1.10 $"; + resp.implementationName = "Index Data/YAZ Generic Frontend Server"; + resp.implementationVersion = "$Revision: 1.13 $"; resp.userInformationField = 0; if (!z_APDU(assoc->encode, &apdup, 0)) { @@ -325,7 +352,7 @@ static Z_Records *pack_records(association *a, char *setname, int start, } freq.setname = setname; freq.number = recno; - if (!(fres = bend_fetch(&freq))) + if (!(fres = bend_fetch(a->backend, &freq, 0))) { *pres = Z_PRES_FAILURE; return diagrec(a->proto, 2, "Backend interface problem"); @@ -411,10 +438,10 @@ static int process_searchRequest(IOCHAN client, Z_SearchRequest *req) association *assoc = iochan_getdata(client); int nulint = 0; bool_t sr = 1; - int nrp; bend_searchrequest bsrq; bend_searchresult *bsrt; oident *oent; + int next = 0; fprintf(stderr, "Got SearchRequest.\n"); apdup = &apdu; @@ -434,26 +461,61 @@ static int process_searchRequest(IOCHAN client, Z_SearchRequest *req) } if (!resp.records) { + int toget; + Z_ElementSetNames *setnames; + int presst = 0; + bsrq.setname = req->resultSetName; bsrq.replace_set = *req->replaceIndicator; bsrq.num_bases = req->num_databaseNames; bsrq.basenames = req->databaseNames; bsrq.query = req->query; - if (!(bsrt = bend_search(&bsrq))) + if (!(bsrt = bend_search(assoc->backend, &bsrq, 0))) return -1; else if (bsrt->errcode) - resp.records = diagrec(assoc->proto, bsrt->errcode, bsrt->errstring); + resp.records = diagrec(assoc->proto, bsrt->errcode, + bsrt->errstring); else resp.records = 0; resp.resultCount = &bsrt->hits; - resp.numberOfRecordsReturned = &nulint; - nrp = bsrt->hits ? 1 : 0; - resp.nextResultSetPosition = &nrp; - resp.searchStatus = &sr; - resp.resultSetStatus = &sr; - resp.presentStatus = 0; + + /* how many records does the user agent want, then? */ + if (bsrt->hits <= *req->smallSetUpperBound) + { + toget = bsrt->hits; + setnames = req->smallSetElementSetNames; + } + else if (bsrt->hits < *req->largeSetLowerBound) + { + toget = *req->mediumSetPresentNumber; + setnames = req->mediumSetElementSetNames; + } + else + toget = 0; + + if (toget) + { + resp.records = pack_records(assoc, req->resultSetName, 1, &toget, + setnames, &next, &presst); + if (!resp.records) + return -1; + resp.numberOfRecordsReturned = &toget; + resp.nextResultSetPosition = &next; + resp.searchStatus = &sr; + resp.resultSetStatus = &sr; + resp.presentStatus = &presst; + } + else + { + resp.records = 0; + resp.numberOfRecordsReturned = &nulint; + resp.nextResultSetPosition = &nulint; + resp.searchStatus = &sr; + resp.resultSetStatus = &sr; + resp.presentStatus = 0; + } } else {