More work on a fix for bug #612. We could have "dup" receive
[yaz-moved-to-github.git] / src / zoom-c.c
index 05371be..82044fa 100644 (file)
@@ -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<no; i++)
     {
         ZOOM_connection c = cs[i];
@@ -3888,9 +3915,10 @@ ZOOM_event (int no, ZOOM_connection *cs)
     for (i = 0; i<no; i++)
     {
         ZOOM_connection c = cs[i];
-        ZOOM_Event event;
-        if (c && ZOOM_connection_exec_task (c))
+        if (c)
         {
+            ZOOM_Event event;
+            ZOOM_connection_exec_task (c);
             if ((event = ZOOM_connection_get_event(c)))
             {
                 ZOOM_Event_destroy (event);
@@ -4106,51 +4134,6 @@ static char *cql2pqf(ZOOM_connection c, const char *cql)
     return xstrdup(pqfbuf);
 }
 
-
-/* ### Could cache `bibset' */
-static char *ccl2pqf(ZOOM_connection c, const char *ccl)
-{
-    const char *cclfile;
-    CCL_bibset bibset;
-    struct ccl_rpn_node *node;
-    int errorcode;
-    int errorpos;
-    WRBUF w;
-    char *pqf;
-
-    if ((cclfile = ZOOM_connection_option_get(c, "cclfile")) == 0) {
-        set_ZOOM_error(c, ZOOM_ERROR_CCL_CONFIG, "no CCL qualifier file");
-        return 0;
-    }
-
-    bibset = ccl_qual_mk();
-    if (ccl_qual_fname(bibset, cclfile) < 0) {
-        char buf[512];
-        ccl_qual_rm(&bibset);
-        sprintf(buf, "can't open CCL qualifier file '%.200s': %.200s",
-                cclfile, strerror(errno));
-        set_ZOOM_error(c, ZOOM_ERROR_CCL_CONFIG, buf);
-        return 0;
-    }
-
-    node = ccl_find_str (bibset, ccl, &errorcode, &errorpos);
-    ccl_qual_rm(&bibset);
-    if (node == 0) {
-        /* code is one of the CCL_ERR_* constants; pos is unused here */
-        set_ZOOM_error(c, ZOOM_ERROR_CCL_PARSE, ccl_err_msg(errorcode));
-        return 0;
-    }
-
-    w = wrbuf_alloc();
-    ccl_pquery(w, node);
-    ccl_rpn_delete(node);
-    pqf = xstrdup(wrbuf_buf(w));
-    wrbuf_free(w, 1);
-
-    return pqf;
-}
-
-
 /*
  * Local variables:
  * c-basic-offset: 4