Translates diagnostic 1 and 2
[pazpar2-moved-to-github.git] / src / session.c
index e633e52..4d64e32 100644 (file)
@@ -25,6 +25,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <config.h>
 #endif
 
+#include <time.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -34,6 +35,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef WIN32
+#include <windows.h>
+#endif
 #include <signal.h>
 #include <ctype.h>
 #include <assert.h>
@@ -51,6 +55,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/querytowrbuf.h>
 #include <yaz/oid_db.h>
 #include <yaz/snprintf.h>
+#include <yaz/gettimeofday.h>
 
 #define USE_TIMING 0
 #if USE_TIMING
@@ -141,7 +146,7 @@ void pull_terms(NMEM nmem, struct ccl_rpn_node *n, char **termlist, int *num)
 }
 
 
-static void add_facet(struct session *s, const char *type, const char *value)
+void add_facet(struct session *s, const char *type, const char *value, int count)
 {
     int i;
 
@@ -163,7 +168,9 @@ static void add_facet(struct session *s, const char *type, const char *value)
             = termlist_create(s->nmem, TERMLIST_HIGH_SCORE);
         s->num_termlists = i + 1;
     }
-    termlist_insert(s->termlists[i].termlist, value);
+    yaz_log(YLOG_DEBUG, "Session: facets for %s: %s (%d)", type, value, count);
+
+    termlist_insert(s->termlists[i].termlist, value, count);
 }
 
 static xmlDoc *record_to_xml(struct session_database *sdb, const char *rec)
@@ -429,7 +436,7 @@ void session_alert_watch(struct session *s, int what)
         session_watchfun fun;
 
         http_remove_observer(s->watchlist[what].obs);
-        fun = s->watchlist[what].fun;
+        fun  = s->watchlist[what].fun;
         data = s->watchlist[what].data;
 
         /* reset watch before fun is invoked - in case fun wants to set
@@ -439,6 +446,7 @@ void session_alert_watch(struct session *s, int what)
         s->watchlist[what].obs = 0;
 
         session_leave(s);
+        yaz_log(YLOG_DEBUG, "session_alert_watch: %d calling function: %p", what, fun);
         fun(data);
     }
     else
@@ -502,6 +510,19 @@ int session_active_clients(struct session *s)
     return res;
 }
 
+int session_is_preferred_clients_ready(struct session *s)
+{
+    struct client_list *l;
+    int res = 0;
+
+    for (l = s->clients; l; l = l->next)
+        if (client_is_active_preferred(l->client))
+            res++;
+    yaz_log(YLOG_DEBUG, "%p Session has %d active preferred clients.", s, res);
+    return res == 0;
+}
+
+
 
 enum pazpar2_error_code search(struct session *se,
                                const char *query,
@@ -513,6 +534,7 @@ enum pazpar2_error_code search(struct session *se,
     int no_working = 0;
     int no_failed = 0;
     struct client_list *l;
+    struct timeval tval;
 
     yaz_log(YLOG_DEBUG, "Search");
 
@@ -535,6 +557,10 @@ enum pazpar2_error_code search(struct session *se,
     }
     se->reclist = reclist_create(se->nmem);
 
+    yaz_gettimeofday(&tval);
+    
+    tval.tv_sec += 5;
+
     for (l = se->clients; l; l = l->next)
     {
         struct client *cl = l->client;
@@ -552,7 +578,8 @@ enum pazpar2_error_code search(struct session *se,
             no_working++;
             if (client_prep_connection(cl, se->service->z3950_operation_timeout,
                                        se->service->z3950_session_timeout,
-                                       se->service->server->iochan_man))
+                                       se->service->server->iochan_man,
+                                       &tval))
                 client_start_search(cl);
         }
     }
@@ -970,7 +997,10 @@ static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name,
         if (!strcmp((const char *) n->name, "metadata"))
         {
             xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
-            if (!strcmp(name, (const char *) type))
+            if (type == NULL) {
+                yaz_log(YLOG_FATAL, "Missing type attribute on metadata element. Skipping!");
+            }
+            else if (!strcmp(name, (const char *) type))
             {
                 xmlChar *value = xmlNodeListGetString(doc, n->children, 1);
                 if (value)
@@ -1129,6 +1159,7 @@ static int ingest_to_cluster(struct client *cl,
     \param cl client holds the result set for record
     \param rec record buffer (0 terminated)
     \param record_no record position (1, 2, ..)
+    \param nmem working NMEM
     \retval 0 OK
     \retval -1 failure
 */
@@ -1360,22 +1391,23 @@ static int ingest_to_cluster(struct client *cl,
                                      (char *) value, ser_md->rank,
                                      ser_md->name);
 
-            // construct facets ... 
-            if (ser_md->termlist)
+            // construct facets ... unless the client already has reported them
+            if (ser_md->termlist && !client_has_facet(cl, (char *) type))
             {
+
                 if (ser_md->type == Metadata_type_year)
                 {
                     char year[64];
                     sprintf(year, "%d", rec_md->data.number.max);
-                    add_facet(se, (char *) type, year);
+                    add_facet(se, (char *) type, year, 1);
                     if (rec_md->data.number.max != rec_md->data.number.min)
                     {
                         sprintf(year, "%d", rec_md->data.number.min);
-                        add_facet(se, (char *) type, year);
+                        add_facet(se, (char *) type, year, 1);
                     }
                 }
                 else
-                    add_facet(se, (char *) type, (char *) value);
+                    add_facet(se, (char *) type, (char *) value, 1);
             }
 
             // cleaning up