X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fseshigh.c;h=b05860f697c9365dd5ac66df0ea9402b253d4e47;hb=8981acaf5c0aaf34a70f01178f22591bb8b3e19d;hp=bdfb499854f513bc8f12d6441f09048328134534;hpb=0c5aa5100f29ca832bf6428d8ec92618a0fc027f;p=yaz-moved-to-github.git diff --git a/src/seshigh.c b/src/seshigh.c index bdfb499..b05860f 100644 --- a/src/seshigh.c +++ b/src/seshigh.c @@ -78,27 +78,21 @@ static void process_gdu_request(association *assoc, request *req); static int process_z_request(association *assoc, request *req, char **msg); -void backend_response(IOCHAN i, int event); static int process_gdu_response(association *assoc, request *req, Z_GDU *res); static int process_z_response(association *assoc, request *req, Z_APDU *res); static Z_APDU *process_initRequest(association *assoc, request *reqb); static Z_External *init_diagnostics(ODR odr, int errcode, const char *errstring); -static Z_APDU *process_searchRequest(association *assoc, request *reqb, - int *fd); +static Z_APDU *process_searchRequest(association *assoc, request *reqb); static Z_APDU *response_searchRequest(association *assoc, request *reqb, - bend_search_rr *bsrr, int *fd); -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); + bend_search_rr *bsrr); +static Z_APDU *process_presentRequest(association *assoc, request *reqb); +static Z_APDU *process_scanRequest(association *assoc, request *reqb); +static Z_APDU *process_sortRequest(association *assoc, request *reqb); 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 Z_APDU *process_deleteRequest(association *assoc, request *reqb); static Z_APDU *process_segmentRequest(association *assoc, request *reqb); - -static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd); +static Z_APDU *process_ESRequest(association *assoc, request *reqb); /* dynamic logging levels */ static int logbits_set = 0; @@ -120,21 +114,18 @@ static void get_logbits(void) } } - - static void wr_diag(WRBUF w, int error, const char *addinfo) { wrbuf_printf(w, "ERROR %d+", error); wrbuf_puts_replace_char(w, diagbib1_str(error), ' ', '_'); - if (addinfo){ + if (addinfo) + { wrbuf_puts(w, "+"); wrbuf_puts_replace_char(w, addinfo, ' ', '_'); } - wrbuf_puts(w, " "); } - /* * Create and initialize a new association-handle. * channel : iochannel for the current line. @@ -261,7 +252,7 @@ static void do_close_req(association *a, int reason, char *message, static void do_close(association *a, int reason, char *message) { request *req = request_get(&a->outgoing); - do_close_req (a, reason, message, req); + do_close_req(a, reason, message, req); } @@ -485,7 +476,7 @@ static int process_z_request(association *assoc, request *req, char **msg); static void assoc_init_reset(association *assoc) { - xfree (assoc->init); + xfree(assoc->init); assoc->init = (bend_initrequest *) xmalloc(sizeof(*assoc->init)); assoc->init->stream = assoc->encode; @@ -828,13 +819,15 @@ static int cql2pqf_scan(ODR odr, const char *cql, cql_transform_t ct, static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset, - bend_search_rr *bsrr) { + bend_search_rr *bsrr) +{ char *ccl0; struct ccl_rpn_node *node; int errcode, pos; ccl0 = odr_strdupn(odr, (char*) ccl->buf, ccl->len); - if ((node = ccl_find_str(bibset, ccl0, &errcode, &pos)) == 0) { + if ((node = ccl_find_str(bibset, ccl0, &errcode, &pos)) == 0) + { bsrr->errstring = (char*) ccl_err_msg(errcode); return YAZ_SRW_QUERY_SYNTAX_ERROR; /* Query syntax error */ } @@ -941,12 +934,10 @@ static void srw_bend_search(association *assoc, request *req, rr.stream = assoc->encode; rr.decode = assoc->decode; rr.print = assoc->print; - rr.request = req; if ( srw_req->sort.sortKeys ) rr.srw_sortKeys = odr_strdup(assoc->encode, srw_req->sort.sortKeys ); rr.association = assoc; - rr.fd = 0; rr.hits = 0; rr.errcode = 0; rr.errstring = 0; @@ -1028,14 +1019,11 @@ static void srw_bend_search(association *assoc, request *req, bprr->stream = assoc->encode; bprr->referenceId = 0; bprr->print = assoc->print; - bprr->request = req; bprr->association = assoc; bprr->errcode = 0; bprr->errstring = NULL; (*assoc->init->bend_present)(assoc->backend, bprr); - if (!bprr->request) - return; if (bprr->errcode) { srw_error = yaz_diag_bib1_to_srw(bprr->errcode); @@ -1955,7 +1943,6 @@ static void process_gdu_request(association *assoc, request *req) */ static int process_z_request(association *assoc, request *req, char **msg) { - int fd = -1; Z_APDU *res; int retval; @@ -1971,12 +1958,12 @@ static int process_z_request(association *assoc, request *req, char **msg) case Z_APDU_initRequest: res = process_initRequest(assoc, req); break; case Z_APDU_searchRequest: - res = process_searchRequest(assoc, req, &fd); break; + res = process_searchRequest(assoc, req); break; case Z_APDU_presentRequest: - res = process_presentRequest(assoc, req, &fd); break; + res = process_presentRequest(assoc, req); break; case Z_APDU_scanRequest: if (assoc->init->bend_scan) - res = process_scanRequest(assoc, req, &fd); + res = process_scanRequest(assoc, req); else { *msg = "Cannot handle Scan APDU"; @@ -1985,7 +1972,7 @@ static int process_z_request(association *assoc, request *req, char **msg) break; case Z_APDU_extendedServicesRequest: if (assoc->init->bend_esrequest) - res = process_ESRequest(assoc, req, &fd); + res = process_ESRequest(assoc, req); else { *msg = "Cannot handle Extended Services APDU"; @@ -1994,7 +1981,7 @@ static int process_z_request(association *assoc, request *req, char **msg) break; case Z_APDU_sortRequest: if (assoc->init->bend_sort) - res = process_sortRequest(assoc, req, &fd); + res = process_sortRequest(assoc, req); else { *msg = "Cannot handle Sort APDU"; @@ -2006,7 +1993,7 @@ static int process_z_request(association *assoc, request *req, char **msg) return 0; case Z_APDU_deleteResultSetRequest: if (assoc->init->bend_delete) - res = process_deleteRequest(assoc, req, &fd); + res = process_deleteRequest(assoc, req); else { *msg = "Cannot handle Delete APDU"; @@ -2035,69 +2022,15 @@ static int process_z_request(association *assoc, request *req, char **msg) yaz_log(YLOG_DEBUG, " result immediately available"); retval = process_z_response(assoc, req, res); } - else if (fd < 0) + else { yaz_log(YLOG_DEBUG, " result unavailble"); - retval = 0; - } - else /* no result yet - one will be provided later */ - { - IOCHAN chan; - - /* Set up an I/O handler for the fd supplied by the backend */ - - yaz_log(YLOG_DEBUG, " establishing handler for result"); - req->state = REQUEST_PENDING; - if (!(chan = iochan_create(fd, backend_response, EVENT_INPUT, 0))) - abort(); - iochan_setdata(chan, assoc); - retval = 0; + retval = -1; } return retval; } /* - * Handle message from the backend. - */ -void backend_response(IOCHAN i, int event) -{ - association *assoc = (association *)iochan_getdata(i); - request *req = request_head(&assoc->incoming); - Z_APDU *res; - int fd; - - yaz_log(YLOG_DEBUG, "backend_response"); - assert(assoc && req && req->state != REQUEST_IDLE); - /* determine what it is we're waiting for */ - switch (req->apdu_request->which) - { - case Z_APDU_searchRequest: - res = response_searchRequest(assoc, req, 0, &fd); break; -#if 0 - case Z_APDU_presentRequest: - res = response_presentRequest(assoc, req, 0, &fd); break; - case Z_APDU_scanRequest: - res = response_scanRequest(assoc, req, 0, &fd); break; -#endif - default: - yaz_log(YLOG_FATAL, "Serious programmer's lapse or bug"); - abort(); - } - if ((res && process_z_response(assoc, req, res) < 0) || fd < 0) - { - yaz_log(YLOG_WARN, "Fatal error when talking to backend"); - do_close(assoc, Z_Close_systemProblem, 0); - iochan_destroy(i); - return; - } - else if (!res) /* no result yet - try again later */ - { - yaz_log(YLOG_DEBUG, " no result yet"); - iochan_setfd(i, fd); /* in case fd has changed */ - } -} - -/* * Encode response, and transfer the request structure to the outgoing queue. */ static int process_gdu_response(association *assoc, request *req, Z_GDU *res) @@ -2537,7 +2470,7 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start, if (freq.errcode == YAZ_BIB1_PRESENT_REQUEST_OUT_OF_RANGE && freq.errstring == 0) { - sprintf (s, "%d", recno); + sprintf(s, "%d", recno); freq.errstring = s; } if (errcode) @@ -2617,19 +2550,15 @@ static Z_Records *pack_records(association *a, char *setname, Odr_int start, return records; } -static Z_APDU *process_searchRequest(association *assoc, request *reqb, - int *fd) +static Z_APDU *process_searchRequest(association *assoc, request *reqb) { Z_SearchRequest *req = reqb->apdu_request->u.searchRequest; bend_search_rr *bsrr = (bend_search_rr *)nmem_malloc(reqb->request_mem, sizeof(*bsrr)); yaz_log(log_requestdetail, "Got SearchRequest."); - bsrr->fd = fd; - bsrr->request = reqb; bsrr->association = assoc; bsrr->referenceId = req->referenceId; - save_referenceId (reqb, bsrr->referenceId); bsrr->srw_sortKeys = 0; bsrr->srw_setname = 0; bsrr->srw_setnameIdleTime = 0; @@ -2689,19 +2618,15 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb, if (!bsrr->errcode) (assoc->init->bend_search)(assoc->backend, bsrr); - if (!bsrr->request) /* backend not ready with the search response */ - return 0; /* should not be used any more */ } else { /* FIXME - make a diagnostic for it */ yaz_log(YLOG_WARN,"Search not supported ?!?!"); } - return response_searchRequest(assoc, reqb, bsrr, fd); + return response_searchRequest(assoc, reqb, bsrr); } -int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;} - /* * Prepare a searchresponse based on the backend results. We probably want * to look at making the fetching of records nonblocking as well, but @@ -2710,7 +2635,7 @@ int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;} * event, and we'll have to get the response for ourselves. */ static Z_APDU *response_searchRequest(association *assoc, request *reqb, - bend_search_rr *bsrt, int *fd) + bend_search_rr *bsrt) { Z_SearchRequest *req = reqb->apdu_request->u.searchRequest; Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu)); @@ -2726,8 +2651,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, resp->referenceId = req->referenceId; resp->additionalSearchInfo = 0; resp->otherInfo = 0; - *fd = -1; - if (!bsrt && !bend_searchresponse(assoc->backend, bsrt)) + if (!bsrt) { yaz_log(YLOG_FATAL, "Bad result from backend"); return 0; @@ -2790,14 +2714,11 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, bprr->referenceId = req->referenceId; bprr->stream = assoc->encode; bprr->print = assoc->print; - bprr->request = reqb; bprr->association = assoc; bprr->errcode = 0; bprr->errstring = NULL; (*assoc->init->bend_present)(assoc->backend, bprr); - if (!bprr->request) - return 0; if (bprr->errcode) { resp->records = diagrec(assoc, bprr->errcode, bprr->errstring); @@ -2844,7 +2765,8 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, int i; WRBUF wr = wrbuf_alloc(); - for (i = 0 ; i < req->num_databaseNames; i++){ + for (i = 0 ; i < req->num_databaseNames; i++) + { if (i) wrbuf_printf(wr, "+"); wrbuf_puts(wr, req->databaseNames[i]); @@ -2880,8 +2802,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb, * operation is more fun in operations that have an unpredictable execution * speed - which is normally more true for search than for present. */ -static Z_APDU *process_presentRequest(association *assoc, request *reqb, - int *fd) +static Z_APDU *process_presentRequest(association *assoc, request *reqb) { Z_PresentRequest *req = reqb->apdu_request->u.presentRequest; Z_APDU *apdu; @@ -2908,14 +2829,11 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, bprr->referenceId = req->referenceId; bprr->stream = assoc->encode; bprr->print = assoc->print; - bprr->request = reqb; bprr->association = assoc; bprr->errcode = 0; bprr->errstring = NULL; (*assoc->init->bend_present)(assoc->backend, bprr); - if (!bprr->request) - return 0; /* should not happen */ if (bprr->errcode) { resp->records = diagrec(assoc, bprr->errcode, bprr->errstring); @@ -2974,7 +2892,7 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb, * Scan was implemented rather in a hurry, and with support for only the basic * elements of the service in the backend API. Suggestions are welcome. */ -static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) +static Z_APDU *process_scanRequest(association *assoc, request *reqb) { Z_ScanRequest *req = reqb->apdu_request->u.scanRequest; Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu)); @@ -3179,8 +3097,7 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd) return apdu; } -static Z_APDU *process_sortRequest(association *assoc, request *reqb, - int *fd) +static Z_APDU *process_sortRequest(association *assoc, request *reqb) { int i; Z_SortRequest *req = reqb->apdu_request->u.sortRequest; @@ -3256,8 +3173,7 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb, return apdu; } -static Z_APDU *process_deleteRequest(association *assoc, request *reqb, - int *fd) +static Z_APDU *process_deleteRequest(association *assoc, request *reqb) { int i; Z_DeleteResultSetRequest *req = @@ -3367,72 +3283,6 @@ static void process_close(association *assoc, request *reqb) yaz_log(log_request,"Close OK"); } -void save_referenceId(request *reqb, Z_ReferenceId *refid) -{ - if (refid) - { - reqb->len_refid = refid->len; - reqb->refid = (char *)nmem_malloc(reqb->request_mem, refid->len); - memcpy(reqb->refid, refid->buf, refid->len); - } - else - { - reqb->len_refid = 0; - reqb->refid = NULL; - } -} - -void bend_request_send(bend_association a, bend_request req, Z_APDU *res) -{ - process_z_response(a, req, res); -} - -bend_request bend_request_mk(bend_association a) -{ - request *nreq = request_get(&a->outgoing); - nreq->request_mem = nmem_create(); - return nreq; -} - -Z_ReferenceId *bend_request_getid(ODR odr, bend_request req) -{ - Z_ReferenceId *id; - if (!req->refid) - return 0; - id = (Odr_oct *)odr_malloc(odr, sizeof(*odr)); - id->buf = (unsigned char *)odr_malloc(odr, req->len_refid); - id->len = id->size = req->len_refid; - memcpy(id->buf, req->refid, req->len_refid); - return id; -} - -void bend_request_destroy(bend_request *req) -{ - nmem_destroy((*req)->request_mem); - request_release(*req); - *req = NULL; -} - -int bend_backend_respond(bend_association a, bend_request req) -{ - char *msg; - int r; - r = process_z_request(a, req, &msg); - if (r < 0) - yaz_log(YLOG_WARN, "%s", msg); - return r; -} - -void bend_request_setdata(bend_request r, void *p) -{ - r->clientData = p; -} - -void *bend_request_getdata(bend_request r) -{ - return r->clientData; -} - static Z_APDU *process_segmentRequest(association *assoc, request *reqb) { bend_segment_rr req; @@ -3448,7 +3298,7 @@ static Z_APDU *process_segmentRequest(association *assoc, request *reqb) return 0; } -static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) +static Z_APDU *process_ESRequest(association *assoc, request *reqb) { bend_esrequest_rr esrequest; const char *ext_name = "unknown"; @@ -3465,11 +3315,9 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) esrequest.print = assoc->print; esrequest.errcode = 0; esrequest.errstring = NULL; - esrequest.request = reqb; esrequest.association = assoc; esrequest.taskPackage = 0; esrequest.referenceId = req->referenceId; - if (esrequest.esr && esrequest.esr->taskSpecificParameters) { @@ -3489,10 +3337,6 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd) (*assoc->init->bend_esrequest)(assoc->backend, &esrequest); - /* If the response is being delayed, return NULL */ - if (esrequest.request == NULL) - return(NULL); - resp->referenceId = req->referenceId; if (esrequest.errcode == -1)