X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=684cd8e0b52086a889aca92bd543de9950de8c41;hb=646158a86d80e5ef0221ef7d7ce2cfc6ba31eacc;hp=3567ab62086ab874d2adc38675b984bc3ef24575;hpb=856d06997c1494ed13ddad8eed3531d0852290c9;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index 3567ab6..684cd8e 100644 --- a/src/session.c +++ b/src/session.c @@ -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