session_log(s, YLOG_DEBUG, "Session unlock by %s", caller);
}
-static void session_normalize_facet(struct session *s,
- const char *type, const char *value,
- WRBUF display_wrbuf, WRBUF facet_wrbuf)
+static int run_icu(struct session *s, const char *icu_chain_id,
+ const char *value,
+ WRBUF norm_wr, WRBUF disp_wr)
{
- struct conf_service *service = s->service;
- pp2_charset_token_t prt;
const char *facet_component;
- int i;
- const char *icu_chain_id = 0;
-
- for (i = 0; i < service->num_metadata; i++)
- if (!strcmp((service->metadata + i)->name, type))
- icu_chain_id = (service->metadata + i)->facetrule;
- if (!icu_chain_id)
- icu_chain_id = "facet";
- prt = pp2_charset_token_create(service->charsets, icu_chain_id);
+ struct conf_service *service = s->service;
+ pp2_charset_token_t prt =
+ pp2_charset_token_create(service->charsets, icu_chain_id);
if (!prt)
{
session_log(s, YLOG_FATAL,
- "Unknown ICU chain '%s' for facet of type '%s'",
- icu_chain_id, type);
- wrbuf_destroy(facet_wrbuf);
- wrbuf_destroy(display_wrbuf);
- return;
+ "Unknown ICU chain '%s'", icu_chain_id);
+ return 0;
}
pp2_charset_token_first(prt, value, 0);
while ((facet_component = pp2_charset_token_next(prt)))
const char *display_component;
if (*facet_component)
{
- if (wrbuf_len(facet_wrbuf))
- wrbuf_puts(facet_wrbuf, " ");
- wrbuf_puts(facet_wrbuf, facet_component);
+ if (wrbuf_len(norm_wr))
+ wrbuf_puts(norm_wr, " ");
+ wrbuf_puts(norm_wr, facet_component);
}
display_component = pp2_get_display(prt);
if (display_component)
{
- if (wrbuf_len(display_wrbuf))
- wrbuf_puts(display_wrbuf, " ");
- wrbuf_puts(display_wrbuf, display_component);
+ if (wrbuf_len(disp_wr))
+ wrbuf_puts(disp_wr, " ");
+ wrbuf_puts(disp_wr, display_component);
}
}
pp2_charset_token_destroy(prt);
+ return 1;
+}
+
+static void session_normalize_facet(struct session *s,
+ const char *type, const char *value,
+ WRBUF display_wrbuf, WRBUF facet_wrbuf)
+{
+ struct conf_service *service = s->service;
+ int i;
+ const char *icu_chain_id = 0;
+
+ for (i = 0; i < service->num_metadata; i++)
+ if (!strcmp((service->metadata + i)->name, type))
+ icu_chain_id = (service->metadata + i)->facetrule;
+ if (!icu_chain_id)
+ icu_chain_id = "facet";
+
+ run_icu(s, icu_chain_id, value, facet_wrbuf, display_wrbuf);
}
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);
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 */
}
}
+void session_stop(struct session *se)
+{
+ 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,
const char *startrecs,
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;
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;
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;
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;
// now parsing XML record and adding data to cluster or record metadata
for (n = root->children; n; n = n->next)
{
- pp2_charset_token_t prt;
if (type)
xmlFree(type);
if (value)
*wheretoput = rec_md;
if (ser_sk)
{
+ pp2_charset_token_t prt;
const char *sort_str = 0;
int skip_article =
ser_sk->type == Metadata_type_skiparticle;