/*
- * Copyright (c) 1995-2000, Index Data
+ * Copyright (c) 1995-2001, Index Data
* See the file LICENSE for details.
*
* $Log: seshigh.c,v $
- * Revision 1.106 2000-08-31 09:51:25 adam
+ * Revision 1.113 2001-01-30 21:34:17 adam
+ * Added step-size for Scan backend interface.
+ *
+ * Revision 1.112 2001/01/29 09:38:22 adam
+ * Fixed bug that made the frontend server crash when no attribute set
+ * was specified for scan.
+ *
+ * Revision 1.111 2000/11/23 10:58:32 adam
+ * SSL comstack support. Separate POSIX thread support library.
+ *
+ * Revision 1.110 2000/10/02 13:05:32 adam
+ * Fixed bug introduced by previous commit.
+ *
+ * Revision 1.109 2000/10/02 11:07:44 adam
+ * Added peer_name member for bend_init handler. Changed the YAZ
+ * client so that tcp: can be avoided in target spec.
+ *
+ * Revision 1.108 2000/09/04 08:58:15 adam
+ * Added prefix yaz_ for most logging utility functions.
+ *
+ * Revision 1.107 2000/08/31 10:20:12 adam
+ * Added member request_format and output_format for backend fetch method.
+ *
+ * Revision 1.106 2000/08/31 09:51:25 adam
* Added record_syntax member for fetch method (raw OID).
*
* Revision 1.105 2000/07/06 10:38:47 adam
anew->init = 0;
anew->client_chan = channel;
anew->client_link = link;
+ anew->cs_get_mask = 0;
+ anew->cs_put_mask = 0;
+ anew->cs_accept_mask = 0;
if (!(anew->decode = odr_createmem(ODR_DECODE)) ||
!(anew->encode = odr_createmem(ODR_ENCODE)))
return 0;
}
return;
}
- if (event & EVENT_INPUT || event & EVENT_WORK) /* input */
+ if (event & assoc->cs_accept_mask)
{
- if (event & EVENT_INPUT)
+ yaz_log (LOG_DEBUG, "ir_session (accept)");
+ if (!cs_accept (conn))
+ {
+ yaz_log (LOG_LOG, "accept failed");
+ destroy_association(assoc);
+ iochan_destroy(h);
+ }
+ iochan_clearflag (h, EVENT_OUTPUT|EVENT_OUTPUT);
+ if (conn->io_pending)
+ { /* cs_accept didn't complete */
+ assoc->cs_accept_mask =
+ ((conn->io_pending & CS_WANT_WRITE) ? EVENT_OUTPUT : 0) |
+ ((conn->io_pending & CS_WANT_READ) ? EVENT_INPUT : 0);
+
+ iochan_setflag (h, assoc->cs_accept_mask);
+ }
+ else
+ { /* cs_accept completed. Prepare for reading (cs_get) */
+ assoc->cs_accept_mask = 0;
+ assoc->cs_get_mask = EVENT_INPUT;
+ iochan_setflag (h, assoc->cs_get_mask);
+ }
+ return;
+ }
+ if ((event & assoc->cs_get_mask) || (event & EVENT_WORK)) /* input */
+ {
+ if ((assoc->cs_put_mask & EVENT_INPUT) == 0 && (event & assoc->cs_get_mask))
{
yaz_log(LOG_DEBUG, "ir_session (input)");
- assert(assoc && conn);
/* We aren't speaking to this fellow */
if (assoc->state == ASSOC_DEAD)
{
iochan_destroy(h);
return;
}
+ assoc->cs_get_mask = EVENT_INPUT;
if ((res = cs_get(conn, &assoc->input_buffer,
&assoc->input_buffer_len)) <= 0)
{
return;
}
else if (res == 1) /* incomplete read - wait for more */
+ {
+ if (conn->io_pending & CS_WANT_WRITE)
+ assoc->cs_get_mask |= EVENT_OUTPUT;
+ iochan_setflag(h, assoc->cs_get_mask);
return;
+ }
if (cs_more(conn)) /* more stuff - call us again later, please */
iochan_setevent(h, EVENT_INPUT);
odr_errmsg(odr_geterror(assoc->decode)),
odr_offset(assoc->decode));
yaz_log(LOG_LOG, "PDU dump:");
- odr_dumpBER(log_file(), assoc->input_buffer, res);
+ odr_dumpBER(yaz_log_file(), assoc->input_buffer, res);
do_close(assoc, Z_Close_protocolError, "Malformed package");
return;
}
do_close_req(assoc, Z_Close_systemProblem, msg, req);
}
}
- if (event & EVENT_OUTPUT)
+ if (event & assoc->cs_put_mask)
{
request *req = request_head(&assoc->outgoing);
+ assoc->cs_put_mask = 0;
yaz_log(LOG_DEBUG, "ir_session (output)");
req->state = REQUEST_PENDING;
switch (res = cs_put(conn, req->response, req->len_response))
{
- case -1:
- yaz_log(LOG_LOG, "Connection closed by client");
- cs_close(conn);
- destroy_association(assoc);
- iochan_destroy(h);
- break;
- case 0: /* all sent - release the request structure */
- yaz_log(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response);
- nmem_destroy(req->request_mem);
- request_deq(&assoc->outgoing);
- request_release(req);
- if (!request_head(&assoc->outgoing))
- iochan_clearflag(h, EVENT_OUTPUT);
- break;
- /* value of 1 -- partial send -- is simply ignored */
+ case -1:
+ yaz_log(LOG_LOG, "Connection closed by client");
+ cs_close(conn);
+ destroy_association(assoc);
+ iochan_destroy(h);
+ break;
+ case 0: /* all sent - release the request structure */
+ yaz_log(LOG_DEBUG, "Wrote PDU, %d bytes", req->len_response);
+ nmem_destroy(req->request_mem);
+ request_deq(&assoc->outgoing);
+ request_release(req);
+ if (!request_head(&assoc->outgoing))
+ { /* restore mask for cs_get operation ... */
+ iochan_clearflag(h, EVENT_OUTPUT|EVENT_INPUT);
+ iochan_setflag(h, assoc->cs_get_mask);
+ }
+ break;
+ default:
+ if (conn->io_pending & CS_WANT_WRITE)
+ assoc->cs_put_mask |= EVENT_OUTPUT;
+ if (conn->io_pending & CS_WANT_READ)
+ assoc->cs_put_mask |= EVENT_INPUT;
+ iochan_setflag(h, assoc->cs_put_mask);
}
}
if (event & EVENT_EXCEPT)
{
- yaz_log(LOG_DEBUG, "ir_session (exception)");
+ yaz_log(LOG_LOG, "ir_session (exception)");
cs_close(conn);
destroy_association(assoc);
iochan_destroy(h);
request_enq(&assoc->outgoing, req);
/* turn the work over to the ir_session handler */
iochan_setflag(assoc->client_chan, EVENT_OUTPUT);
+ assoc->cs_put_mask = EVENT_OUTPUT;
/* Is there more work to be done? give that to the input handler too */
#if 1
if (request_head(&assoc->incoming))
assoc->init->bend_scan = NULL;
assoc->init->bend_segment = NULL;
assoc->init->bend_fetch = NULL;
+
+ assoc->init->peer_name =
+ odr_strdup (assoc->encode, cs_addrstr(assoc->client_link));
if (!(binitres = (*cb->bend_init)(assoc->init)))
{
yaz_log(LOG_WARN, "Bad response from backend.");
assoc->preferredMessageSize = *req->preferredMessageSize;
if (assoc->preferredMessageSize > assoc->maximumRecordSize)
assoc->preferredMessageSize = assoc->maximumRecordSize;
+
+#if 0
+ assoc->maximumRecordSize = 3000000;
+ assoc->preferredMessageSize = 3000000;
+#endif
+
resp->preferredMessageSize = &assoc->preferredMessageSize;
resp->maximumRecordSize = &assoc->maximumRecordSize;
freq.number = recno;
freq.comp = comp;
freq.request_format = format;
- freq.record_syntax = oid;
- freq.output_format = 0;
+ freq.request_format_raw = oid;
+ freq.output_format = format;
+ freq.output_format_raw = 0;
freq.stream = a->encode;
freq.print = a->print;
freq.surrogate_flag = 0;
return 0;
strcpy(thisrec->databaseName, freq.basename);
thisrec->which = Z_NamePlusRecord_databaseRecord;
+
+ if (freq.output_format_raw)
+ {
+ struct oident *ident = oid_getentbyoid(freq.output_format_raw);
+ freq.output_format = ident->value;
+ }
thisrec->u.databaseRecord = z_ext_record(a->encode, freq.output_format,
freq.record, freq.len);
if (!thisrec->u.databaseRecord)
bprr->start = *req->resultSetStartPoint;
bprr->number = *req->numberOfRecordsRequested;
bprr->format = form;
- bprr->record_syntax = req->preferredRecordSyntax;
bprr->comp = req->recordComposition;
bprr->referenceId = req->referenceId;
bprr->stream = assoc->encode;
return apdu;
}
-#if 0
-static int bend_default_scan (void *handle, bend_scan_rr *rr)
-{
- bend_scanrequest srq;
- bend_scanresult *srs;
-
- srq.num_bases = rr->num_bases;
- srq.basenames = rr->basenames;
- srq.attributeset = rr->attributeset;
- srq.referenceId = rr->referenceId;
- srq.term = rr->term;
- srq.term_position = rr->term_position;
- srq.num_entries = rr->num_entries;
- srq.stream = rr->stream;
- srq.print = rr->print;
-
- srs = bend_scan(handle, &srq, 0);
-
- rr->term_position = srs->term_position;
- rr->num_entries = srs->num_entries;
- rr->entries = srs->entries;
- rr->status = srs->status;
- rr->errcode = srs->errcode;
- rr->errstring = srs->errstring;
- return 0;
-}
-#endif
-
/*
* 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.
apdu->which = Z_APDU_scanResponse;
apdu->u.scanResponse = res;
res->referenceId = req->referenceId;
- res->stepSize = 0;
+ res->stepSize = (int*) odr_malloc (assoc->encode, sizeof(*res->stepSize));
+ *res->stepSize = 0;
+ if (req->stepSize)
+ *res->stepSize = *req->stepSize;
res->scanStatus = scanStatus;
res->numberOfEntriesReturned = numberOfEntriesReturned;
res->positionOfTerm = 0;
bsrr->referenceId = req->referenceId;
bsrr->stream = assoc->encode;
bsrr->print = assoc->print;
+ bsrr->step_size = res->stepSize;
if (!(attset = oid_getentbyoid(req->attributeSet)) ||
attset->oclass != CLASS_RECSYN)
bsrr->attributeset = VAL_NONE;
else
bsrr->attributeset = attset->value;
- log_scan_term (req->termListAndStartPoint, attset->value);
+ log_scan_term (req->termListAndStartPoint, bsrr->attributeset);
bsrr->term_position = req->preferredPositionInResponse ?
*req->preferredPositionInResponse : 1;
((int (*)(void *, bend_scan_rr *))