* 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
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 */
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
YAZ_EXPORT void bend_request_setdata(bend_request r, void *p);
YAZ_EXPORT void *bend_request_getdata(bend_request r);
-
#ifdef __cplusplus
}
#endif
* 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
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;
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));
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
{
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)
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);
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)
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;
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.");
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';
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");
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;
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)
* 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
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)
{
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;
}
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)
{
return r;
}
-bend_deleteresult *bend_delete(void *handle, bend_deleterequest *q, int *num)
-{
- return 0;
-}
-
/*
* silly dummy-scan what reads words from a file.
*/