X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=10cf7905560c4747e3816e76090afe31759df5ce;hb=72da3f05a07602494a978c266f473bb0b4c7841f;hp=868044e02c6c7ab97463651a27edce65916130fe;hpb=3822378d7b75625b8b879025b22bffeb5483b788;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 868044e..10cf790 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.118 2007-03-19 20:58:34 adam Exp $ */ /** * \file zoom-c.c @@ -27,8 +27,6 @@ #include #include -#define TASK_FIX 1 - static int log_api = 0; static int log_details = 0; @@ -37,6 +35,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 +119,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 +133,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) @@ -158,9 +166,7 @@ static void set_dset_error(ZOOM_connection c, int error, c, c->host_port ? c->host_port : "<>", dset, error, addinfo ? addinfo : "", addinfo2 ? addinfo2 : ""); -#if TASK_FIX ZOOM_connection_remove_tasks(c); -#endif } } @@ -172,7 +178,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 +194,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 +279,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 +297,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 +429,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 +471,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); + } { /* @@ -664,8 +674,8 @@ ZOOM_API(int) WRBUF wr = wrbuf_alloc(); ccl_pquery(wr, rpn); ccl_rpn_delete(rpn); - ret = ZOOM_query_prefix(s, wrbuf_buf(wr)); - wrbuf_free(wr, 1); + ret = ZOOM_query_prefix(s, wrbuf_cstr(wr)); + wrbuf_destroy(wr); } ccl_qual_rm(&bibset); return ret; @@ -706,6 +716,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); @@ -842,22 +853,10 @@ ZOOM_API(ZOOM_resultset) return r; } -/* - * This is the old result-set sorting API, which is maintained only - * for the sake of binary compatibility. There is no reason ever to - * use this rather than ZOOM_resultset_sort1(). - */ -ZOOM_API(void) +ZOOM_API(int) ZOOM_resultset_sort(ZOOM_resultset r, const char *sort_type, const char *sort_spec) { - (void) ZOOM_resultset_sort1(r, sort_type, sort_spec); -} - -ZOOM_API(int) - ZOOM_resultset_sort1(ZOOM_resultset r, - const char *sort_type, const char *sort_spec) -{ ZOOM_connection c = r->connection; ZOOM_task task; ZOOM_query newq; @@ -912,11 +911,11 @@ ZOOM_API(void) for (rc = r->record_hash[i]; rc; rc = rc->next) { if (rc->rec.wrbuf_marc) - wrbuf_free(rc->rec.wrbuf_marc, 1); + wrbuf_destroy(rc->rec.wrbuf_marc); if (rc->rec.wrbuf_iconv) - wrbuf_free(rc->rec.wrbuf_iconv, 1); + wrbuf_destroy(rc->rec.wrbuf_iconv); if (rc->rec.wrbuf_opac) - wrbuf_free(rc->rec.wrbuf_opac, 1); + wrbuf_destroy(rc->rec.wrbuf_opac); } r->record_hash[i] = 0; } @@ -925,6 +924,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 +981,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 +1284,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.118 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = @@ -1704,11 +1714,11 @@ ZOOM_API(void) if (!rec) return; if (rec->wrbuf_marc) - wrbuf_free(rec->wrbuf_marc, 1); + wrbuf_destroy(rec->wrbuf_marc); if (rec->wrbuf_iconv) - wrbuf_free(rec->wrbuf_iconv, 1); + wrbuf_destroy(rec->wrbuf_iconv); if (rec->wrbuf_opac) - wrbuf_free(rec->wrbuf_opac, 1); + wrbuf_destroy(rec->wrbuf_opac); odr_destroy(rec->odr); xfree(rec); } @@ -1761,7 +1771,7 @@ static const char *marc_iconv_return(ZOOM_record rec, int marc_type, yaz_iconv_close(cd); if (len) *len = wrbuf_len(rec->wrbuf_marc); - return wrbuf_buf(rec->wrbuf_marc); + return wrbuf_cstr(rec->wrbuf_marc); } yaz_marc_destroy(mt); if (cd) @@ -1824,8 +1834,7 @@ static const char *record_iconv_return(ZOOM_record rec, int *len, } wrbuf_write(rec->wrbuf_iconv, outbuf, outp - outbuf); } - wrbuf_puts(rec->wrbuf_iconv, ""); - buf = wrbuf_buf(rec->wrbuf_iconv); + buf = wrbuf_cstr(rec->wrbuf_iconv); sz = wrbuf_len(rec->wrbuf_iconv); yaz_iconv_close(cd); } @@ -2634,21 +2643,21 @@ static zoom_ret send_present(ZOOM_connection c) } ZOOM_API(ZOOM_scanset) - ZOOM_connection_scan(ZOOM_connection c, const char *start) + ZOOM_connection_scan_pqf(ZOOM_connection c, const char *start) { ZOOM_scanset s; ZOOM_query q = ZOOM_query_create(); ZOOM_query_prefix(q, start); - s = ZOOM_connection_scan1(c, q); + s = ZOOM_connection_scan(c, q); ZOOM_query_destroy(q); return s; } ZOOM_API(ZOOM_scanset) - ZOOM_connection_scan1(ZOOM_connection c, ZOOM_query q) + ZOOM_connection_scan(ZOOM_connection c, ZOOM_query q) { char *start; char *freeme = 0; @@ -2848,11 +2857,12 @@ ZOOM_API(const char *) return ZOOM_options_get(scan->options, key); } -ZOOM_API(void) +ZOOM_API(int) ZOOM_scanset_option_set(ZOOM_scanset scan, const char *key, const char *val) { ZOOM_options_set(scan->options, key, val); + return 0; } static Z_APDU *create_es_package(ZOOM_package p, int type) @@ -3304,11 +3314,12 @@ ZOOM_API(const char *) } -ZOOM_API(void) +ZOOM_API(int) ZOOM_package_option_set(ZOOM_package p, const char *key, const char *val) { ZOOM_options_set(p->options, key, val); + return 0; } static int ZOOM_connection_exec_task(ZOOM_connection c) @@ -3768,11 +3779,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); @@ -3876,18 +3883,20 @@ ZOOM_API(const char *) return ZOOM_options_getl(c->options, key, lenp); } -ZOOM_API(void) +ZOOM_API(int) ZOOM_connection_option_set(ZOOM_connection c, const char *key, const char *val) { ZOOM_options_set(c->options, key, val); + return 0; } -ZOOM_API(void) +ZOOM_API(int) ZOOM_connection_option_setl(ZOOM_connection c, const char *key, const char *val, int len) { ZOOM_options_setl(c->options, key, val, len); + return 0; } ZOOM_API(const char *) @@ -3896,11 +3905,12 @@ ZOOM_API(const char *) return ZOOM_options_get(r->options, key); } -ZOOM_API(void) +ZOOM_API(int) ZOOM_resultset_option_set(ZOOM_resultset r, const char *key, const char *val) { ZOOM_options_set(r->options, key, val); + return 0; } @@ -4063,12 +4073,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);