* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.109 2007-01-22 10:35:07 adam Exp $
+ * $Id: zoom-c.c,v 1.115 2007-03-07 14:26:44 adam Exp $
*/
/**
* \file zoom-c.c
#include <yaz/cql.h>
#include <yaz/ccl.h>
+#define TASK_FIX 1
+
static int log_api = 0;
static int log_details = 0;
static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out);
static char *cql2pqf(ZOOM_connection c, const char *cql);
+
+/*
+ * This wrapper is just for logging failed lookups. It would be nicer
+ * if it could cause failure when a lookup fails, but that's hard.
+ */
+static Odr_oid *zoom_yaz_str_to_z3950oid(ZOOM_connection c,
+ int oid_class, const char *str) {
+ Odr_oid *res = yaz_str_to_z3950oid(c->odr_out, oid_class, str);
+ if (res == 0)
+ yaz_log(YLOG_WARN, "%p OID lookup (%d, '%s') failed",
+ c, (int) oid_class, str);
+ return res;
+}
+
+
static void initlog(void)
{
static int log_level_initialized = 0;
return event;
}
+static void ZOOM_connection_remove_events(ZOOM_connection c)
+{
+ ZOOM_Event event;
+ while ((event = ZOOM_connection_get_event(c)))
+ ZOOM_Event_destroy(event);
+}
+
ZOOM_API(int) ZOOM_connection_peek_event(ZOOM_connection c)
{
ZOOM_Event event = c->m_queue_front;
return event ? event->kind : ZOOM_EVENT_NONE;
}
+void ZOOM_connection_remove_tasks(ZOOM_connection c);
+
static void set_dset_error(ZOOM_connection c, int error,
const char *dset,
const char *addinfo, const char *addinfo2)
}
else if (addinfo)
c->addinfo = xstrdup(addinfo);
- if (error)
+ if (error != ZOOM_ERROR_NONE)
+ {
yaz_log(log_api, "%p set_dset_error %s %s:%d %s %s",
c, c->host_port ? c->host_port : "<>", dset, error,
addinfo ? addinfo : "",
addinfo2 ? addinfo2 : "");
+#if TASK_FIX
+ ZOOM_connection_remove_tasks(c);
+#endif
+ }
}
#if YAZ_HAVE_XML2
}
#endif
+
static void set_ZOOM_error(ZOOM_connection c, int error,
const char *addinfo)
{
* or Init Refused are not cleared, because they are not
* recoverable: doing another search doesn't help.
*/
+
+ ZOOM_connection_remove_events(c);
switch (c->error)
{
case ZOOM_ERROR_CONNECT:
initlog();
yaz_log(log_api, "%p ZOOM_connection_connect host=%s portnum=%d",
- c, host, portnum);
+ c, host ? host : "null", portnum);
set_ZOOM_error(c, ZOOM_ERROR_NONE, 0);
ZOOM_connection_remove_tasks(c);
else
c->lang = 0;
- xfree(c->host_port);
- if (portnum)
+ if (host)
{
- char hostn[128];
- sprintf(hostn, "%.80s:%d", host, portnum);
- c->host_port = xstrdup(hostn);
- }
- else
- c->host_port = xstrdup(host);
+ xfree(c->host_port);
+ if (portnum)
+ {
+ char hostn[128];
+ sprintf(hostn, "%.80s:%d", host, portnum);
+ c->host_port = xstrdup(hostn);
+ }
+ else
+ c->host_port = xstrdup(host);
+ }
{
/*
odr_destroy(c->odr_out);
ZOOM_options_destroy(c->options);
ZOOM_connection_remove_tasks(c);
+ ZOOM_connection_remove_events(c);
xfree(c->host_port);
xfree(c->path);
xfree(c->proxy);
static int ZOOM_test_reconnect(ZOOM_connection c)
{
+ ZOOM_Event event;
+
if (!c->reconnect_ok)
return 0;
do_close(c);
c->reconnect_ok = 0;
c->tasks->running = 0;
ZOOM_connection_insert_task(c, ZOOM_TASK_CONNECT);
+
+ event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
+ ZOOM_connection_put_event(c, event);
+
return 1;
}
odr_prepend(c->odr_out, "ZOOM-C",
ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.109 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.115 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion =
}
if (syntax)
search_req->preferredRecordSyntax =
- yaz_str_to_z3950oid(c->odr_out, CLASS_RECSYN, syntax);
+ zoom_yaz_str_to_z3950oid(c, CLASS_RECSYN, syntax);
if (!r->setname)
{
resultset = c->tasks->u.search.resultset;
+ if (sr->resultSetStatus)
+ {
+ ZOOM_options_set_int(resultset->options, "resultSetStatus",
+ *sr->resultSetStatus);
+ }
+ if (sr->presentStatus)
+ {
+ ZOOM_options_set_int(resultset->options, "presentStatus",
+ *sr->presentStatus);
+ }
handle_searchResult(c, resultset, sr->additionalSearchInfo);
resultset->size = *sr->resultCount;
if (syntax && *syntax)
req->preferredRecordSyntax =
- yaz_str_to_z3950oid(c->odr_out, CLASS_RECSYN, syntax);
+ zoom_yaz_str_to_z3950oid(c, CLASS_RECSYN, syntax);
if (resultset->schema && *resultset->schema)
{
compo->u.complex->generic->which = Z_Schema_oid;
compo->u.complex->generic->schema.oid = (Odr_oid *)
- yaz_str_to_z3950oid (c->odr_out, CLASS_SCHEMA, resultset->schema);
+ zoom_yaz_str_to_z3950oid (c, CLASS_SCHEMA, resultset->schema);
if (!compo->u.complex->generic->schema.oid)
{
/* OID wasn't a schema! Try record syntax instead. */
compo->u.complex->generic->schema.oid = (Odr_oid *)
- yaz_str_to_z3950oid (c->odr_out, CLASS_RECSYN, resultset->schema);
+ zoom_yaz_str_to_z3950oid (c, CLASS_RECSYN, resultset->schema);
}
if (elementSetName && *elementSetName)
{
return 0;
if (r <= 0)
{
- if (ZOOM_test_reconnect(c))
- {
- yaz_log(log_details, "%p do_read reconnect read", c);
- }
- else
+ if (!ZOOM_test_reconnect(c))
{
set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, c->host_port);
do_close(c);
{
if (mask & ZOOM_SELECT_EXCEPT)
{
- if (ZOOM_test_reconnect(c))
- {
- event = ZOOM_Event_create(ZOOM_EVENT_CONNECT);
- ZOOM_connection_put_event(c, event);
- }
- else
+ if (!ZOOM_test_reconnect(c))
{
set_ZOOM_error(c, ZOOM_ERROR_CONNECTION_LOST, c->host_port);
do_close(c);