Updates to pz:authentication documentation
[pazpar2-moved-to-github.git] / src / client.c
index b498751..fe5bef3 100644 (file)
@@ -90,7 +90,7 @@ static int client_use(int delta)
     return clients;
 }
 
-int clients_count(void)
+int clients_get_count(void)
 {
     return client_use(0);
 }
@@ -825,6 +825,7 @@ int client_fetch_more(struct client *cl)
     const char *str;
     int extend_recs = 0;
     int number = cl->hits - cl->record_offset;
+    struct connection *co = client_get_connection(cl);
 
     str = session_setting_oneval(sdb, PZ_EXTENDRECS);
     if (!str || !*str)
@@ -840,10 +841,13 @@ int client_fetch_more(struct client *cl)
 
     if (number > extend_recs)
         number = extend_recs;
-    if (number > 0)
+    if (number <= 0)
+        yaz_log(YLOG_LOG, "cl=%s. OK no more in total set", client_get_id(cl));
+    else if (!co)
+        yaz_log(YLOG_LOG, "cl=%s. No connection", client_get_id(cl));
+    else
     {
         ZOOM_resultset set = cl->resultset;
-        struct connection *co = client_get_connection(cl);
 
         str = session_setting_oneval(sdb, PZ_REQUESTSYNTAX);
         ZOOM_resultset_option_set(set, "preferredRecordSyntax", str);
@@ -856,10 +860,6 @@ int client_fetch_more(struct client *cl)
         connection_continue(co);
         return 1;
     }
-    else
-    {
-        yaz_log(YLOG_LOG, "cl=%s. OK no more in total set", client_get_id(cl));
-    }
     return 0;
 }
 
@@ -958,9 +958,10 @@ int client_start_search(struct client *cl)
     }
     else if (!rc_prep_connection)
     {
-        session_log(se, YLOG_LOG, "%s: postponing search: No connection",
-                    client_get_id(cl));
-        client_set_state_nb(cl, Client_Working);
+        client_set_diagnostic(cl, 2,
+                              ZOOM_diag_str(2),
+                              "Cannot create connection");
+        client_set_state_nb(cl, Client_Error);
         return -1;
     }
     co = client_get_connection(cl);
@@ -1171,6 +1172,12 @@ void client_disconnect(struct client *cl)
     client_set_connection(cl, 0);
 }
 
+void client_mark_dead(struct client *cl)
+{
+    if (cl->connection)
+        connection_mark_dead(cl->connection);
+}
+
 void client_stop(struct client *cl)
 {
     client_lock(cl);
@@ -1386,7 +1393,21 @@ static int apply_limit(struct client *cl,
                                                              cl, name,
                                                              values[i]);
                     if (id)
-                        values[i] = nmem_strdup(nmem_tmp, id);
+                    {
+                        if ( *id )
+                        {
+                            values[i] = nmem_strdup(nmem_tmp, id);
+                            yaz_log(YLOG_DEBUG,
+                                "apply_limit: s='%s' found id '%s'",s->name,id );
+                        }
+                        else
+                        {
+                            yaz_log(YLOG_DEBUG,
+                                "apply_limit: %s: term '%s' not found, failing client",
+                                s->name, values[i] );
+                            ret = -1;
+                        }
+                    }
                 }
                 nmem_strsplit_escape2(nmem_tmp, ",", s->value, &cvalues,
                                       &cnum, 1, '\\', 1);
@@ -1504,6 +1525,9 @@ int client_parse_query(struct client *cl, const char *query,
     if (!ccl_map)
         return -3;
 
+    xfree(cl->cqlquery);
+    cl->cqlquery = 0;
+
     w_ccl = wrbuf_alloc();
     wrbuf_puts(w_ccl, query);
 
@@ -1516,7 +1540,15 @@ int client_parse_query(struct client *cl, const char *query,
 
     if (apply_limit(cl, facet_limits, w_pqf, ccl_map, service))
     {
+        client_set_state(cl, Client_Error);
         ccl_qual_rm(&ccl_map);
+
+        wrbuf_destroy(w_ccl);
+        wrbuf_destroy(w_pqf);
+
+        xfree(cl->pquery);
+        cl->pquery = 0;
+
         return -2;
     }
 
@@ -1537,6 +1569,10 @@ int client_parse_query(struct client *cl, const char *query,
                     wrbuf_cstr(w_ccl));
         wrbuf_destroy(w_ccl);
         wrbuf_destroy(w_pqf);
+
+        xfree(cl->pquery);
+        cl->pquery = 0;
+
         return -1;
     }
     wrbuf_destroy(w_ccl);
@@ -1578,14 +1614,10 @@ int client_parse_query(struct client *cl, const char *query,
     }
     wrbuf_destroy(w_pqf);
 
-    xfree(cl->cqlquery);
-    cl->cqlquery = 0;
-
     odr_out = odr_createmem(ODR_ENCODE);
     zquery = p_query_rpn(odr_out, cl->pquery);
     if (!zquery)
     {
-
         session_log(se, YLOG_WARN, "Invalid PQF query for Client %s: %s",
                     client_get_id(cl), cl->pquery);
         ret_value = -1;