Implemented delete result set service to server API.
authorAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Jul 1998 12:38:41 +0000 (12:38 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Jul 1998 12:38:41 +0000 (12:38 +0000)
include/backend.h
server/seshigh.c
server/session.h
ztest/ztest.c

index 9e2f43f..2eb7be4 100644 (file)
  * OF THIS SOFTWARE.
  *
  * $Log: backend.h,v $
- * Revision 1.20  1998-05-27 16:57:06  adam
+ * Revision 1.21  1998-07-20 12:38:41  adam
+ * Implemented delete result set service to server API.
+ *
+ * Revision 1.20  1998/05/27 16:57:06  adam
  * Support for surrogate diagnostic records added for bend_fetch.
  *
  * Revision 1.19  1998/03/31 11:07:45  adam
@@ -172,21 +175,16 @@ YAZ_EXPORT bend_scanresult *bend_scan(void *handle, bend_scanrequest *r,
                                       int *fd);
 YAZ_EXPORT bend_scanresult *bend_scanresponse(void *handle);
 
-typedef struct bend_deleterequest
-{
-    char *setname;
-} bend_deleterequest;
-
-typedef struct bend_deleteresult
-{
-    int errcode;               /* 0==success */
-    char *errstring;           /* system error string or NULL */
-} bend_deleteresult;
-
-YAZ_EXPORT bend_deleteresult *bend_delete(void *handle,
-                                          bend_deleterequest *r, int *fd);
-YAZ_EXPORT bend_deleteresult *bend_deleteresponse(void *handle);
+/* delete handler */
+typedef struct bend_delete_rr {
+    int function;
+    int num_setnames;
+    char **setnames;
+    int delete_status;
+    ODR stream;
+} bend_delete_rr;
 
+/* close handler */
 YAZ_EXPORT void bend_close(void *handle);
 
 /* sort handler */
@@ -225,6 +223,7 @@ typedef struct bend_initrequest
     int (*bend_search) (void *handle, bend_search_rr *rr);
     int (*bend_present) (void *handle, bend_present_rr *rr);
     int (*bend_esrequest) (void *handle, bend_esrequest_rr *rr);
+    int (*bend_delete)(void *handle, bend_delete_rr *rr);
 } bend_initrequest;
 
 typedef struct bend_initresult
@@ -248,7 +247,6 @@ 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
 }
 #endif
index 5ad762f..ced78e1 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: seshigh.c,v $
- * Revision 1.76  1998-05-27 16:57:07  adam
+ * 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 +305,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 +403,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 +431,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 +529,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 +587,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 +595,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 +607,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 +756,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 +772,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 +788,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");
@@ -1569,6 +1590,45 @@ 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_ids;
+    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->num_statuses = 0;
+    res->deleteListStatuses = 0;
+    res->numberNotDeleted = 0;
+    res->num_bulkStatuses = 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 +1651,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)
index 251b89e..79f5604 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: session.h,v $
- * Revision 1.16  1998-03-31 11:07:45  adam
+ * Revision 1.17  1998-07-20 12:38:43  adam
+ * Implemented delete result set service to server API.
+ *
+ * Revision 1.16  1998/03/31 11:07:45  adam
  * Furhter work on UNIverse resource report.
  * Added Extended Services handling in frontend server.
  *
@@ -138,6 +141,7 @@ typedef struct association
     int (*bend_search) ();
     int (*bend_present) ();
     int (*bend_esrequest) ();
+    int (*bend_delete) ();
 } association;
 
 association *create_association(IOCHAN channel, COMSTACK link);
index 614df28..6bcf04d 100644 (file)
@@ -7,7 +7,10 @@
  *    Chas Woodfield, Fretwell Downing Datasystems.
  *
  * $Log: ztest.c,v $
- * Revision 1.11  1998-06-09 13:55:08  adam
+ * Revision 1.12  1998-07-20 12:38:44  adam
+ * Implemented delete result set service to server API.
+ *
+ * Revision 1.11  1998/06/09 13:55:08  adam
  * Minor changes.
  *
  * Revision 1.10  1998/05/27 16:55:54  adam
@@ -63,6 +66,7 @@ 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);
 int ztest_esrequest (void *handle, bend_esrequest_rr *rr);
+int ztest_delete (void *handle, bend_delete_rr *rr);
 
 bend_initresult *bend_init(bend_initrequest *q)
 {
@@ -76,6 +80,7 @@ bend_initresult *bend_init(bend_initrequest *q)
     q->bend_search = ztest_search;   /* register search handler */
     q->bend_present = ztest_present; /* register present handle */
     q->bend_esrequest = ztest_esrequest;
+    q->bend_delete = ztest_delete;
     return r;
 }
 
@@ -96,6 +101,15 @@ int ztest_esrequest (void *handle, bend_esrequest_rr *rr)
     return 0;
 }
 
+int ztest_delete (void *handle, bend_delete_rr *rr)
+{
+    if (rr->num_setnames == 1 && !strcmp (rr->setnames[0], "1"))
+       rr->delete_status = Z_DeleteStatus_success;
+    else
+        rr->delete_status = Z_DeleteStatus_resultSetDidNotExist;
+    return 0;
+}
+
 /* Obsolete bend_search, never called because handler is registered */
 bend_searchresult *bend_search(void *handle, bend_searchrequest *q, int *fd)
 {
@@ -238,11 +252,6 @@ bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *q, int *num)
     return r;
 }
 
-bend_deleteresult *bend_delete(void *handle, bend_deleterequest *q, int *num)
-{
-    return 0;
-}
-
 /*
  * silly dummy-scan what reads words from a file.
  */