Show command may re-search for targets that support it
[pazpar2-moved-to-github.git] / src / session.c
index 3567ab6..684cd8e 100644 (file)
@@ -246,13 +246,13 @@ static xmlDoc *record_to_xml(struct session *se,
     if (!rdoc)
     {
         session_log(se, YLOG_FATAL, "Non-wellformed XML received from %s",
-                    db->url);
+                    db->id);
         return 0;
     }
 
     if (global_parameters.dump_records)
     {
-        session_log(se, YLOG_LOG, "Un-normalized record from %s", db->url);
+        session_log(se, YLOG_LOG, "Un-normalized record from %s", db->id);
         log_xml_doc(rdoc);
     }
 
@@ -340,7 +340,7 @@ static xmlDoc *normalize_record(struct session *se,
         if (normalize_record_transform(sdb->map, &rdoc, (const char **)parms))
         {
             session_log(se, YLOG_WARN, "Normalize failed from %s",
-                        sdb->database->url);
+                        sdb->database->id);
         }
         else
         {
@@ -349,7 +349,7 @@ static xmlDoc *normalize_record(struct session *se,
             if (global_parameters.dump_records)
             {
                 session_log(se, YLOG_LOG, "Normalized record from %s", 
-                            sdb->database->url);
+                            sdb->database->id);
                 log_xml_doc(rdoc);
             }
         }
@@ -401,7 +401,7 @@ static int prepare_map(struct session *se, struct session_database *sdb)
 
     if (!sdb->settings)
     {
-        session_log(se, YLOG_WARN, "No settings on %s", sdb->database->url);
+        session_log(se, YLOG_WARN, "No settings on %s", sdb->database->id);
         return -1;
     }
     if ((s = session_setting_oneval(sdb, PZ_XSLT)))
@@ -447,7 +447,7 @@ static int prepare_session_database(struct session *se,
     if (!sdb->settings)
     {
         session_log(se, YLOG_WARN, 
-                "No settings associated with %s", sdb->database->url);
+                "No settings associated with %s", sdb->database->id);
         return -1;
     }
     if (sdb->settings[PZ_XSLT] && !sdb->map)
@@ -524,14 +524,8 @@ void session_alert_watch(struct session *s, int what)
 static void select_targets_callback(struct session *se,
                                     struct session_database *db)
 {
-    struct client *cl = client_create();
+    struct client *cl = client_create(db->database->id);
     struct client_list *l;
-    const char *url = session_setting_oneval(db, PZ_URL);
-    
-    if (!url || !*url)
-        url = db->database->url;
-
-    resolve_database(se->service, db->database, url);
 
     client_set_database(cl, db);
 
@@ -597,6 +591,59 @@ int session_is_preferred_clients_ready(struct session *s)
     return res == 0;
 }
 
+void search_sort(struct session *se, const char *field, int increasing)
+{
+    struct client_list *l;
+    struct timeval tval;
+
+    session_enter(se);
+    for (l = se->clients; l; l = l->next)
+    {
+        struct client *cl = l->client;
+        struct session_database *sdb = client_get_database(cl);
+        struct setting *s;
+        const char *strategy_plus_sort = 0;
+        
+        for (s = sdb->settings[PZ_SORTMAP]; s; s = s->next)
+        {
+            char *p = strchr(s->name + 3, ':');
+            if (!p)
+            {
+                yaz_log(YLOG_WARN, "Malformed sortmap name: %s", s->name);
+                continue;
+            }
+            p++;
+            if (!strcmp(p, field))
+            {
+                strategy_plus_sort = s->value;
+                break;
+            }
+        }
+
+        if (strategy_plus_sort)
+        {
+            if (client_prep_connection(cl, se->service->z3950_operation_timeout,
+                                       se->service->z3950_session_timeout,
+                                       se->service->server->iochan_man,
+                                       &tval))
+            {
+                char **array;
+                int num;
+                nmem_strsplit(se->nmem, ":", strategy_plus_sort, &array, &num);
+
+                if (num == 2)
+                {
+                    const char *sort_spec = array[1];
+                    while (*sort_spec == ' ')
+                        sort_spec++;
+                    client_start_search(cl, array[0], sort_spec);
+                }
+            }
+        }
+    }
+    session_leave(se);
+}
+
 enum pazpar2_error_code search(struct session *se,
                                const char *query,
                                const char *startrecs, const char *maxrecs,
@@ -662,7 +709,7 @@ enum pazpar2_error_code search(struct session *se,
                                        se->service->z3950_session_timeout,
                                        se->service->server->iochan_man,
                                        &tval))
-                client_start_search(cl);
+                client_start_search(cl, 0, 0);
         }
     }
     facet_limits_destroy(facet_limits);
@@ -737,7 +784,7 @@ static struct session_database *find_session_database(struct session *se,
     struct session_database *sdb;
 
     for (sdb = se->databases; sdb; sdb = sdb->next)
-        if (!strcmp(sdb->database->url, id))
+        if (!strcmp(sdb->database->id, id))
             return sdb;
     return load_session_database(se, id);
 }
@@ -861,7 +908,7 @@ static struct hitsbytarget *hitsbytarget_nb(struct session *se,
         const char *name = session_setting_oneval(client_get_database(cl),
                                                   PZ_NAME);
 
-        res[*count].id = client_get_database(cl)->database->url;
+        res[*count].id = client_get_id(cl);
         res[*count].name = *name ? name : "Unknown";
         res[*count].hits = client_get_hits(cl);
         res[*count].records = client_get_num_records(cl);
@@ -1311,7 +1358,7 @@ static const char *get_mergekey(xmlDoc *doc, struct client *cl, int record_no,
     if (wrbuf_len(norm_wr) == 0)
     {
         wrbuf_printf(norm_wr, "%s-%d",
-                     client_get_database(cl)->database->url, record_no);
+                     client_get_id(cl), record_no);
     }
     if (wrbuf_len(norm_wr) > 0)
         mergekey_norm = nmem_strdup(nmem, wrbuf_cstr(norm_wr));
@@ -1415,7 +1462,7 @@ int ingest_record(struct client *cl, const char *rec,
     if (!check_record_filter(root, sdb))
     {
         session_log(se, YLOG_LOG, "Filtered out record no %d from %s",
-                    record_no, sdb->database->url);
+                    record_no, sdb->database->id);
         xmlFreeDoc(xdoc);
         return -2;
     }
@@ -1475,7 +1522,7 @@ static int ingest_to_cluster(struct client *cl,
         return -1;
     if (global_parameters.dump_records)
         session_log(se, YLOG_LOG, "Cluster id %s from %s (#%d)", cluster->recid,
-                    sdb->database->url, record_no);
+                    sdb->database->id, record_no);
     relevance_newrec(se->relevance, cluster);
     
     // now parsing XML record and adding data to cluster or record metadata