X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=1f0cd79709297ba86c9754d0d470a2ab05abe7be;hb=967a1293ee622053b05995d46d63085f6aa23204;hp=868044e02c6c7ab97463651a27edce65916130fe;hpb=3822378d7b75625b8b879025b22bffeb5483b788;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 868044e..1f0cd79 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.112 2007-02-21 09:17:51 adam Exp $ + * $Id: zoom-c.c,v 1.116 2007-03-12 08:27:44 adam Exp $ */ /** * \file zoom-c.c @@ -37,6 +37,7 @@ typedef enum { zoom_complete } zoom_ret; +static void resultset_destroy(ZOOM_resultset r); static zoom_ret ZOOM_connection_send_init(ZOOM_connection c); static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out); static char *cql2pqf(ZOOM_connection c, const char *cql); @@ -120,6 +121,13 @@ static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c) 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; @@ -127,6 +135,8 @@ ZOOM_API(int) ZOOM_connection_peek_event(ZOOM_connection c) 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) @@ -172,7 +182,6 @@ static void set_HTTP_error(ZOOM_connection c, int error, } #endif -void ZOOM_connection_remove_tasks(ZOOM_connection c); static void set_ZOOM_error(ZOOM_connection c, int error, const char *addinfo) @@ -189,6 +198,8 @@ static void clear_error(ZOOM_connection c) * 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: @@ -272,12 +283,12 @@ void ZOOM_connection_remove_task(ZOOM_connection c) switch (task->which) { case ZOOM_TASK_SEARCH: - ZOOM_resultset_destroy(task->u.search.resultset); + resultset_destroy(task->u.search.resultset); xfree(task->u.search.syntax); xfree(task->u.search.elementSetName); break; case ZOOM_TASK_RETRIEVE: - ZOOM_resultset_destroy(task->u.retrieve.resultset); + resultset_destroy(task->u.retrieve.resultset); xfree(task->u.retrieve.syntax); xfree(task->u.retrieve.elementSetName); break; @@ -290,7 +301,7 @@ void ZOOM_connection_remove_task(ZOOM_connection c) ZOOM_package_destroy(task->u.package); break; case ZOOM_TASK_SORT: - ZOOM_resultset_destroy(task->u.sort.resultset); + resultset_destroy(task->u.sort.resultset); ZOOM_query_destroy(task->u.sort.q); break; default: @@ -422,7 +433,7 @@ ZOOM_API(void) 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); @@ -464,15 +475,18 @@ ZOOM_API(void) 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); + } { /* @@ -706,6 +720,7 @@ ZOOM_API(void) 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); @@ -925,6 +940,11 @@ ZOOM_API(void) ZOOM_API(void) ZOOM_resultset_destroy(ZOOM_resultset r) { + resultset_destroy(r); +} + +static void resultset_destroy(ZOOM_resultset r) +{ if (!r) return; (r->refcount)--; @@ -977,12 +997,18 @@ static void do_close(ZOOM_connection c) 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; } @@ -1274,7 +1300,7 @@ static zoom_ret ZOOM_connection_send_init(ZOOM_connection c) odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.112 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.116 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -3768,11 +3794,7 @@ static int do_read(ZOOM_connection c) 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); @@ -4063,12 +4085,7 @@ static void ZOOM_connection_do_io(ZOOM_connection c, int mask) { 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);