New element <message> in bytarget response
[pazpar2-moved-to-github.git] / src / connection.c
index 1c7d467..f48d735 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2011 Index Data
+   Copyright (C) 2006-2012 Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -162,7 +162,7 @@ static void connection_destroy(struct connection *co)
     connection_use(-1);
 }
 
-// Creates a new connection for client, associated with the host of 
+// Creates a new connection for client, associated with the host of
 // client's database
 static struct connection *connection_create(struct client *cl,
                                             struct host *host,
@@ -182,7 +182,7 @@ static struct connection *connection_create(struct client *cl,
     co->state = Conn_Closed;
     co->operation_timeout = operation_timeout;
     co->session_timeout = session_timeout;
-    
+
     if (host->ipport)
         connection_connect(co, iochan_man);
 
@@ -210,11 +210,11 @@ static void non_block_events(struct connection *co)
         if (!cl)
             continue;
         ev = ZOOM_connection_last_event(link);
-        
+
 #if 1
         yaz_log(YLOG_DEBUG, "%p Connection ZOOM_EVENT_%s", co, ZOOM_get_event_str(ev));
 #endif
-        switch (ev) 
+        switch (ev)
         {
         case ZOOM_EVENT_END:
             {
@@ -224,7 +224,7 @@ static void non_block_events(struct connection *co)
                 {
                     yaz_log(YLOG_LOG, "Error %s from %s",
                             error, client_get_id(cl));
-                    client_set_diagnostic(cl, err);
+                    client_set_diagnostic(cl, err, error, addinfo);
                     client_set_state(cl, Client_Error);
                 }
                 else
@@ -261,6 +261,7 @@ static void non_block_events(struct connection *co)
         default:
             yaz_log(YLOG_LOG, "Unhandled event (%d) from %s",
                     ev, client_get_id(cl));
+            break;
         }
     }
     if (got_records)
@@ -287,7 +288,7 @@ void connection_continue(struct connection *co)
             {
                 yaz_log(YLOG_LOG, "Error %s from %s",
                         error, client_get_id(co->client));
-                client_set_diagnostic(co->client, err);
+                client_set_diagnostic(co->client, err, error, addinfo);
                 client_set_state_nb(co->client, Client_Error);
             }
         }
@@ -307,7 +308,7 @@ static void connection_handler(IOCHAN iochan, int event)
 
     yaz_mutex_enter(host->mutex);
     cl = co->client;
-    if (!cl) 
+    if (!cl)
     {
         /* no client associated with it.. We are probably getting
            a closed connection from the target.. Or, perhaps, an unexpected
@@ -344,7 +345,7 @@ static void connection_handler(IOCHAN iochan, int event)
         non_block_events(co);
 
         ZOOM_connection_fire_event_socket(co->link, event);
-        
+
         non_block_events(co);
         client_unlock(cl);
 
@@ -434,10 +435,10 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
     ZOOM_options_set(zoptions, "async", "1");
     ZOOM_options_set(zoptions, "implementationName", PACKAGE_NAME);
     ZOOM_options_set(zoptions, "implementationVersion", VERSION);
-       
+
     if ((charset = session_setting_oneval(sdb, PZ_NEGOTIATION_CHARSET)))
         ZOOM_options_set(zoptions, "charset", charset);
-    
+
     assert(host->ipport);
     if (host->proxy)
     {
@@ -449,7 +450,7 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
         assert(host->tproxy);
         yaz_log(YLOG_LOG, "tproxy=%s", host->ipport);
         ZOOM_options_set(zoptions, "tproxy", host->ipport);
-    }   
+    }
 
     if (apdulog && *apdulog)
         ZOOM_options_set(zoptions, "apdulog", apdulog);
@@ -458,7 +459,7 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
         ZOOM_options_set(zoptions, "user", auth);
     if ((sru = session_setting_oneval(sdb, PZ_SRU)) && *sru)
         ZOOM_options_set(zoptions, "sru", sru);
-    if ((sru_version = session_setting_oneval(sdb, PZ_SRU_VERSION)) 
+    if ((sru_version = session_setting_oneval(sdb, PZ_SRU_VERSION))
         && *sru_version)
         ZOOM_options_set(zoptions, "sru_version", sru_version);
     if (!(con->link = ZOOM_connection_create(zoptions)))
@@ -524,14 +525,13 @@ int client_prep_connection(struct client *cl,
     if (co)
     {
         assert(co->host);
-        if (co->host == host)
-            ;  /* reusing connection. It's ours! */
-        else 
+        if (co->host == host && client_get_state(cl) == Client_Idle)
         {
-            client_incref(cl);
-            connection_release(co);
-            co = 0;
+            return 2;
         }
+        client_incref(cl);
+        connection_release(co);
+        co = 0;
     }
     if (!co)
     {
@@ -541,7 +541,7 @@ int client_prep_connection(struct client *cl,
                                                PZ_MAX_CONNECTIONS);
         if (v && *v)
             max_connections = atoi(v);
-        
+
         v = session_setting_oneval(client_get_database(cl),
                 PZ_REUSE_CONNECTIONS);
         if (v && *v)