X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fsession.c;h=325ba288cf8bba00352af1dda9ef65f03a8af8c1;hb=37482a306afb1c7952bdf304530498b6d068db92;hp=ea3c0ff29cdb8454155b8da68becaa033546f826;hpb=efe1343048be89213f3a9933e6b9fbbd481f3d61;p=pazpar2-moved-to-github.git diff --git a/src/session.c b/src/session.c index ea3c0ff..325ba28 100644 --- a/src/session.c +++ b/src/session.c @@ -204,29 +204,18 @@ void add_facet(struct session *s, const char *type, const char *value, int count if (wrbuf_len(facet_wrbuf)) { - int i; - for (i = 0; i < s->num_termlists; i++) - if (!strcmp(s->termlists[i].name, type)) + struct named_termlist **tp = &s->termlists; + for (; (*tp); tp = &(*tp)->next) + if (!strcmp((*tp)->name, type)) break; - if (i == s->num_termlists) + if (!*tp) { - if (i == SESSION_MAX_TERMLISTS) - { - session_log(s, YLOG_FATAL, "Too many termlists"); - wrbuf_destroy(facet_wrbuf); - wrbuf_destroy(display_wrbuf); - return; - } - - s->termlists[i].name = nmem_strdup(s->nmem, type); - s->termlists[i].termlist = termlist_create(s->nmem); - s->num_termlists = i + 1; + *tp = nmem_malloc(s->nmem, sizeof(**tp)); + (*tp)->name = nmem_strdup(s->nmem, type); + (*tp)->termlist = termlist_create(s->nmem); + (*tp)->next = 0; } - -#if 0 - session_log(s, YLOG_LOG, "Facets for %s: %s norm:%s (%d)", type, value, wrbuf_cstr(facet_wrbuf), count); -#endif - termlist_insert(s->termlists[i].termlist, wrbuf_cstr(display_wrbuf), + termlist_insert((*tp)->termlist, wrbuf_cstr(display_wrbuf), wrbuf_cstr(facet_wrbuf), count); } wrbuf_destroy(facet_wrbuf); @@ -604,8 +593,7 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp) nmem_total(se->nmem)); nmem_reset(se->nmem); se->total_records = se->total_merged = 0; - se->num_termlists = 0; - + se->termlists = 0; relevance_clear(se->relevance); /* reset list of sorted results and clear to relevance search */ @@ -621,10 +609,8 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp) se->reclist = reclist_create(se->nmem); } -static void session_sort_unlocked(struct session *se, - struct reclist_sortparms *sp, - const char *mergekey, - const char *rank) +void session_sort(struct session *se, struct reclist_sortparms *sp, + const char *mergekey, const char *rank) { struct client_list *l; const char *field = sp->name; @@ -632,6 +618,7 @@ static void session_sort_unlocked(struct session *se, int type = sp->type; int clients_research = 0; + session_enter(se, "session_sort"); session_log(se, YLOG_DEBUG, "session_sort field=%s increasing=%d type=%d", field, increasing, type); @@ -665,6 +652,7 @@ static void session_sort_unlocked(struct session *se, { session_log(se, YLOG_DEBUG, "session_sort: field=%s increasing=%d type=%d already fetched", field, increasing, type); + session_leave(se, "session_sort"); return; } } @@ -682,14 +670,7 @@ static void session_sort_unlocked(struct session *se, client_parse_init(cl, 1); clients_research += client_parse_sort(cl, sp); } - if (clients_research) - { - session_log(se, YLOG_DEBUG, - "session_sort: reset results due to %d clients researching", - clients_research); - session_clear_set(se, sp); - } - else + if (!clients_research || se->clients_starting) { // A new sorting based on same record set struct reclist_sortparms *sr = nmem_malloc(se->nmem, sizeof(*sr)); @@ -699,36 +680,66 @@ static void session_sort_unlocked(struct session *se, sr->next = se->sorted_results; se->sorted_results = sr; session_log(se, YLOG_DEBUG, "session_sort: no research/ingesting done"); - return ; + session_leave(se, "session_sort"); } - session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order"); - - for (l = se->clients_active; l; l = l->next) + else { - struct client *cl = l->client; - if (client_get_state(cl) == Client_Connecting || - client_get_state(cl) == Client_Idle || - client_get_state(cl) == Client_Working) { - client_start_search(cl); - } - else + se->clients_starting = 1; + session_log(se, YLOG_DEBUG, + "session_sort: reset results due to %d clients researching", + clients_research); + session_clear_set(se, sp); + session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order"); + + session_leave(se, "session_sort"); + for (l = se->clients_active; l; l = l->next) { - session_log(se, YLOG_DEBUG, - "session_sort: %s: No re-start/ingest in show. " - "Wrong client state: %d", - client_get_id(cl), client_get_state(cl)); + struct client *cl = l->client; + if (client_get_state(cl) == Client_Connecting || + client_get_state(cl) == Client_Idle || + client_get_state(cl) == Client_Working) { + client_start_search(cl); + } + else + { + session_log(se, YLOG_DEBUG, + "session_sort: %s: No re-start/ingest in show. " + "Wrong client state: %d", + client_get_id(cl), client_get_state(cl)); + } } + session_enter(se, "session_sort"); + se->clients_starting = 0; + session_leave(se, "session_sort"); } } -void session_sort(struct session *se, struct reclist_sortparms *sp, - const char *mergekey, const char *rank) +void session_stop(struct session *se) { - //session_enter(se, "session_sort"); - session_sort_unlocked(se, sp, mergekey, rank); - //session_leave(se, "session_sort"); -} + struct client_list *l; + session_enter(se, "session_stop1"); + if (se->clients_starting) + { + session_leave(se, "session_stop1"); + return; + } + se->clients_starting = 1; + session_leave(se, "session_stop1"); + + session_alert_watch(se, SESSION_WATCH_SHOW); + session_alert_watch(se, SESSION_WATCH_BYTARGET); + session_alert_watch(se, SESSION_WATCH_TERMLIST); + session_alert_watch(se, SESSION_WATCH_SHOW_PREF); + for (l = se->clients_active; l; l = l->next) + { + struct client *cl = l->client; + client_stop(cl); + } + session_enter(se, "session_stop2"); + se->clients_starting = 0; + session_leave(se, "session_stop2"); +} enum pazpar2_error_code session_search(struct session *se, const char *query, @@ -1002,7 +1013,7 @@ struct session *new_session(NMEM nmem, struct conf_service *service, session->total_records = 0; session->number_of_warnings_unknown_elements = 0; session->number_of_warnings_unknown_metadata = 0; - session->num_termlists = 0; + session->termlists = 0; session->reclist = reclist_create(nmem); session->clients_active = 0; session->clients_cached = 0; @@ -1151,7 +1162,7 @@ static int targets_termlist_nb(WRBUF wrbuf, struct session *se, int num, void perform_termlist(struct http_channel *c, struct session *se, const char *name, int num, int version) { - int i, j; + int j; NMEM nmem_tmp = nmem_create(); char **names; int num_names = 0; @@ -1168,9 +1179,10 @@ void perform_termlist(struct http_channel *c, struct session *se, const char *tname; int must_generate_empty = 1; /* bug 5350 */ - for (i = 0; i < se->num_termlists; i++) + struct named_termlist *t = se->termlists; + for (; t; t = t->next) { - tname = se->termlists[i].name; + tname = t->name; if (!strcmp(names[j], tname) || !strcmp(names[j], "*")) { struct termlist_score **p = 0; @@ -1181,8 +1193,7 @@ void perform_termlist(struct http_channel *c, struct session *se, wrbuf_puts(c->wrbuf, "\">\n"); must_generate_empty = 0; - p = termlist_highscore(se->termlists[i].termlist, &len, - nmem_tmp); + p = termlist_highscore(t->termlist, &len, nmem_tmp); if (p) { int i;