* Sebastian Hammer, Adam Dickmeiss
*
* $Log: seshigh.c,v $
- * Revision 1.75 1998-05-18 10:13:07 adam
+ * Revision 1.78 1998-08-03 10:23:55 adam
+ * Fixed bug regarding Options for Sort.
+ *
+ * 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
* Fixed call to es_request handler - extra argument was passed.
*
* Revision 1.74 1998/03/31 15:13:20 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");
ODR_MASK_SET(resp->options, Z_Options_concurrentOperations);
strcat(options, " concurop");
}
- if (ODR_MASK_GET(req->options, Z_Options_sort && binitreq.bend_sort))
+ if (ODR_MASK_GET(req->options, Z_Options_sort) && binitreq.bend_sort)
{
ODR_MASK_SET(resp->options, Z_Options_sort);
strcat(options, " sort");
* surrogate diagnostic.
*/
static Z_NamePlusRecord *surrogatediagrec(association *assoc, char *dbname,
- int error, char *addinfo)
+ int error, char *addinfo)
{
int oid[OID_SIZE];
Z_NamePlusRecord *rec = (Z_NamePlusRecord *)odr_malloc (assoc->encode, sizeof(*rec));
bend_fetchresult *fres;
Z_NamePlusRecord *thisrec;
Z_DatabaseRecord *thisext;
- int this_length;
+ int this_length = 0;
/*
* we get the number of bytes allocated on the stream before any
freq.comp = comp;
freq.format = format;
freq.stream = a->encode;
+ freq.surrogate_flag = 0;
if (!(fres = bend_fetch(a->backend, &freq, 0)))
{
*pres = Z_PRES_FAILURE;
or only pertaining to current record */
if (fres->errcode)
{
- *pres = Z_PRES_FAILURE;
- return diagrec(a, fres->errcode, fres->errstring);
+ if (!freq.surrogate_flag)
+ {
+ *pres = Z_PRES_FAILURE;
+ return diagrec(a, fres->errcode, fres->errstring);
+ }
+ reclist->records[reclist->num_records] =
+ surrogatediagrec(a, fres->basename, fres->errcode,
+ fres->errstring);
+ reclist->num_records++;
+ *next = fres->last_in_set ? 0 : recno + 1;
+ continue;
}
if (fres->len >= 0)
this_length = fres->len;
continue;
}
}
+
if (!(thisrec = (Z_NamePlusRecord *)odr_malloc(a->encode, sizeof(*thisrec))))
return 0;
if (!(thisrec->databaseName = (char *)odr_malloc(a->encode,
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)