/*
- * $Id: zoom-c.c,v 1.16 2002-01-02 10:30:25 adam Exp $
+ * $Id: zoom-c.c,v 1.21 2002-01-21 21:50:32 adam Exp $
*
* ZOOM layer for C, connections, result sets, queries.
*/
static void ZOOM_connection_put_event (ZOOM_connection c, ZOOM_Event event)
{
- // put in back of queue
if (c->m_queue_back)
{
c->m_queue_back->prev = event;
static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c)
{
- // get from front of queue
ZOOM_Event event = c->m_queue_front;
if (!event)
return 0;
static void clear_error (ZOOM_connection c)
{
- c->error = ZOOM_ERROR_NONE;
- xfree (c->addinfo);
- c->addinfo = 0;
+
+ switch (c->error)
+ {
+ case ZOOM_ERROR_CONNECT:
+ case ZOOM_ERROR_MEMORY:
+ case ZOOM_ERROR_DECODE:
+ case ZOOM_ERROR_CONNECTION_LOST:
+ case ZOOM_ERROR_INIT:
+ case ZOOM_ERROR_INTERNAL:
+ break;
+ default:
+ c->error = ZOOM_ERROR_NONE;
+ xfree (c->addinfo);
+ c->addinfo = 0;
+ }
}
ZOOM_task ZOOM_connection_add_task (ZOOM_connection c, int which)
ZOOM_options_set(c->options, "host", c->host_port);
c->async = ZOOM_options_get_bool (c->options, "async", 0);
-
+
+ c->error = ZOOM_ERROR_NONE;
+
task = ZOOM_connection_add_task (c, ZOOM_TASK_CONNECT);
if (!c->async)
{
ZOOM_task task;
ZOOM_connection c;
- const char *cp;
if (!r)
return;
if (ret >= 0)
{
c->state = STATE_CONNECTING;
- c->mask = ZOOM_SELECT_READ | ZOOM_SELECT_WRITE |
- ZOOM_SELECT_EXCEPT;
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
return 1;
}
}
{
if (npr->which == Z_NamePlusRecord_databaseRecord)
{
- *len = -1;
- return (Z_External *) npr->u.databaseRecord;
+ Z_External *r = (Z_External *) npr->u.databaseRecord;
+
+ if (r->which == Z_External_sutrs)
+ {
+ *len = r->u.sutrs->len;
+ return r->u.sutrs->buf;
+ }
+ else if (r->which == Z_External_octet)
+ {
+ *len = r->u.octet_aligned->len;
+ return r->u.octet_aligned->buf;
+ }
+ else /* grs-1, explain, ... */
+ {
+ *len = -1;
+ return (Z_External *) npr->u.databaseRecord;
+ }
}
return 0;
}
response_diag(c, res->entries->nonsurrogateDiagnostics[0]);
scan->scan_response = res;
nmem_transfer (scan->odr->mem, nmem);
+ if (res->stepSize)
+ ZOOM_options_set_int (scan->options, "stepSize", *res->stepSize);
+ if (res->positionOfTerm)
+ ZOOM_options_set_int (scan->options, "position", *res->positionOfTerm);
+ if (res->scanStatus)
+ ZOOM_options_set_int (scan->options, "scanStatus", *res->scanStatus);
+ if (res->numberOfEntriesReturned)
+ ZOOM_options_set_int (scan->options, "number",
+ *res->numberOfEntriesReturned);
nmem_destroy (nmem);
+ return 1;
}
static int send_sort (ZOOM_connection c)
return term;
}
+const char *ZOOM_scanset_option_get (ZOOM_scanset scan, const char *key)
+{
+ return ZOOM_options_get (scan->options, key);
+}
+
+void ZOOM_scanset_option_set (ZOOM_scanset scan, const char *key,
+ const char *val)
+{
+ ZOOM_options_set (scan->options, key, val);
+}
+
static int ZOOM_connection_exec_task (ZOOM_connection c)
{
ZOOM_task task = c->tasks;
return 1;
}
else if (r == 1)
- {
- c->state = STATE_ESTABLISHED;
- c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_WRITE|ZOOM_SELECT_EXCEPT;
+ {
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
+ yaz_log (LOG_DEBUG, "do_write_ex 1 mask=%d", c->mask);
}
else
{
- c->state = STATE_ESTABLISHED;
- c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT;
+ c->mask = ZOOM_SELECT_READ|ZOOM_SELECT_EXCEPT;
+ yaz_log (LOG_DEBUG, "do_write_ex 2 mask=%d", c->mask);
}
return 0;
}
int ZOOM_connection_do_io(ZOOM_connection c, int mask)
{
ZOOM_Event event = 0;
-#if 0
int r = cs_look(c->cs);
- yaz_log (LOG_LOG, "ZOOM_connection_do_io c=%p mask=%d cs_look=%d",
+ yaz_log (LOG_DEBUG, "ZOOM_connection_do_io c=%p mask=%d cs_look=%d",
c, mask, r);
if (r == CS_NONE)
{
- event = ZOOM_Event_create (ZOOM_EVENT_IO_CONNECT);
+ event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
c->error = ZOOM_ERROR_CONNECT;
do_close (c);
ZOOM_connection_put_event (c, event);
}
else if (r == CS_CONNECT)
{
- event = ZOOM_Event_create (ZOOM_EVENT_IO_CONNECT);
- yaz_log (LOG_LOG, "calling rcvconnect");
- if (cs_rcvconnect (c->cs) < 0)
- {
- c->error = ZOOM_ERROR_CONNECT;
- do_close (c);
- ZOOM_connection_put_event (c, event);
- }
- else
+ int ret;
+ event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
+
+ ret = cs_rcvconnect (c->cs);
+ yaz_log (LOG_DEBUG, "cs_rcvconnect returned %d", ret);
+ if (ret == 1)
{
+ c->mask = ZOOM_SELECT_EXCEPT;
+ if (c->cs->io_pending & CS_WANT_WRITE)
+ c->mask += ZOOM_SELECT_WRITE;
+ if (c->cs->io_pending & CS_WANT_READ)
+ c->mask += ZOOM_SELECT_READ;
ZOOM_connection_put_event (c, event);
- ZOOM_connection_send_init (c);
}
- }
- else
- {
- if (mask & ZOOM_SELECT_READ)
- do_read (c);
- if (c->cs && (mask & ZOOM_SELECT_WRITE))
- do_write (c);
- }
-#else
- yaz_log (LOG_DEBUG, "ZOOM_connection_do_io c=%p mask=%d", c, mask);
- if (c->state == STATE_CONNECTING)
- {
- event = ZOOM_Event_create (ZOOM_EVENT_CONNECT);
- if (mask & ZOOM_SELECT_WRITE)
+ else if (ret == 0)
{
ZOOM_connection_put_event (c, event);
- ZOOM_connection_send_init (c);
+ ZOOM_connection_send_init (c);
+ c->state = STATE_ESTABLISHED;
}
- else
- {
- c->error = ZOOM_ERROR_CONNECT;
- do_close (c);
+ else
+ {
+ c->error = ZOOM_ERROR_CONNECT;
+ do_close (c);
ZOOM_connection_put_event (c, event);
- }
- }
- else if (c->state == STATE_ESTABLISHED)
- {
- if (mask & ZOOM_SELECT_READ)
- do_read (c);
- if (c->cs && (mask & ZOOM_SELECT_WRITE))
- do_write (c);
+ }
}
else
{
- event = ZOOM_Event_create (ZOOM_EVENT_UNKNOWN);
- ZOOM_connection_put_event (c, event);
- c->error = ZOOM_ERROR_INTERNAL;
- do_close (c);
+ if (mask & ZOOM_SELECT_READ)
+ do_read (c);
+ if (c->cs && (mask & ZOOM_SELECT_WRITE))
+ do_write (c);
}
-#endif
return 1;
}
if (!nfds)
return 0;
#if HAVE_SYS_POLL_H
- yaz_log (LOG_DEBUG, "poll start");
r = poll (pollfds, nfds, 15000);
- yaz_log (LOG_DEBUG, "poll stop, returned r=%d", r);
for (i = 0; i<nfds; i++)
{
ZOOM_connection c = poll_cs[i];
}
if (r == 0 && c->mask)
{
- ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_IO_TIMEOUT);
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_TIMEOUT);
/* timeout and this connection was waiting */
c->error = ZOOM_ERROR_TIMEOUT;
do_close (c);