Bump copyright year
[yaz-moved-to-github.git] / src / seshigh.c
index bdfb499..7a52adc 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2010 Index Data
  * See the file LICENSE for details.
  */
 /**
 
 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)