/*
- * $Id: zoom-c.c,v 1.36 2002-07-11 10:39:05 adam Exp $
+ * $Id: zoom-c.c,v 1.44 2002-09-13 08:57:03 adam Exp $
*
* ZOOM layer for C, connections, result sets, queries.
*/
ZOOM_connection_remove_task(c);
}
-static ZOOM_record record_cache_lookup (ZOOM_resultset r,
- int pos,
- const char *elementSetName);
+static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos);
ZOOM_API(ZOOM_connection)
ZOOM_connection_create (ZOOM_options options)
{
size_t len;
Z_OtherInformation **oi;
- char buf[20];
+ char buf[80];
const char *val;
const char *cp;
int oidval;
ZOOM_API(ZOOM_record)
ZOOM_resultset_record_immediate (ZOOM_resultset s,size_t pos)
{
- return record_cache_lookup (s, pos, 0);
+ return record_cache_lookup (s, pos);
}
ZOOM_API(ZOOM_record)
if (!strcmp (type, "database"))
{
if (len)
- *len = strlen(npr->databaseName);
+ *len = (npr->databaseName ? strlen(npr->databaseName) : 0);
return npr->databaseName;
}
else if (!strcmp (type, "syntax"))
else if (!strcmp (type, "raw"))
{
if (npr->which == Z_NamePlusRecord_databaseRecord)
+ {
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+
+ if (r->which == Z_External_sutrs)
+ {
+ if (len) *len = r->u.sutrs->len;
+ return (const char *) r->u.sutrs->buf;
+ }
+ else if (r->which == Z_External_octet)
+ {
+ if (len) *len = r->u.octet_aligned->len;
+ return (const char *) r->u.octet_aligned->buf;
+ }
+ else /* grs-1, explain, ... */
+ {
+ if (len) *len = -1;
+ return (const char *) npr->u.databaseRecord;
+ }
+ }
+ return 0;
+ }
+ else if (!strcmp (type, "ext"))
+ {
+ if (npr->which == Z_NamePlusRecord_databaseRecord)
return (const char *) npr->u.databaseRecord;
return 0;
}
return 0;
}
-static void record_cache_add (ZOOM_resultset r,
- Z_NamePlusRecord *npr,
- int pos,
- const char *elementSetName)
+static void record_cache_add (ZOOM_resultset r, Z_NamePlusRecord *npr, int pos)
{
ZOOM_record_cache rc;
+ const char *elementSetName =
+ ZOOM_resultset_option_get (r, "elementSetName");
+ const char *syntax =
+ ZOOM_resultset_option_get (r, "preferredRecordSyntax");
+
for (rc = r->record_cache; rc; rc = rc->next)
{
|| (elementSetName && rc->elementSetName &&
!strcmp (elementSetName, rc->elementSetName)))
{
- /* not destroying rc->npr (it's handled by nmem )*/
- rc->rec.npr = npr;
- /* keeping wrbuf_marc too */
- return;
+ if ((!syntax && !rc->syntax)
+ || (syntax && rc->syntax &&
+ !strcmp (syntax, rc->syntax)))
+ {
+ /* not destroying rc->npr (it's handled by nmem )*/
+ rc->rec.npr = npr;
+ /* keeping wrbuf_marc too */
+ return;
+ }
}
}
}
rc->elementSetName = odr_strdup (r->odr, elementSetName);
else
rc->elementSetName = 0;
+
+ if (syntax)
+ rc->syntax = odr_strdup (r->odr, syntax);
+ else
+ rc->syntax = 0;
+
rc->pos = pos;
rc->next = r->record_cache;
r->record_cache = rc;
}
-static ZOOM_record record_cache_lookup (ZOOM_resultset r,
- int pos,
- const char *elementSetName)
+static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos)
{
ZOOM_record_cache rc;
-
+ const char *elementSetName =
+ ZOOM_resultset_option_get (r, "elementSetName");
+ const char *syntax =
+ ZOOM_resultset_option_get (r, "preferredRecordSyntax");
+
for (rc = r->record_cache; rc; rc = rc->next)
{
if (pos == rc->pos)
if ((!elementSetName && !rc->elementSetName)
|| (elementSetName && rc->elementSetName &&
!strcmp (elementSetName, rc->elementSetName)))
- return &rc->rec;
+ {
+ if ((!syntax && !rc->syntax)
+ || (syntax && rc->syntax &&
+ !strcmp (syntax, rc->syntax)))
+ return &rc->rec;
+ }
}
}
return 0;
for (i = 0; i<p->num_records; i++)
{
record_cache_add (resultset, p->records[i],
- i+ resultset->start, 0);
+ i+ resultset->start);
}
/* transfer our response to search_nmem .. we need it later */
nmem_transfer (resultset->odr->mem, nmem);
static int send_present (ZOOM_connection c)
{
- Z_APDU *apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
- Z_PresentRequest *req = apdu->u.presentRequest;
+ Z_APDU *apdu = 0;
+ Z_PresentRequest *req = 0;
int i = 0;
- const char *syntax =
- ZOOM_options_get (c->options, "preferredRecordSyntax");
- const char *element =
- ZOOM_options_get (c->options, "elementSetName");
- const char *schema =
- ZOOM_options_get (c->options, "schema");
+ const char *syntax = 0;
+ const char *elementSetName = 0;
+ const char *schema = 0;
ZOOM_resultset resultset;
if (!c->tasks)
return 0;
}
+ syntax = ZOOM_resultset_option_get (resultset, "preferredRecordSyntax");
+ elementSetName = ZOOM_resultset_option_get (resultset, "elementSetName");
+ schema = ZOOM_resultset_option_get (resultset, "schema");
+
if (c->error) /* don't continue on error */
return 0;
if (resultset->start < 0)
for (i = 0; i<resultset->count; i++)
{
ZOOM_record rec =
- record_cache_lookup (resultset, i + resultset->start, 0);
+ record_cache_lookup (resultset, i + resultset->start);
if (!rec)
break;
}
if (i == resultset->count)
return 0;
+ apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
+ req = apdu->u.presentRequest;
+
resultset->start += i;
resultset->count -= i;
*req->resultSetStartPoint = resultset->start + 1;
compo->u.complex->generic->schema = (Odr_oid *)
yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, schema);
}
- if (element && *element)
+ if (elementSetName && *elementSetName)
{
compo->u.complex->generic->elementSpec = (Z_ElementSpec *)
odr_malloc(c->odr_out, sizeof(Z_ElementSpec));
compo->u.complex->generic->elementSpec->which =
Z_ElementSpec_elementSetName;
compo->u.complex->generic->elementSpec->u.elementSetName =
- odr_strdup (c->odr_out, element);
+ odr_strdup (c->odr_out, elementSetName);
}
else
compo->u.complex->generic->elementSpec = 0;
compo->u.complex->num_recordSyntax = 0;
compo->u.complex->recordSyntax = 0;
}
- else if (element && *element)
+ else if (elementSetName && *elementSetName)
{
Z_ElementSetNames *esn = (Z_ElementSetNames *)
odr_malloc (c->odr_out, sizeof(*esn));
odr_malloc (c->odr_out, sizeof(*compo));
esn->which = Z_ElementSetNames_generic;
- esn->u.generic = odr_strdup (c->odr_out, element);
+ esn->u.generic = odr_strdup (c->odr_out, elementSetName);
compo->which = Z_RecordComp_simple;
compo->u.simple = esn;
req->recordComposition = compo;
ZOOM_API(int)
ZOOM_event (int no, ZOOM_connection *cs)
{
+ int timeout = 5000;
#if HAVE_SYS_POLL_H
struct pollfd pollfds[1024];
ZOOM_connection poll_cs[1024];
#if HAVE_SYS_POLL_H
#else
- tv.tv_sec = 15;
- tv.tv_usec = 0;
-
FD_ZERO (&input);
FD_ZERO (&output);
FD_ZERO (&except);
{
ZOOM_connection c = cs[i];
int fd, mask;
+ int this_timeout;
if (!c)
continue;
if (max_fd < fd)
max_fd = fd;
+ this_timeout = ZOOM_options_get_int (c->options, "timeout", -1);
+ if (this_timeout != -1 && this_timeout < timeout)
+ timeout = this_timeout;
#if HAVE_SYS_POLL_H
if (mask)
{
}
#endif
}
+ if (timeout >= 5000)
+ timeout = 30;
+
if (!nfds)
return 0;
+
#if HAVE_SYS_POLL_H
- r = poll (pollfds, nfds, 15000);
+ r = poll (pollfds, nfds, timeout * 1000);
for (i = 0; i<nfds; i++)
{
ZOOM_connection c = poll_cs[i];
}
}
#else
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
yaz_log (LOG_DEBUG, "select start");
r = select (max_fd+1, &input, &output, &except, &tv);
yaz_log (LOG_DEBUG, "select stop, returned r=%d", r);