X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzoom-c.c;h=82044fad5927f80c8656c9e1d4d11eade1e26c03;hb=18f92d330bb581f4d216346dbb73e2b642e720f9;hp=05371beab4b6b7c0075757f3da80c1d8ce7931a6;hpb=29c6ebfc19c403aa99c7f462d2b36f056ffd4dbc;p=yaz-moved-to-github.git diff --git a/src/zoom-c.c b/src/zoom-c.c index 05371be..82044fa 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.76 2006-06-13 16:27:23 mike Exp $ + * $Id: zoom-c.c,v 1.80 2006-06-16 12:34:32 adam Exp $ */ /** * \file zoom-c.c @@ -54,7 +54,6 @@ typedef enum { 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); -static char *ccl2pqf(ZOOM_connection c, const char *ccl); static void initlog() { @@ -73,6 +72,7 @@ static ZOOM_Event ZOOM_Event_create (int kind) event->kind = kind; event->next = 0; event->prev = 0; + yaz_log(log_details, "ZOOM_event_create(%d)", kind); return event; } @@ -565,12 +565,16 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) { char *rpn; int ret; + ZOOM_connection freeme = 0; yaz_log(log_details, "%p ZOOM_query_cql2rpn str=%s conn=%p", s, str, conn); if (conn == 0) - conn = ZOOM_connection_create(0); + conn = freeme = ZOOM_connection_create(0); - if ((rpn = cql2pqf(conn, str)) == 0) + rpn = cql2pqf(conn, str); + if (freeme != 0) + ZOOM_connection_destroy(freeme); + if (rpn == 0) return -1; ret = ZOOM_query_prefix(s, rpn); @@ -584,20 +588,32 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) * to the server, as the YAZ GFS doesn't know how to handle this. */ ZOOM_API(int) -ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) + ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, const char *config, + int *ccl_error, const char **error_string, + int *error_pos) { - char *rpn; int ret; + struct ccl_rpn_node *rpn; + CCL_bibset bibset = ccl_qual_mk(); - yaz_log(log_details, "%p ZOOM_query_ccl2rpn str=%s conn=%p", s, str, conn); - if (conn == 0) - conn = ZOOM_connection_create(0); - - if ((rpn = ccl2pqf(conn, str)) == 0) - return -1; + if (config) + ccl_qual_buf(bibset, config); - ret = ZOOM_query_prefix(s, rpn); - xfree(rpn); + rpn = ccl_find_str(bibset, str, ccl_error, error_pos); + if (!rpn) + { + *error_string = ccl_err_msg(*ccl_error); + ret = -1; + } + else + { + WRBUF wr = wrbuf_alloc(); + ccl_pquery(wr, rpn); + ccl_rpn_delete(rpn); + ret = ZOOM_query_prefix(s, wrbuf_buf(wr)); + wrbuf_free(wr, 1); + } + ccl_qual_rm(&bibset); return ret; } @@ -1180,7 +1196,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c) ZOOM_options_get(c->options, "implementationName"), odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.76 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.80 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, @@ -1324,8 +1340,16 @@ static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c) record_cache_lookup (resultset, i + resultset->start); if (!rec) break; + else + { + ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD); + ZOOM_connection_put_event(c, event); + } } - if (i == resultset->count) + resultset->start += i; + resultset->count -= i; + + if (resultset->count == 0) return zoom_complete; } assert(resultset->query); @@ -2091,6 +2115,8 @@ static void handle_records (ZOOM_connection c, Z_Records *sr, record_cache_add (resultset, p->records[i], i+ resultset->start); } + resultset->count -= i; + resultset->start += i; /* transfer our response to search_nmem .. we need it later */ nmem_transfer (resultset->odr->mem, nmem); nmem_destroy (nmem); @@ -2311,6 +2337,7 @@ static zoom_ret send_present(ZOOM_connection c) yaz_log(log_details, "%p send_present no tasks", c); return zoom_complete; } + switch (c->tasks->which) { case ZOOM_TASK_SEARCH: @@ -2349,8 +2376,16 @@ static zoom_ret send_present(ZOOM_connection c) record_cache_lookup (resultset, i + resultset->start); if (!rec) break; + else + { + ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD); + ZOOM_connection_put_event(c, event); + } } - if (i == resultset->count) + resultset->start += i; + resultset->count -= i; + + if (resultset->count == 0) { yaz_log(log_details, "%p send_present skip=%d no more to fetch", c, i); return zoom_complete; @@ -2359,9 +2394,6 @@ static zoom_ret send_present(ZOOM_connection c) apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest); req = apdu->u.presentRequest; - resultset->start += i; - resultset->count -= i; - if (i) yaz_log(log_details, "%p send_present skip=%d", c, i); @@ -2480,12 +2512,6 @@ ZOOM_connection_scan1 (ZOOM_connection c, ZOOM_query q) start = freeme = cql2pqf(c, q->query_string); if (start == 0) return 0; - } else if (q->z_query->which == Z_Query_type_2) { - yaz_log(log_api, "%p ZOOM_connection_scan1 q=%p CCL '%s'", - c, q, q->query_string); - start = freeme = ccl2pqf(c, q->query_string); - if (start == 0) - return 0; } else { yaz_log(YLOG_FATAL, "%p ZOOM_connection_scan1 q=%p unknown type '%s'", c, q, q->query_string); @@ -3875,6 +3901,7 @@ ZOOM_event (int no, ZOOM_connection *cs) int i, r, nfds; int max_fd = 0; + yaz_log(log_details, "ZOOM_event no=%d", no); for (i = 0; i