Added support for extended handlers in backend server interface.
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 10 Feb 1998 11:03:56 +0000 (11:03 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 10 Feb 1998 11:03:56 +0000 (11:03 +0000)
CHANGELOG
include/backend.h
server/requestq.c
server/seshigh.c
server/session.h
ztest/ztest.c

index 544b6cb..617c7a0 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,23 @@
 Possible compatibility problems with earlier versions marked with '*'.
 
+Added command "refid" to client which specifies referenceId for
+the following requests.
+
+Implemented "extended" service handling for server. See ztest.c
+for an example as well as backend.h. New handlers are registerd
+in the Init handler.
+
+* Changed interface for sort in server.
+
+Added new members to statserv_options_block. It allows a server
+to read options from another source than just the command line.
+
+* Changed definition of Z_Triple in file prt-grs.h - member boolean
+renamed to zboolean. Some C++ compilers complained about the name.
+
+Minor changes to gils.abs. Added index 's' (sort) on title
+and date/time-last-modified.
+
 --- 1.4pl2 1998/1/30
 
 Fixed bug in server library regarding inetd mode (-i). This bug
index 6039087..e07c216 100644 (file)
  * OF THIS SOFTWARE.
  *
  * $Log: backend.h,v $
- * Revision 1.17  1998-01-29 13:15:35  adam
+ * Revision 1.18  1998-02-10 11:03:56  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.17  1998/01/29 13:15:35  adam
  * Implemented sort for the backend interface.
  *
  * Revision 1.16  1997/09/17 12:10:31  adam
 #ifdef __cplusplus
 extern "C" {
 #endif
+    
+typedef struct request *bend_request;
+typedef struct association *bend_association;
 
-
-typedef struct bend_searchrequest
+/* old search request input */ 
+typedef struct 
 {
     char *setname;             /* name to give to this set */
     int replace_set;           /* replace set, if it already exists */
@@ -54,18 +60,52 @@ typedef struct bend_searchrequest
     ODR stream;                /* encoding stream */
 } bend_searchrequest;
 
-typedef struct bend_searchresult
+/* old search request output */
+typedef struct
 {
     int hits;                  /* number of hits */
     int errcode;               /* 0==OK */
     char *errstring;           /* system error string or NULL */
 } bend_searchresult;
 
+/* extended search handler (rr = request response) */
+typedef struct {
+    char *setname;             /* name to give to this set */
+    int replace_set;           /* replace set, if it already exists */
+    int num_bases;             /* number of databases in list */
+    char **basenames;          /* databases to search */
+    Z_Query *query;            /* query structure */
+    ODR stream;                /* encode stream */
+
+    bend_request request;
+    bend_association association;
+    int *fd;
+    int hits;                  /* number of hits */
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+} bend_search_rr;
+
+/* extended present handler. Does not replace bend_fetch. */
+typedef struct {
+    char *setname;             /* set name */
+    int start;
+    int number;                /* record number */
+    oid_value format;          /* One of the CLASS_RECSYN members */
+    Z_RecordComposition *comp; /* Formatting instructions */
+    ODR stream;                /* encoding stream - memory source if required */
+    bend_request request;
+    bend_association association;
+
+    int hits;                  /* number of hits */
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+} bend_present_rr;
+
 YAZ_EXPORT bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
                                           int *fd);
-YAZ_EXPORT bend_searchresult *bend_searchresponse(void *handle);
+YAZ_EXPORT int bend_searchresponse(void *handle, bend_search_rr *bsrr);
 
-typedef struct bend_fetchrequest
+typedef struct
 {
     char *setname;             /* set name */
     int number;                /* record number */
@@ -74,7 +114,7 @@ typedef struct bend_fetchrequest
     ODR stream;                /* encoding stream - memory source if required */
 } bend_fetchrequest;
 
-typedef struct bend_fetchresult
+typedef struct
 {
     char *basename;            /* name of database that provided record */
     int len;                   /* length of record or -1 if structured */
@@ -89,7 +129,7 @@ YAZ_EXPORT bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
                                         int *fd);
 YAZ_EXPORT bend_fetchresult *bend_fetchresponse(void *handle);
 
-typedef struct bend_scanrequest
+typedef struct
 {
     int num_bases;      /* number of elements in databaselist */
     char **basenames;   /* databases to search */
@@ -141,21 +181,19 @@ YAZ_EXPORT bend_deleteresult *bend_deleteresponse(void *handle);
 
 YAZ_EXPORT void bend_close(void *handle);
 
-typedef struct bend_sortrequest 
+/* sort handler */
+typedef struct bend_sort_rr
 {
     int num_input_setnames;
     char **input_setnames;
     char *output_setname;
     Z_SortKeySpecList *sort_sequence;
     ODR stream;
-} bend_sortrequest;
 
-typedef struct bend_sortresult
-{
     int sort_status;
     int errcode;
     char *errstring;
-} bend_sortresult;
+} bend_sort_rr;
 
 typedef struct bend_initrequest
 {
@@ -163,8 +201,9 @@ typedef struct bend_initrequest
     Z_IdAuthentication *auth;
     ODR stream;                /* encoding stream */
     
-    int (*bend_sort) (void *handle, bend_sortrequest *req,
-                     bend_sortresult *res);
+    int (*bend_sort) (void *handle, bend_sort_rr *rr);
+    int (*bend_search) (void *handle, bend_search_rr *rr);
+    int (*bend_present) (void *handle, bend_present_rr *rr);
 } bend_initrequest;
 
 typedef struct bend_initresult
@@ -174,7 +213,19 @@ typedef struct bend_initresult
     void *handle;              /* private handle to the backend module */
 } bend_initresult;
 
-YAZ_EXPORT bend_initresult MDF *bend_init(bend_initrequest *r);   
+YAZ_EXPORT bend_initresult *bend_init(bend_initrequest *r);
+
+YAZ_EXPORT void bend_request_send (bend_association a, bend_request req,
+                                  Z_APDU *res);
+
+YAZ_EXPORT bend_request bend_request_mk (bend_association a);
+
+YAZ_EXPORT void bend_request_destroy (bend_request *req);
+
+YAZ_EXPORT Z_ReferenceId *bend_request_getid (ODR odr, bend_request req);
+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
 }
index da4884e..9eeed20 100644 (file)
@@ -1,10 +1,13 @@
 /*
- * Copyright (C) 1994, Index Data.
+ * Copyright (C) 1994-1998, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: requestq.c,v $
- * Revision 1.4  1997-10-27 13:55:03  adam
+ * Revision 1.5  1998-02-10 11:03:56  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.4  1997/10/27 13:55:03  adam
  * Fixed memory leak: member response wasn't freed when queue
  * was destroyed.
  *
@@ -95,9 +98,11 @@ request *request_get(request_q *q)
     }
     r->q = q;
     r->len_refid = 0;
+    r->refid = 0;
     r->request = 0;
     r->request_mem = 0;
     r->len_response = 0;
+    r->clientData = 0;
     r->state = REQUEST_IDLE;
     r->next = 0;
     return r;
@@ -109,3 +114,4 @@ void request_release(request *r)
     r->next = q->list;
     q->list = r;
 }
+
index 96058d5..987f84c 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: seshigh.c,v $
- * Revision 1.70  1998-01-29 13:15:35  adam
+ * Revision 1.71  1998-02-10 11:03:57  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.70  1998/01/29 13:15:35  adam
  * Implemented sort for the backend interface.
  *
  * Revision 1.69  1997/09/30 11:48:12  adam
 
 #include <backend.h>
 
-static int process_request(association *assoc);
+static int process_request(association *assoc, request *req);
 void backend_response(IOCHAN i, int event);
 static int process_response(association *assoc, request *req, Z_APDU *res);
 static Z_APDU *process_initRequest(association *assoc, request *reqb);
 static Z_APDU *process_searchRequest(association *assoc, request *reqb,
     int *fd);
 static Z_APDU *response_searchRequest(association *assoc, request *reqb,
-    bend_searchresult *bsrt, int *fd);
+    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);
 static void process_close(association *assoc, request *reqb);
+void save_referenceId (request *reqb, Z_ReferenceId *refid);
 
 static FILE *apduf = 0; /* for use in static mode */
 static statserv_options_block *control_block = 0;
@@ -294,16 +298,16 @@ static statserv_options_block *control_block = 0;
  */
 association *create_association(IOCHAN channel, COMSTACK link)
 {
-    association *new;
+    association *anew;
 
     if (!control_block)
        control_block = statserv_getcontrol();
-    if (!(new = xmalloc(sizeof(*new))))
+    if (!(anew = xmalloc(sizeof(*anew))))
        return 0;
-    new->client_chan = channel;
-    new->client_link = link;
-    if (!(new->decode = odr_createmem(ODR_DECODE)) ||
-       !(new->encode = odr_createmem(ODR_ENCODE)))
+    anew->client_chan = channel;
+    anew->client_link = link;
+    if (!(anew->decode = odr_createmem(ODR_DECODE)) ||
+       !(anew->encode = odr_createmem(ODR_ENCODE)))
        return 0;
     if (*control_block->apdufile)
     {
@@ -311,7 +315,7 @@ association *create_association(IOCHAN channel, COMSTACK link)
        FILE *f;
 
        strcpy(filename, control_block->apdufile);
-       if (!(new->print = odr_createmem(ODR_PRINT)))
+       if (!(anew->print = odr_createmem(ODR_PRINT)))
            return 0;
        if (*control_block->apdufile != '-')
        {
@@ -339,19 +343,19 @@ association *create_association(IOCHAN channel, COMSTACK link)
                }
                setvbuf(f, 0, _IONBF, 0);
            }
-           odr_setprint(new->print, f);
+           odr_setprint(anew->print, f);
        }
     }
     else
-       new->print = 0;
-    new->input_buffer = 0;
-    new->input_buffer_len = 0;
-    new->backend = 0;
-    new->state = ASSOC_NEW;
-    request_initq(&new->incoming);
-    request_initq(&new->outgoing);
-    new->proto = cs_getproto(link);
-    return new;
+       anew->print = 0;
+    anew->input_buffer = 0;
+    anew->input_buffer_len = 0;
+    anew->backend = 0;
+    anew->state = ASSOC_NEW;
+    request_initq(&anew->incoming);
+    request_initq(&anew->outgoing);
+    anew->proto = cs_getproto(link);
+    return anew;
 }
 
 /*
@@ -492,8 +496,11 @@ void ir_session(IOCHAN h, int event)
        /* can we do something yet? */
        req = request_head(&assoc->incoming);
        if (req->state == REQUEST_IDLE)
-           if (process_request(assoc) < 0)
+       {
+           request_deq(&assoc->incoming);
+           if (process_request(assoc, req) < 0)
                do_close(assoc, Z_Close_systemProblem, "Unknown error");
+       }
     }
     if (event & EVENT_OUTPUT)
     {
@@ -532,13 +539,12 @@ void ir_session(IOCHAN h, int event)
 /*
  * Initiate request processing.
  */
-static int process_request(association *assoc)
+static int process_request(association *assoc, request *req)
 {
-    request *req = request_head(&assoc->incoming);
     int fd = -1;
     Z_APDU *res;
+    int retval;
 
-    logf(LOG_DEBUG, "process_request");
     assert(req && req->state == REQUEST_IDLE);
     switch (req->request->which)
     {
@@ -568,12 +574,12 @@ static int process_request(association *assoc)
     if (res)
     {
        logf(LOG_DEBUG, "  result immediately available");
-       return process_response(assoc, req, res);
+       retval = process_response(assoc, req, res);
     }
     else if (fd < 0)
     {
-       logf(LOG_WARN, "   bad result");
-       return -1;
+       logf(LOG_DEBUG, "  result unavailble");
+       retval = 0;
     }
     else /* no result yet - one will be provided later */
     {
@@ -586,8 +592,9 @@ static int process_request(association *assoc)
        if (!(chan = iochan_create(fd, backend_response, EVENT_INPUT)))
            abort();
        iochan_setdata(chan, assoc);
-       return 0;
+       retval = 0;
     }
+    return retval;
 }
 
 /*
@@ -654,18 +661,18 @@ static int process_response(association *assoc, request *req, Z_APDU *res)
            odr_errmsg(odr_geterror(assoc->print)));
        odr_reset(assoc->print);
     }
-    /* change this when we make the backend reentrant */
-    if (req == request_head(&assoc->incoming))
-    {
-       req->state = REQUEST_IDLE;
-       request_deq(&assoc->incoming);
-    }
+    req->state = REQUEST_IDLE;
     request_enq(&assoc->outgoing, req);
     /* turn the work over to the ir_session handler */
     iochan_setflag(assoc->client_chan, EVENT_OUTPUT);
     /* Is there more work to be done? give that to the input handler too */
+#if 1
     if (request_head(&assoc->incoming))
+    {
+       logf (LOG_DEBUG, "more work to be done");
        iochan_setevent(assoc->client_chan, EVENT_WORK);
+    }
+#endif
     return 0;
 }
 
@@ -697,6 +704,8 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
     binitreq.configname = "default-config";
     binitreq.auth = req->idAuthentication;
     binitreq.bend_sort = NULL;
+    binitreq.bend_search = NULL;
+    binitreq.bend_present = NULL;
     if (!(binitres = bend_init(&binitreq)))
     {
        logf(LOG_WARN, "Bad response from backend.");
@@ -706,6 +715,10 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
     assoc->backend = binitres->handle;
     if ((assoc->bend_sort = binitreq.bend_sort))
        logf (LOG_DEBUG, "Sort handler installed");
+    if ((assoc->bend_search = binitreq.bend_search))
+       logf (LOG_DEBUG, "Search handler installed");
+    if ((assoc->bend_present = binitreq.bend_present))
+       logf (LOG_DEBUG, "Present handler installed");
     resp->referenceId = req->referenceId;
     *options = '\0';
     /* let's tell the client what we can do */
@@ -1056,24 +1069,51 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb,
     int *fd)
 {
     Z_SearchRequest *req = reqb->request->u.searchRequest;
-    bend_searchrequest bsrq;
-    bend_searchresult *bsrt;
+    bend_search_rr *bsrr = nmem_malloc (reqb->request_mem, sizeof(*bsrr));
 
     logf(LOG_LOG, "Got SearchRequest.");
 
-    bsrq.setname = req->resultSetName;
-    bsrq.replace_set = *req->replaceIndicator;
-    bsrq.num_bases = req->num_databaseNames;
-    bsrq.basenames = req->databaseNames;
-    bsrq.query = req->query;
-    bsrq.stream = assoc->encode;
-
-    if (!(bsrt = bend_search(assoc->backend, &bsrq, fd)))
-       return 0;
-    return response_searchRequest(assoc, reqb, bsrt, fd);
+    save_referenceId (reqb, req->referenceId);
+    /* store ref id in request */
+    bsrr->fd = fd;
+    bsrr->request = reqb;
+    bsrr->association = assoc;
+    if (assoc->bend_search)
+    {
+       bsrr->setname = req->resultSetName;
+       bsrr->replace_set = *req->replaceIndicator;
+       bsrr->num_bases = req->num_databaseNames;
+       bsrr->basenames = req->databaseNames;
+       bsrr->query = req->query;
+       bsrr->stream = assoc->encode;
+       bsrr->errcode = 0;
+       bsrr->hits = 0;
+       bsrr->errstring = NULL;
+       (*assoc->bend_search)(assoc->backend, bsrr);
+       if (!bsrr->request)
+           return 0;
+    }
+    else
+    {
+       bend_searchrequest bsrq;
+       bend_searchresult *bsrt;
+
+       bsrq.setname = req->resultSetName;
+       bsrq.replace_set = *req->replaceIndicator;
+       bsrq.num_bases = req->num_databaseNames;
+       bsrq.basenames = req->databaseNames;
+       bsrq.query = req->query;
+       bsrq.stream = assoc->encode;
+       if (!(bsrt = bend_search(assoc->backend, &bsrq, fd)))
+           return 0;
+       bsrr->hits = bsrt->hits;
+       bsrr->errcode = bsrt->errcode;
+       bsrr->errstring = bsrt->errstring;
+    }
+    return response_searchRequest(assoc, reqb, bsrr, fd);
 }
 
-bend_searchresult *bend_searchresponse(void *handle) {return 0;}
+int bend_searchresponse(void *handle, bend_search_rr *bsrr) {return 0;}
 
 /*
  * Prepare a searchresponse based on the backend results. We probably want
@@ -1083,7 +1123,7 @@ bend_searchresult *bend_searchresponse(void *handle) {return 0;}
  * event, and we'll have to get the response for ourselves.
  */
 static Z_APDU *response_searchRequest(association *assoc, request *reqb,
-    bend_searchresult *bsrt, int *fd)
+    bend_search_rr *bsrt, int *fd)
 {
     Z_SearchRequest *req = reqb->request->u.searchRequest;
     Z_APDU *apdu = odr_malloc (assoc->encode, sizeof(*apdu));
@@ -1104,7 +1144,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
     resp->additionalSearchInfo = 0;
     resp->otherInfo = 0;
     *fd = -1;
-    if (!bsrt && !(bsrt = bend_searchresponse(assoc->backend)))
+    if (!bsrt && !bend_searchresponse(assoc->backend, bsrt))
     {
        logf(LOG_FATAL, "Bad result from backend");
        return 0;
@@ -1202,39 +1242,62 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
     int *fd)
 {
     Z_PresentRequest *req = reqb->request->u.presentRequest;
-    Z_APDU *apdu = odr_malloc (assoc->encode, sizeof(*apdu));
-    Z_PresentResponse *resp = odr_malloc (assoc->encode, sizeof(*resp));
-    int *presst = odr_malloc (assoc->encode, sizeof(*presst));
-    int *next = odr_malloc (assoc->encode, sizeof(*next));
-    int *num = odr_malloc (assoc->encode, sizeof(*num));
     oident *prefformat;
     oid_value form;
+    Z_APDU *apdu;
+    Z_PresentResponse *resp;
+    int *presst;
+    int *next;
+    int *num;
 
     logf(LOG_LOG, "Got PresentRequest.");
-    *presst = 0;
-    *next = 0;
-    *num = 0;
-
-    apdu->which = Z_APDU_presentResponse;
-    apdu->u.presentResponse = resp;
-    resp->referenceId = req->referenceId;
-    resp->otherInfo = 0;
 
     if (!(prefformat = oid_getentbyoid(req->preferredRecordSyntax)) ||
        prefformat->oclass != CLASS_RECSYN)
        form = VAL_NONE;
     else
        form = prefformat->value;
+    if (assoc->bend_present)
+    {
+       bend_present_rr *bprr = nmem_malloc (reqb->request_mem, sizeof(*bprr));
+       bprr->setname = req->resultSetId;
+       bprr->start = *req->resultSetStartPoint;
+       bprr->number = *req->numberOfRecordsRequested;
+       bprr->format = form;
+       bprr->comp = req->recordComposition;
+       bprr->stream = assoc->encode;
+       bprr->request = reqb;
+       bprr->association = assoc;
+       bprr->errcode = 0;
+       bprr->errstring = NULL;
+       (*assoc->bend_present)(assoc->backend, bprr);
+
+       if (!bprr->request)
+           return 0;
+    }
+    apdu = odr_malloc (assoc->encode, sizeof(*apdu));
+    resp = odr_malloc (assoc->encode, sizeof(*resp));
+    presst = odr_malloc (assoc->encode, sizeof(*presst));
+    next = odr_malloc (assoc->encode, sizeof(*next));
+    num = odr_malloc (assoc->encode, sizeof(*num));
+    *presst = 0;
+    *next = 0;
     *num = *req->numberOfRecordsRequested;
-    resp->records = pack_records(assoc, req->resultSetId,
-       *req->resultSetStartPoint, num, req->recordComposition, next,
-       presst, form);
+    
+    apdu->which = Z_APDU_presentResponse;
+    apdu->u.presentResponse = resp;
+    resp->referenceId = req->referenceId;
+    resp->otherInfo = 0;
+    
+    resp->records =
+       pack_records(assoc, req->resultSetId, *req->resultSetStartPoint,
+                    num, req->recordComposition, next, presst, form);
     if (!resp->records)
-       return 0;
+       return 0;
     resp->numberOfRecordsReturned = num;
     resp->presentStatus = presst;
     resp->nextResultSetPosition = next;
-
+    
     return apdu;
 }
 
@@ -1353,31 +1416,32 @@ static Z_APDU *process_sortRequest(association *assoc, request *reqb,
 {
     Z_SortRequest *req = reqb->request->u.sortRequest;
     Z_SortResponse *res = odr_malloc (assoc->encode, sizeof(*res));
-    bend_sortrequest bsrq;
-    bend_sortresult *bsrt;
+    bend_sort_rr *bsrr = odr_malloc (assoc->encode, sizeof(*bsrr));
+
     Z_APDU *apdu = odr_malloc (assoc->encode, sizeof(*apdu));
 
     logf(LOG_LOG, "Got SortRequest.");
 
-    bsrq.num_input_setnames = req->inputResultSetNames->num_strings;
-    bsrq.input_setnames = req->inputResultSetNames->strings;
-    bsrq.output_setname = req->sortedResultSetName;
-    bsrq.sort_sequence = req->sortSequence;
-    bsrq.stream = assoc->encode;
+    bsrr->num_input_setnames = req->inputResultSetNames->num_strings;
+    bsrr->input_setnames = req->inputResultSetNames->strings;
+    bsrr->output_setname = req->sortedResultSetName;
+    bsrr->sort_sequence = req->sortSequence;
+    bsrr->stream = assoc->encode;
 
-    bsrt = odr_malloc (assoc->encode, sizeof(*bsrt));
-    bsrt->sort_status = Z_SortStatus_failure;
-    bsrt->errcode = 0;
-    bsrt->errstring = 0;
+    bsrr->sort_status = Z_SortStatus_failure;
+    bsrr->errcode = 0;
+    bsrr->errstring = 0;
 
-    (*assoc->bend_sort)(assoc->backend, &bsrq, bsrt);
+    (*assoc->bend_sort)(assoc->backend, bsrr);
 
     res->referenceId = req->referenceId;
     res->sortStatus = odr_malloc (assoc->encode, sizeof(*res->sortStatus));
-    *res->sortStatus = bsrt->sort_status;
+    *res->sortStatus = bsrr->sort_status;
     res->resultSetStatus = 0;
-    if (bsrt->errcode)
-       res->diagnostics = diagrecs(assoc, bsrt->errcode, bsrt->errstring);
+    if (bsrr->errcode)
+       res->diagnostics = diagrecs(assoc, bsrr->errcode, bsrr->errstring);
+    else
+       res->diagnostics = 0;
     res->otherInfo = 0;
 
     apdu->which = Z_APDU_sortResponse;
@@ -1409,3 +1473,64 @@ static void process_close(association *assoc, request *reqb)
        assoc->version = 3;
     do_close(assoc, Z_Close_finished, "Association terminated by client");
 }
+
+void save_referenceId (request *reqb, Z_ReferenceId *refid)
+{
+    if (refid)
+    {
+       reqb->len_refid = refid->len;
+       reqb->refid = 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_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_malloc (odr, sizeof(*odr));
+    id->buf = 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)
+{
+    return process_request (a, req);
+}
+
+void bend_request_setdata(bend_request r, void *p)
+{
+    r->clientData = p;
+}
+
+void *bend_request_getdata(bend_request r)
+{
+    return r->clientData;
+}
index 084da36..b5b6db2 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: session.h,v $
- * Revision 1.13  1998-01-29 13:30:23  adam
+ * Revision 1.14  1998-02-10 11:03:57  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.13  1998/01/29 13:30:23  adam
  * Better event handle system for NT/Unix.
  *
  * Revision 1.12  1997/09/01 08:53:01  adam
@@ -76,6 +79,7 @@ typedef struct request
     int len_response;      /* length of encoded data */
     char *response;        /* encoded data waiting for transmission */
 
+    void *clientData;
     struct request *next;
     struct request_q *q; 
 } request;
@@ -120,6 +124,8 @@ typedef struct association
     int version;                  /* highest version-bit set (2 or 3) */
 
     int (*bend_sort) ();
+    int (*bend_search) ();
+    int (*bend_present) ();
 } association;
 
 association *create_association(IOCHAN channel, COMSTACK link);
index ee1b4a2..01f046b 100644 (file)
@@ -7,7 +7,10 @@
  *    Chas Woodfield, Fretwell Downing Datasystems.
  *
  * $Log: ztest.c,v $
- * Revision 1.6  1998-01-29 13:16:02  adam
+ * Revision 1.7  1998-02-10 11:03:57  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.6  1998/01/29 13:16:02  adam
  * Added dummy sort in test server.
  *
  * Revision 1.5  1997/11/07 13:31:58  adam
 #include <backend.h>
 #include <xmalloc.h>
 #include <proto.h>
+#include <log.h>
 
 Z_GenericRecord *read_grs1(FILE *f, ODR o);
 
-int bend_sort (void *handle, bend_sortrequest *req, bend_sortresult *res)
-{
-    res->errcode = 1;
-    res->errstring = "Sort not implemented";
-    res->sort_status = Z_SortStatus_failure;
-    return 0;
-}
+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);
 
 bend_initresult *bend_init(bend_initrequest *q)
 {
@@ -58,19 +58,35 @@ bend_initresult *bend_init(bend_initrequest *q)
     r->errcode = 0;
     r->errstring = 0;
     r->handle = dummy;
-    q->bend_sort = bend_sort;    /* register sort handler */
+    q->bend_sort = ztest_sort;       /* register sort handler */
+    q->bend_search = ztest_search;   /* register search handler */
+    q->bend_present = ztest_present; /* register present handle */
     return r;
 }
 
-bend_searchresult *bend_search(void *handle, bend_searchrequest *q, int *fd)
+int ztest_search (void *handle, bend_search_rr *rr)
 {
-    bend_searchresult *r = odr_malloc (q->stream, sizeof(*r));
+    rr->hits = rand() % 22;
+    return 0;
+}
 
-    r->errcode = 0;
-    r->errstring = 0;
-    r->hits = rand() % 22;
+int ztest_present (void *handle, bend_present_rr *rr)
+{
+    return 0;
+}
 
-    return r;
+/* Obsolete bend_search, never called because handler is registered */
+bend_searchresult *bend_search(void *handle, bend_searchrequest *q, int *fd)
+{
+    return 0;
+}
+
+/* Our sort handler really doesn't sort... */
+int ztest_sort (void *handle, bend_sort_rr *rr)
+{
+    rr->errcode = 0;
+    rr->sort_status = Z_SortStatus_success;
+    return 0;
 }
 
 static int atoin (const char *buf, int n)
@@ -241,6 +257,7 @@ bend_scanresult *bend_scan(void *handle, bend_scanrequest *q, int *num)
     char term[80], *p;
     int i, pos;
 
+    r->errcode = 0;
     r->errstring = 0;
     r->entries = list;
     r->status = BEND_SCAN_SUCCESS;
@@ -270,7 +287,7 @@ bend_scanresult *bend_scan(void *handle, bend_scanrequest *q, int *num)
        if (islower(*p))
            *p = toupper(*p);
 
-    fseek(f, 0, 0);
+    fseek(f, 0, SEEK_SET);
     r->num_entries = 0;
     for (i = 0, pos = 0; fscanf(f, " %79[^:]:%d", entries[pos], &hits[pos]) == 2;
        i++, pos < 199 ? pos++ : (pos = 0))