More fixes for SRU and ZOOM.
authorAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Oct 2008 13:01:14 +0000 (15:01 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Mon, 20 Oct 2008 13:01:14 +0000 (15:01 +0200)
More fixes for SRU and ZOOM. The set_id_request sequence numbers are gone
- which means that only one task is active per-connection. If a new
search if a connecfion is non-idle a new connection is spawned (before
it was queued).

src/client.c
src/client.h
src/connection.c

index d67712e..3c46784 100644 (file)
@@ -106,7 +106,6 @@ struct show_raw {
 
 static const char *client_states[] = {
     "Client_Connecting",
-    "Client_Connected",
     "Client_Idle",
     "Client_Working",
     "Client_Error",
@@ -351,6 +350,7 @@ void client_search_response(struct client *cl)
     }
     else
     {
+        cl->record_offset = 0;
         cl->hits = ZOOM_resultset_size(resultset);
         se->total_hits += cl->hits;
     }
index 3b0c355..207bf9d 100644 (file)
@@ -30,7 +30,6 @@ struct connection;
 enum client_state
 {
     Client_Connecting,
-    Client_Connected,
     Client_Idle,
     Client_Working,
     Client_Error,
index 55b3766..3db2f9a 100644 (file)
@@ -72,8 +72,6 @@ struct connection {
     char *ibuf;
     int ibufsize;
     char *zproxy;
-    int set_id_request;
-    int set_id_response;
     enum {
         Conn_Resolving,
         Conn_Connecting,
@@ -94,6 +92,8 @@ static int connection_is_idle(struct connection *co)
     if (co->state != Conn_Open || !link)
         return 0;
 
+    if (!ZOOM_connection_is_idle(link))
+        return 0;
     event = ZOOM_connection_peek_event(link);
     if (event == ZOOM_EVENT_NONE ||
                 event == ZOOM_EVENT_END)
@@ -116,7 +116,6 @@ void connection_set_resultset(struct connection *co, ZOOM_resultset rs)
 {
     if (co->resultset)
         ZOOM_resultset_destroy(co->resultset);
-    co->set_id_request++;
     co->resultset = rs;
 }
 
@@ -184,8 +183,6 @@ static struct connection *connection_create(struct client *cl)
     new->link = 0;
     new->resultset = 0;
     new->state = Conn_Resolving;
-    new->set_id_request = 0;
-    new->set_id_response = 0;
     if (host->ipport)
         connection_connect(new);
     return new;
@@ -203,11 +200,21 @@ static void non_block_events(struct connection *co)
         if (!r)
             break;
         ev = ZOOM_connection_last_event(link);
+#if 0
+        yaz_log(YLOG_LOG, "ZOOM_EVENT_%s", ZOOM_get_event_str(ev));
+#endif
         switch (ev) 
         {
         case ZOOM_EVENT_END:
-            if (co->set_id_request == co->set_id_response)
-                client_set_state(co->client, Client_Idle);
+            {
+                const char *error, *addinfo;
+                if (ZOOM_connection_error(link, &error, &addinfo))
+                {
+                    yaz_log(YLOG_LOG, "Error %s from %s",
+                            error, client_get_url(cl));
+                }
+                client_set_state(cl, Client_Idle);
+            }
             break;
         case ZOOM_EVENT_SEND_DATA:
             break;
@@ -223,17 +230,13 @@ static void non_block_events(struct connection *co)
         case ZOOM_EVENT_CONNECT:
             yaz_log(YLOG_LOG, "Connected to %s", client_get_url(cl));
             co->state = Conn_Open;
-            client_set_state(co->client, Client_Connected);
             iochan_settimeout(iochan, global_parameters.z3950_session_timeout);
             break;
         case ZOOM_EVENT_RECV_SEARCH:
-            co->set_id_response++;
-            if (co->set_id_request == co->set_id_response)
-                client_search_response(cl);
+            client_search_response(cl);
             break;
         case ZOOM_EVENT_RECV_RECORD:
-            if (co->set_id_request == co->set_id_response)
-                client_record_response(cl);
+            client_record_response(cl);
             break;
         default:
             yaz_log(YLOG_LOG, "Unhandled event (%d) from %s",
@@ -478,14 +481,14 @@ int client_prep_connection(struct client *cl)
             connection_release(co);
             client_set_connection(cl, co);
             co->client = cl;
-#if 0
             /* tells ZOOM to reconnect if necessary. Disabled becuase
                the ZOOM_connection_connect flushes the task queue */
             ZOOM_connection_connect(co->link, 0, 0);
-#endif
         }
         else
+        {
             co = connection_create(cl);
+        }
     }
 
     if (co && co->link)