Client state to "working" when waiting for resolver PAZ-907
[pazpar2-moved-to-github.git] / src / client.c
index a7649b4..e3fc2c2 100644 (file)
@@ -90,14 +90,7 @@ static int client_use(int delta)
 
 int clients_count(void)
 {
-    int total = 0;
-    if (g_mutex)
-    {
-        yaz_mutex_enter(g_mutex);
-        total = no_clients;
-        yaz_mutex_leave(g_mutex);
-    }
-    return total;
+    return client_use(0);
 }
 
 /** \brief Represents client state for a connection to one search target */
@@ -874,12 +867,14 @@ int client_start_search(struct client *cl)
     /* Nothing has changed and we already have a result */
     if (cl->same_search == 1 && rc_prep_connection == 2)
     {
-        session_log(se, YLOG_LOG, "client %s REUSE result", client_get_id(cl));
+        session_log(se, YLOG_LOG, "client %s resuse result", client_get_id(cl));
         return client_reingest(cl);
     }
     else if (!rc_prep_connection)
     {
-        session_log(se, YLOG_LOG, "client %s FAILED to search: No connection.", client_get_id(cl));
+        session_log(se, YLOG_LOG, "client %s postponing search: No connection",
+                    client_get_id(cl));
+        client_set_state_nb(cl, Client_Working);
         return -1;
     }
     co = client_get_connection(cl);
@@ -887,7 +882,7 @@ int client_start_search(struct client *cl)
     link = connection_get_link(co);
     assert(link);
 
-    session_log(se, YLOG_LOG, "client %s NEW search", client_get_id(cl));
+    session_log(se, YLOG_LOG, "client %s new search", client_get_id(cl));
 
     cl->diagnostic = 0;
     cl->filtered = 0;
@@ -1348,7 +1343,7 @@ static int apply_limit(struct session_database *sdb,
 // return -1 on query error
 // return -2 on limit error
 int client_parse_query(struct client *cl, const char *query,
-                       facet_limits_t facet_limits)
+                       facet_limits_t facet_limits, const char **error_msg)
 {
     struct session *se = client_get_session(cl);
     struct conf_service *service = se->service;
@@ -1393,6 +1388,8 @@ int client_parse_query(struct client *cl, const char *query,
     ccl_qual_rm(&ccl_map);
     if (!cn)
     {
+        if (error_msg)
+            *error_msg = ccl_err_msg(cerror);
         client_set_state(cl, Client_Error);
         session_log(se, YLOG_WARN, "Client %s: Failed to parse CCL query '%s'",
                     client_get_id(cl),
@@ -1451,6 +1448,7 @@ int client_parse_query(struct client *cl, const char *query,
         session_log(se, YLOG_WARN, "Invalid PQF query for Client %s: %s",
                     client_get_id(cl), cl->pquery);
         ret_value = -1;
+        *error_msg = "Invalid PQF after CCL to PQF conversion";
     }
     else
     {
@@ -1465,7 +1463,10 @@ int client_parse_query(struct client *cl, const char *query,
             else
                 cl->cqlquery = make_cqlquery(cl, zquery);
             if (!cl->cqlquery)
+            {
+                *error_msg = "Cannot convert PQF to Solr/CQL";
                 ret_value = -1;
+            }
             else
                 session_log(se, YLOG_LOG, "Client %s native query: %s (%s)",
                             client_get_id(cl), cl->cqlquery, sru);