46 #include <yaz/marcdisp.h>
47 #include <yaz/comstack.h>
48 #include <yaz/tcpip.h>
49 #include <yaz/proto.h>
50 #include <yaz/readconf.h>
51 #include <yaz/pquery.h>
52 #include <yaz/otherinfo.h>
53 #include <yaz/yaz-util.h>
55 #include <yaz/query-charset.h>
56 #include <yaz/querytowrbuf.h>
57 #include <yaz/oid_db.h>
58 #include <yaz/snprintf.h>
59 #include <yaz/xml_get.h>
63 #include <yaz/timing.h>
79 #include <libxml/tree.h>
83 #define MAX(a,b) ((a)>(b)?(a):(b))
111 yaz_log(YLOG_DEBUG,
"%s sessions=%d", delta == 0 ?
"" :
123 FILE *lf = yaz_log_file();
126 #if LIBXML_VERSION >= 20600
127 xmlDocDumpFormatMemory(doc, &result, &len, 1);
129 xmlDocDumpMemory(doc, &result, &len);
133 (void) fwrite(result, 1, len, lf);
142 session_log(s, YLOG_DEBUG,
"Session lock by %s", caller);
150 session_log(s, YLOG_DEBUG,
"Session unlock by %s", caller);
155 WRBUF norm_wr, WRBUF disp_wr)
157 const char *facet_component;
164 "Unknown ICU chain '%s'", icu_chain_id);
170 const char *display_component;
171 if (*facet_component)
173 if (wrbuf_len(norm_wr))
174 wrbuf_puts(norm_wr,
" ");
175 wrbuf_puts(norm_wr, facet_component);
178 if (display_component)
180 if (wrbuf_len(disp_wr))
181 wrbuf_puts(disp_wr,
" ");
182 wrbuf_puts(disp_wr, display_component);
190 const char *type,
const char *value,
191 WRBUF display_wrbuf, WRBUF facet_wrbuf)
195 const char *icu_chain_id = 0;
198 if (!strcmp((service->
metadata + i)->name, type))
199 icu_chain_id = (service->
metadata + i)->facetrule;
201 icu_chain_id =
"facet";
203 run_icu(s, icu_chain_id, value, facet_wrbuf, display_wrbuf);
240 for (; t; t = t->
next)
256 WRBUF facet_wrbuf = wrbuf_alloc();
257 WRBUF display_wrbuf = wrbuf_alloc();
262 if (!strncmp(
type,
"split:", 6))
264 const char *cp = strchr(value,
':');
275 if (wrbuf_len(facet_wrbuf))
278 for (; (*tp); tp = &(*tp)->
next)
279 if (!strcmp((*tp)->name, type))
283 *tp = nmem_malloc(s->
nmem,
sizeof(**tp));
284 (*tp)->name = nmem_strdup(s->
nmem, type);
289 wrbuf_cstr(facet_wrbuf),
id, id_len, count);
292 wrbuf_cstr(display_wrbuf));
294 wrbuf_destroy(facet_wrbuf);
295 wrbuf_destroy(display_wrbuf);
304 rdoc = xmlParseMemory(rec, strlen(rec));
314 session_log(se, YLOG_LOG,
"Un-normalized record from %s", db->
id);
321 #define MAX_XSLT_ARGS 16
345 int len = strlen(val);
346 buf = nmem_malloc(nmem, len + 3);
348 strcpy(buf + 1, val);
351 parms[offset++] = md->
name;
352 parms[offset++] = buf;
378 xmlNode *n = xmlNewTextChild(root, 0, (xmlChar *)
"metadata",
380 xmlSetProp(n, (xmlChar *)
"type", (xmlChar *) md->
name);
389 const char *rec, NMEM nmem)
414 for (i = 0; i < num; i++)
417 for (;s ; s = s->
next)
419 wrbuf_puts(w,
"<set name=\"");
420 wrbuf_xmlputs(w, s->
name);
421 wrbuf_puts(w,
"\" value=\"");
422 wrbuf_xmlputs(w, s->
value);
423 wrbuf_puts(w,
"\"/>");
454 char auto_stylesheet[256];
456 if (!strcmp(s,
"auto"))
463 yaz_snprintf(auto_stylesheet,
sizeof(auto_stylesheet),
464 "%s.xsl", request_syntax);
465 for (cp = auto_stylesheet; *cp; cp++)
468 if (*cp > 32 && *cp < 127)
476 "No pz:requestsyntax for auto stylesheet");
543 "Alert Watch: %d calling function: %p", what,
fun);
568 l = xmalloc(
sizeof(*l));
575 l = xmalloc(
sizeof(*l));
657 session_log(s, YLOG_DEBUG,
"Has %d active preferred clients.", res);
664 if (nmem_total(se->
nmem))
665 session_log(se, YLOG_DEBUG,
"NMEN operation usage %zd",
666 nmem_total(se->
nmem));
667 nmem_reset(se->
nmem);
679 session_log(se, YLOG_DEBUG,
"clear_set session_sort: field=%s increasing=%d type=%d configured",
686 const char *mergekey,
const char *rank)
689 const char *field = sp->
name;
692 int clients_research = 0;
695 session_log(se, YLOG_DEBUG,
"session_sort field=%s increasing=%d type=%d",
696 field, increasing, type);
698 if (rank && (!se->
rank || strcmp(se->
rank, rank)))
703 se->
rank = *rank ? xstrdup(rank) : 0;
704 clients_research = 1;
705 session_log(se, YLOG_DEBUG,
"session_sort: new rank = %s",
713 se->
mergekey = *mergekey ? xstrdup(mergekey) : 0;
714 clients_research = 1;
715 session_log(se, YLOG_DEBUG,
"session_sort: new mergekey = %s",
718 if (clients_research == 0)
726 session_log(se, YLOG_LOG,
"session_sort: field=%s increasing=%d type=%d already fetched",
732 session_log(se, YLOG_DEBUG,
"session_sort: field=%s increasing=%d type=%d must fetch",
750 sr->
name = nmem_strdup(se->
nmem, field);
755 session_log(se, YLOG_DEBUG,
"session_sort: no research/ingesting done");
762 "session_sort: reset results due to %d clients researching",
765 session_log(se, YLOG_DEBUG,
"Re- search/ingesting for clients due to change in sort order");
779 "session_sort: %s: No re-start/ingest in show. "
780 "Wrong client state: %d",
825 const char **addinfo2,
827 const char *mergekey,
830 int live_channels = 0;
832 int no_failed_query = 0;
833 int no_failed_limit = 0;
837 session_log(se, YLOG_LOG,
"search query %s", query);
839 session_log(se, YLOG_LOG,
"search filter %s", filter);
841 session_log(se, YLOG_LOG,
"search limit %s", limit);
867 se->
mergekey = *mergekey ? xstrdup(mergekey) : 0;
872 se->
rank = *rank ? xstrdup(rank) : 0;
915 else if (parse_ret == -2)
917 else if (parse_ret < 0)
928 "working %d sortmap %d failed-query %d failed-limit %d",
929 no_working, no_sortmap, no_failed_query, no_failed_limit);
931 if (no_working == 1 && no_sortmap == 1)
934 yaz_log(YLOG_LOG,
"force_position=1");
940 if (no_failed_query > 0)
945 else if (no_failed_limit > 0)
1019 const char *
name,
const char *value)
1058 int no_facet_ids = 0;
1063 "session-total %d nmem-op %zd nmem-ses %zd facets-ids %d",
1077 nmem_destroy(se->
nmem);
1083 size_t session_nmem;
1089 return session_nmem;
1141 int *count, NMEM nmem)
1150 res = nmem_malloc(nmem,
sizeof(*res) * sz);
1155 WRBUF w = wrbuf_alloc();
1171 res[*count].
settings_xml = nmem_strdup(nmem, wrbuf_cstr(w));
1194 static int cmp_ht(
const void *p1,
const void *p2)
1210 NMEM nmem,
int version)
1220 for (i = 0; i < count && i < num && ht[i].
hits > 0; i++)
1225 wrbuf_puts(wrbuf,
"<term>\n");
1227 wrbuf_puts(wrbuf,
"<id>");
1228 wrbuf_xmlputs(wrbuf, ht[i].
id);
1229 wrbuf_puts(wrbuf,
"</id>\n");
1231 wrbuf_puts(wrbuf,
"<name>");
1233 wrbuf_xmlputs(wrbuf,
"NO TARGET NAME");
1235 wrbuf_xmlputs(wrbuf, ht[i].
name);
1236 wrbuf_puts(wrbuf,
"</name>\n");
1238 wrbuf_printf(wrbuf,
"<frequency>" ODR_INT_PRINTF
"</frequency>\n",
1243 wrbuf_printf(wrbuf,
"<approximation>" ODR_INT_PRINTF
"</approximation>\n", ht[i].
approximation);
1244 wrbuf_printf(wrbuf,
"<records>%d</records>\n", ht[i].
records - ht[i].
filtered);
1245 wrbuf_printf(wrbuf,
"<filtered>%d</filtered>\n", ht[i].
filtered);
1248 wrbuf_puts(wrbuf,
"<state>");
1249 wrbuf_xmlputs(wrbuf, ht[i].
state);
1250 wrbuf_puts(wrbuf,
"</state>\n");
1252 wrbuf_printf(wrbuf,
"<diagnostic>%d</diagnostic>\n",
1254 wrbuf_puts(wrbuf,
"</term>\n");
1260 const char *
name,
int num,
int version)
1263 NMEM nmem_tmp = nmem_create();
1270 nmem_strsplit(nmem_tmp,
",",
name, &names, &num_names);
1274 for (j = 0; j < num_names; j++)
1277 int must_generate_empty = 1;
1280 for (; t; t = t->
next)
1283 if (!strcmp(names[j], tname) || !strcmp(names[j],
"*"))
1288 wrbuf_puts(c->
wrbuf,
"<list name=\"");
1289 wrbuf_xmlputs(c->
wrbuf, tname);
1290 wrbuf_puts(c->
wrbuf,
"\">\n");
1291 must_generate_empty = 0;
1297 for (i = 0; i < len && i < num; i++)
1303 wrbuf_puts(c->
wrbuf,
"<term>");
1304 wrbuf_puts(c->
wrbuf,
"<name>");
1306 wrbuf_puts(c->
wrbuf,
"</name>");
1307 wrbuf_printf(c->
wrbuf,
1308 "<frequency>%d</frequency>",
1310 wrbuf_puts(c->
wrbuf,
"</term>\n");
1313 wrbuf_puts(c->
wrbuf,
"</list>\n");
1317 if (!strcmp(names[j], tname) || !strcmp(names[j],
"*"))
1319 wrbuf_puts(c->
wrbuf,
"<list name=\"");
1320 wrbuf_xmlputs(c->
wrbuf, tname);
1321 wrbuf_puts(c->
wrbuf,
"\">\n");
1324 wrbuf_puts(c->
wrbuf,
"</list>\n");
1325 must_generate_empty = 0;
1327 if (must_generate_empty)
1329 wrbuf_puts(c->
wrbuf,
"<list name=\"");
1330 wrbuf_xmlputs(c->
wrbuf, names[j]);
1331 wrbuf_puts(c->
wrbuf,
"\"/>\n");
1335 nmem_destroy(nmem_tmp);
1338 #ifdef MISSING_HEADERS
1339 void report_nmem_stats(
void)
1341 size_t in_use, is_free;
1343 nmem_get_memory_in_use(&in_use);
1344 nmem_get_memory_free(&is_free);
1346 yaz_log(YLOG_LOG,
"nmem stat: use=%ld free=%ld",
1347 (
long) in_use, (
long) is_free);
1365 if (!strcmp(r->
recid,
id))
1408 session_log(se, YLOG_LOG,
"%s: hits=" ODR_INT_PRINTF
1409 " fetched=%d filtered=%d",
1416 " ingest failures=%d record failures=%d",
1424 session_log(se, YLOG_LOG,
"%s: no fetch due to state=%s",
1434 int start,
int *num,
int *total,
1435 Odr_int *sumhits, Odr_int *approx_hits,
1445 yaz_timing_t t = yaz_timing_create();
1454 for (spp = sp; spp; spp = spp->
next)
1467 nmem_tmp = nmem_create();
1473 nmem_destroy(nmem_tmp);
1481 for (i = 0; i < start; i++)
1492 for (;rec; rec = rec->
next)
1496 recs = nmem_malloc(se->
nmem, (*num > 0 ? *num : 1) *
sizeof(*recs));
1497 for (i = 0; i < *num; i++)
1508 for (;rec; rec = rec->
next)
1516 session_log(se, YLOG_LOG,
"show %6.5f %3.2f %3.2f",
1517 yaz_timing_get_real(t), yaz_timing_get_user(t),
1518 yaz_timing_get_sys(t));
1519 yaz_timing_destroy(&t);
1527 session_log(se, YLOG_LOG,
"fetching more in progress");
1531 session_log(se, YLOG_WARN,
"Ignoring show block");
1553 memset(stat, 0,
sizeof(*stat));
1578 NMEM nmem,
const char *value,
const char *norm,
1580 struct _xmlAttr *attr)
1585 for (; attr; attr = attr->next)
1587 if (attr->children && attr->children->content)
1589 if (strcmp((
const char *) attr->name,
"type")
1590 && strcmp((
const char *) attr->name,
"empty"))
1594 *attrp = nmem_malloc(nmem,
sizeof(**attrp));
1596 nmem_strdup(nmem, (
const char *) attr->name);
1598 nmem_strdup(nmem, (
const char *) attr->children->content);
1599 attrp = &(*attrp)->
next;
1616 if (strstr(
value,
"://"))
1653 WRBUF norm_wr,
const char *
value)
1655 const char *norm_str;
1664 if (wrbuf_len(norm_wr))
1665 wrbuf_puts(norm_wr,
" ");
1666 wrbuf_puts(norm_wr, norm_str);
1677 for (n = root->children; n; n = n->next)
1679 if (n->type != XML_ELEMENT_NODE)
1681 if (!strcmp((
const char *) n->name,
"metadata"))
1683 const char *type = yaz_xml_get_prop(n,
"type");
1685 yaz_log(YLOG_FATAL,
"Missing type attribute on metadata element. Skipping!");
1687 else if (!strcmp(
name, (
const char *) type))
1689 xmlChar *
value = xmlNodeListGetString(doc, n->children, 1);
1692 if (wrbuf_len(norm_wr) > 0)
1693 wrbuf_puts(norm_wr,
" ");
1694 wrbuf_puts(norm_wr,
name);
1696 (
const char *)
value);
1708 struct client *cl,
int record_no,
1710 const char *session_mergekey)
1712 char *mergekey_norm = 0;
1713 WRBUF norm_wr = wrbuf_alloc();
1714 const char *mergekey;
1716 if (session_mergekey)
1720 nmem_strsplit_escape2(nmem,
",", session_mergekey, &values,
1723 for (i = 0; i < num; i++)
1726 else if ((mergekey = yaz_xml_get_prop(root,
"mergekey")))
1734 for (field_id = 0; field_id < service->
num_metadata; field_id++)
1745 wrbuf_rewind(norm_wr);
1753 if (wrbuf_len(norm_wr) == 0)
1755 wrbuf_printf(norm_wr,
"position: %s-%06d",
1760 const char *lead =
"content: ";
1761 wrbuf_insert(norm_wr, 0, lead, strlen(lead));
1763 if (wrbuf_len(norm_wr) > 0)
1764 mergekey_norm = nmem_strdup(nmem, wrbuf_cstr(norm_wr));
1765 wrbuf_destroy(norm_wr);
1766 return mergekey_norm;
1789 for (n = root->children; n; n = n->next)
1791 if (n->type != XML_ELEMENT_NODE)
1793 if (!strcmp((
const char *) n->name,
"metadata"))
1795 const char *
type = yaz_xml_get_prop(n,
"type");
1802 if ((eq = strchr(s,
'=')))
1804 else if ((eq = strchr(s,
'~')))
1810 if (len == strlen((
const char *)
type) &&
1811 !memcmp((
const char *)
type, s, len))
1813 xmlChar *value = xmlNodeGetContent(n);
1814 if (value && *value)
1817 (substring && strstr((
const char *) value, eq+1)) ||
1818 (!substring && !strcmp((
const char *) value, eq + 1)))
1838 int record_no, NMEM nmem,
1844 WRBUF wrbuf_disp, wrbuf_norm;
1849 "Filtered out record no %d from %s",
1853 wrbuf_disp = wrbuf_alloc();
1854 wrbuf_norm = wrbuf_alloc();
1858 xdoc, root, record_no, mergekeys);
1860 wrbuf_destroy(wrbuf_norm);
1861 wrbuf_destroy(wrbuf_disp);
1875 int record_no, NMEM
nmem)
1887 int record_no, NMEM
nmem,
int cached_copy)
1899 session_log(se, YLOG_LOG,
"Normalized record from %s",
1904 root = xmlDocGetRootElement(xdoc);
1906 if (!strcmp((
const char *) root->name,
"cluster"))
1908 int no_merge_keys = 0;
1909 int no_merge_dups = 0;
1913 for (sroot = root->children; sroot; sroot = sroot->next)
1914 if (sroot->type == XML_ELEMENT_NODE &&
1915 !strcmp((
const char *) sroot->name,
"record"))
1918 const char *mergekey_norm =
1919 get_mergekey(xdoc, sroot, cl, record_no, service, nmem,
1926 for (mkp = &mk; *mkp; mkp = &(*mkp)->
next)
1927 if (!strcmp((*mkp)->value, mergekey_norm))
1932 nmem_malloc(nmem,
sizeof(**mkp));
1934 (*mkp)->value = nmem_strdup(nmem, mergekey_norm);
1941 if (no_merge_keys > 1 || no_merge_dups > 0)
1943 yaz_log(YLOG_LOG,
"Got %d mergekeys, %d dups for position %d",
1944 no_merge_keys, no_merge_dups, record_no);
1946 for (sroot = root->children; !r && sroot; sroot = sroot->next)
1947 if (sroot->type == XML_ELEMENT_NODE &&
1948 !strcmp((
const char *) sroot->name,
"record"))
1956 else if (!strcmp((
const char *) root->name,
"record"))
1958 const char *mergekey_norm =
1964 nmem_malloc(nmem,
sizeof(*mk));
1966 mk->
value = nmem_strdup(nmem, mergekey_norm);
1976 session_log(se, YLOG_WARN,
"Bad pz root element: %s",
1977 (
const char *) root->name);
1989 char **values,
int num_v)
1994 WRBUF text_wr = wrbuf_alloc();
1995 for (i = 0; i < num_v; )
2002 int y = atoi(values[i]);
2011 val_wr = wrbuf_alloc();
2014 wrbuf_rewind(text_wr);
2017 if (!strcmp(wrbuf_cstr(val_wr), wrbuf_cstr(text_wr)))
2020 rec_md = rec_md->
next;
2025 wrbuf_destroy(val_wr);
2030 wrbuf_destroy(val_wr);
2031 wrbuf_destroy(text_wr);
2032 return i < num_v ? 1 : 0;
2042 NMEM nmem_tmp = nmem_create();
2058 if (md_field_id < 0)
2064 nmem_strsplit_escape2(nmem_tmp,
"|", value, &values,
2078 nmem_destroy(nmem_tmp);
2087 int skip_record = 0;
2090 NMEM nmem_tmp = nmem_create();
2093 while (!skip_record)
2104 if (!strcmp(
name,
"*"))
2106 for (md_field_id = 0; md_field_id < service->
num_metadata;
2122 if (md_field_id < 0)
2137 nmem_destroy(nmem_tmp);
2152 int term_factor = 1;
2156 NMEM ingest_nmem = 0;
2157 char **rank_values = 0;
2164 for (n = root->children; n; n = n->next)
2166 if (n->type != XML_ELEMENT_NODE)
2168 if (!strcmp((
const char *) n->name,
"metadata"))
2173 int md_field_id = -1;
2175 const char *type = yaz_xml_get_prop(n,
"type");
2182 if (md_field_id < 0)
2187 "Ignoring unknown metadata element: %s", type);
2193 wrbuf_rewind(wrbuf_disp);
2194 value0 = xmlNodeListGetString(xdoc, n->children, 1);
2195 if (!value0 || !*value0)
2197 const char *empty = yaz_xml_get_prop(n,
"empty");
2202 wrbuf_puts(wrbuf_disp, (
const char *) empty);
2206 wrbuf_puts(wrbuf_disp, (
const char *) value0);
2209 ser_md = &service->
metadata[md_field_id];
2213 ser_md->
type, n->properties);
2216 session_log(se, YLOG_WARN,
"bad metadata data '%s' "
2217 "for element '%s'", wrbuf_cstr(wrbuf_disp), type);
2223 WRBUF w = wrbuf_alloc();
2225 wrbuf_cstr(wrbuf_disp), ser_md->
name, w))
2234 wheretoput = &(*wheretoput)->
next;
2235 *wheretoput = rec_md;
2251 const char *use_term_factor_str =
2253 if (use_term_factor_str && use_term_factor_str[0] ==
'1')
2257 term_factor =
MAX(hits, maxrecs) /
MAX(1, maxrecs);
2258 assert(term_factor >= 1);
2259 session_log(se, YLOG_DEBUG,
"Using term factor: %d (%d / %d)",
2260 term_factor,
MAX(hits, maxrecs),
MAX(1, maxrecs));
2269 metadata0 = xmalloc(
sizeof(*metadata0) * service->
num_metadata);
2270 memcpy(metadata0, cluster->
metadata,
2273 ingest_nmem = nmem_create();
2276 yaz_log(YLOG_LOG,
"local in sort : %s", se->
rank);
2277 nmem_strsplit_escape2(ingest_nmem,
",", se->
rank, &rank_values,
2278 &rank_num, 1,
'\\', 1);
2282 for (n = root->children; n; n = n->next)
2284 if (n->type != XML_ELEMENT_NODE)
2286 if (!strcmp((
const char *) n->name,
"metadata"))
2292 int md_field_id = -1;
2293 int sk_field_id = -1;
2294 const char *rank = 0;
2295 const char *xml_rank = 0;
2296 const char *type = 0;
2299 type = yaz_xml_get_prop(n,
"type");
2305 if (md_field_id < 0)
2308 ser_md = &service->
metadata[md_field_id];
2313 ser_sk = &service->
sortkeys[sk_field_id];
2316 wrbuf_rewind(wrbuf_disp);
2317 wrbuf_rewind(wrbuf_norm);
2319 value0 = xmlNodeListGetString(xdoc, n->children, 1);
2320 if (!value0 || !*value0)
2330 wrbuf_norm, wrbuf_disp);
2331 yaz_log(YLOG_LOG,
"run_icu input=%s norm=%s disp=%s",
2332 (
const char *) value0,
2333 wrbuf_cstr(wrbuf_norm), wrbuf_cstr(wrbuf_disp));
2335 wrbuf_cstr(wrbuf_norm),
2340 wrbuf_puts(wrbuf_disp, (
const char *) value0);
2355 for (i = 0; i < rank_num; i++)
2357 const char *val = rank_values[i];
2358 const char *cp = strchr(val,
'=');
2361 if ((cp - val) == strlen((
const char *) type)
2362 && !memcmp(val, type, cp - val))
2371 xml_rank = yaz_xml_get_prop(n,
"rank");
2372 rank = xml_rank ? (
const char *) xml_rank : ser_md->
rank;
2375 wheretoput = &cluster->
metadata[md_field_id];
2379 if (!metadata0[md_field_id])
2382 wheretoput = &(*wheretoput)->
next;
2383 *wheretoput = rec_md;
2390 if (!strcmp((
const char *) (*wheretoput)->data.text.norm,
2393 wheretoput = &(*wheretoput)->
next;
2396 *wheretoput = rec_md;
2402 > strlen((*wheretoput)->data.text.norm))
2404 *wheretoput = rec_md;
2408 const char *sort_str = 0;
2412 if (!cluster->
sortkeys[sk_field_id])
2414 nmem_malloc(se->
nmem,
2433 "Could not make sortkey. Bug #1858");
2436 nmem_strdup(se->
nmem, sort_str);
2444 wheretoput = &(*wheretoput)->
next;
2445 *wheretoput = rec_md;
2451 *wheretoput = rec_md;
2460 if (this_min < (*wheretoput)->data.number.min)
2461 (*wheretoput)->data.number.min = this_min;
2462 if (this_max > (*wheretoput)->data.number.max)
2463 (*wheretoput)->data.number.max = this_max;
2471 wrbuf_cstr(wrbuf_disp),
2472 rank, ser_md->
name);
2482 add_facet(se, (
char *) type, year, term_factor, cl);
2486 add_facet(se, (
char *) type, year, term_factor, cl);
2490 add_facet(se, type, wrbuf_cstr(wrbuf_disp), term_factor, cl);
2497 "Unexpected element in internal record: %s", n->name);
2501 nmem_destroy(ingest_nmem);
2515 yaz_vsnprintf(buf,
sizeof(buf)-30, fmt, ap);
2516 yaz_log(level,
"Session %u: %s", s ? s->
session_id : 0, buf);
const char * pp2_charset_token_next(pp2_charset_token_t prt)
pp2_charset_token_t pp2_charset_token_create(pp2_charset_fact_t pft, const char *id)
const char * pp2_get_display(pp2_charset_token_t prt)
void pp2_charset_token_first(pp2_charset_token_t prt, const char *buf, int skip_article)
void pp2_charset_token_destroy(pp2_charset_token_t prt)
const char * pp2_get_sort(pp2_charset_token_t prt)
int client_get_diagnostic(struct client *cl, const char **message, const char **addinfo)
void client_unlock(struct client *c)
void client_store_xdoc(struct client *cl, int record_no, xmlDoc *xdoc)
int client_parse_query(struct client *cl, const char *query, facet_limits_t facet_limits, const char **error_msg)
void client_set_database(struct client *cl, struct session_database *db)
void client_update_show_stat(struct client *cl, int cmd)
void client_stop(struct client *cl)
int client_parse_sort(struct client *cl, struct reclist_sortparms *sp, int *has_sortmap)
Odr_int client_get_hits(struct client *cl)
int client_fetch_more(struct client *cl)
const char * client_get_state_str(struct client *cl)
int client_is_active_preferred(struct client *cl)
void client_lock(struct client *c)
const char * client_get_id(struct client *cl)
const char * client_get_facet_limit_local(struct client *cl, struct session_database *sdb, int *l, NMEM nmem, int *num, char ***values)
Odr_int client_get_approximation(struct client *cl)
struct connection * client_get_connection(struct client *cl)
void client_set_session(struct client *cl, struct session *se)
struct client * client_create(const char *id)
int client_start_search(struct client *cl)
struct session * client_get_session(struct client *cl)
int client_get_maxrecs(struct client *cl)
int client_has_facet(struct client *cl, const char *name)
int client_parse_range(struct client *cl, const char *startrecs, const char *maxrecs)
void client_mark_dead(struct client *cl)
enum client_state client_get_state(struct client *cl)
int client_is_active(struct client *cl)
int client_parse_init(struct client *cl, int same_search)
const char * client_get_suggestions_xml(struct client *cl, WRBUF wrbuf)
int client_destroy(struct client *c)
const char * client_get_query(struct client *cl, const char **type, NMEM nmem)
struct session_database * client_get_database(struct client *cl)
int client_get_num_records(struct client *cl, int *filtered, int *ingest, int *failed)
int session_grep_databases(struct session *se, const char *filter, void(*fun)(struct session *se, struct session_database *db))
int predef_grep_databases(void *context, struct conf_service *service, void(*fun)(void *context, struct database *db))
struct database * new_database_inherit_settings(const char *id, NMEM nmem, struct settings_array *service_settings)
const char * facet_limits_get(facet_limits_t fl, int idx, const char **value)
void facet_limits_destroy(facet_limits_t fl)
facet_limits_t facet_limits_create(const char *param)
void http_remove_observer(http_channel_observer_t obs)
http_channel_observer_t http_add_observer(struct http_channel *c, void *data, http_channel_destroy_t des)
void(* fun)(struct http_channel *c)
static void show_records_ready(void *data)
char * normalize7bit_generic(char *str, const char *rm_chars)
removes leading whitespace.. Removes suffix cahrs in rm_chars
int extract7bit_dates(const char *buf, int *first, int *last, int longdate)
normalize_record_t normalize_cache_get(normalize_cache_t nc, struct conf_service *service, const char *spec)
normalize_cache_t normalize_cache_create(void)
void normalize_cache_destroy(normalize_cache_t nc)
int normalize_record_transform(normalize_record_t nt, xmlDoc **doc, const char **parms)
void service_destroy(struct conf_service *service)
int conf_service_metadata_field_id(struct conf_service *service, const char *name)
@ Metadata_type_relevance
@ Metadata_type_retrieval
@ Metadata_type_skiparticle
@ Metadata_mergekey_required
@ Metadata_setting_parameter
@ Metadata_setting_postproc
void pazpar2_mutex_create(YAZ_MUTEX *p, const char *name)
struct record_cluster * reclist_insert(struct reclist *l, struct relevance *r, struct conf_service *service, struct record *record, struct record_metadata_attr *merge_keys, int *total)
void reclist_sort(struct reclist *l, struct reclist_sortparms *parms)
struct reclist_sortparms * reclist_parse_sortparms(NMEM nmem, const char *parms, struct conf_service *service)
void reclist_enter(struct reclist *l)
void reclist_destroy(struct reclist *l)
void reclist_leave(struct reclist *l)
struct record_cluster * reclist_read_record(struct reclist *l)
int reclist_get_num_records(struct reclist *l)
void reclist_limit(struct reclist *l, struct session *se, int lazy)
int reclist_sortparms_cmp(struct reclist_sortparms *sort1, struct reclist_sortparms *sort2)
struct reclist * reclist_create(NMEM nmem)
struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys, struct client *client, int position)
struct record_metadata * record_metadata_create(NMEM nmem)
void relevance_clear(struct relevance *r)
void relevance_donerecord(struct relevance *r, struct record_cluster *cluster)
void relevance_destroy(struct relevance **rp)
int relevance_snippet(struct relevance *r, const char *words, const char *name, WRBUF w_snippet)
void relevance_countwords(struct relevance *r, struct record_cluster *cluster, const char *words, const char *rank, const char *name)
void relevance_prepare_read(struct relevance *rel, struct reclist *reclist)
static int check_record_filter(xmlNode *root, struct session_database *sdb)
see if metadata for pz:recordfilter exists
const char * session_setting_oneval(struct session_database *db, int offset)
static int cmp_ht(const void *p1, const void *p2)
static void session_init_databases_fun(void *context, struct database *db)
enum pazpar2_error_code session_search(struct session *se, const char *query, const char *startrecs, const char *maxrecs, const char *filter, const char *limit, const char **addinfo, const char **addinfo2, struct reclist_sortparms *sp, const char *mergekey, const char *rank)
static const char * get_mergekey(xmlDoc *doc, xmlNode *root, struct client *cl, int record_no, struct conf_service *service, NMEM nmem, const char *session_mergekey)
void session_alert_watch(struct session *s, int what)
void session_stop(struct session *se)
static int targets_termlist_nb(WRBUF wrbuf, struct session *se, int num, NMEM nmem, int version)
void session_apply_setting(struct session *se, const char *dbname, const char *name, const char *value)
static void mergekey_norm_wr(pp2_charset_fact_t charsets, WRBUF norm_wr, const char *value)
static int session_use(int delta)
static struct session_database * find_session_database(struct session *se, const char *id)
static YAZ_MUTEX g_session_mutex
void session_sort(struct session *se, struct reclist_sortparms *sp, const char *mergekey, const char *rank)
static void session_remove_cached_clients(struct session *se)
struct session * session_create(NMEM nmem, struct conf_service *service, unsigned session_id)
int ingest_record(struct client *cl, const char *rec, int record_no, NMEM nmem)
ingest XML record
static struct session_database * load_session_database(struct session *se, const char *id)
static void insert_settings_parameters(struct session_database *sdb, struct conf_service *service, char **parms, NMEM nmem)
static void insert_settings_values(struct session_database *sdb, xmlDoc *doc, xmlNode *root, struct conf_service *service)
static xmlDoc * record_to_xml(struct session *se, struct session_database *sdb, const char *rec)
static void session_watch_cancel(void *data, struct http_channel *c, void *data2)
static void session_enter(struct session *s, const char *caller)
static int ingest_sub_record(struct client *cl, xmlDoc *xdoc, xmlNode *root, int record_no, NMEM nmem, struct session_database *sdb, struct record_metadata_attr *mergekeys)
static struct hitsbytarget * hitsbytarget_nb(struct session *se, int *count, NMEM nmem)
void session_init_databases(struct session *se)
void show_range_stop(struct session *se, struct record_cluster **recs)
int session_check_cluster_limit(struct session *se, struct record_cluster *rec)
static void select_targets_callback(struct session *se, struct session_database *db)
static int check_limit_local(struct client *cl, struct record *record, int record_no)
int session_set_watch(struct session *s, int what, session_watchfun fun, void *data, struct http_channel *chan)
void statistics(struct session *se, struct statistics *stat)
struct hitsbytarget * get_hitsbytarget(struct session *se, int *count, NMEM nmem)
int ingest_xml_record(struct client *cl, xmlDoc *xdoc, int record_no, NMEM nmem, int cached_copy)
static int ingest_to_cluster(struct client *cl, WRBUF wrbuf_disp, WRBUF wrbuf_norm, xmlDoc *xdoc, xmlNode *root, int record_no, struct record_metadata_attr *mergekey)
static int select_targets(struct session *se, const char *filter)
size_t session_get_memory_status(struct session *session)
struct parameters global_parameters
void perform_termlist(struct http_channel *c, struct session *se, const char *name, int num, int version)
static void session_leave(struct session *s, const char *caller)
int sessions_get_count(void)
static void session_add_id_facet(struct session *s, struct client *cl, const char *type, const char *id, size_t id_len, const char *term)
struct record_cluster ** show_range_start(struct session *se, struct reclist_sortparms *sp, int start, int *num, int *total, Odr_int *sumhits, Odr_int *approx_hits, void(*show_records_ready)(void *data), struct http_channel *chan)
static xmlDoc * normalize_record(struct session *se, struct session_database *sdb, struct conf_service *service, const char *rec, NMEM nmem)
void session_destroy(struct session *se)
void add_facet(struct session *s, const char *type, const char *value, int count, struct client *cl)
static void log_xml_doc(xmlDoc *doc)
static struct record_metadata * record_metadata_init(NMEM nmem, const char *value, const char *norm, enum conf_metadata_type type, struct _xmlAttr *attr)
static int cmp_ht_approx(const void *p1, const void *p2)
int session_fetch_more(struct session *se)
static void session_clear_set(struct session *se, struct reclist_sortparms *sp)
static void session_reset_active_clients(struct session *se, struct client_list *new_list)
static int match_metadata_local(struct conf_service *service, struct conf_metadata *ser_md, struct record_metadata *rec_md0, char **values, int num_v)
static void session_normalize_facet(struct session *s, const char *type, const char *value, WRBUF display_wrbuf, WRBUF facet_wrbuf)
void show_single_stop(struct session *se, struct record_cluster *rec)
void session_log(struct session *s, int level, const char *fmt,...)
int session_active_clients(struct session *s)
const char * session_lookup_id_facet(struct session *s, struct client *cl, const char *type, const char *term)
int session_is_preferred_clients_ready(struct session *s)
static int get_mergekey_from_doc(xmlDoc *doc, xmlNode *root, const char *name, struct conf_service *service, WRBUF norm_wr)
struct record_cluster * show_single_start(struct session *se, const char *id, struct record_cluster **prev_r, struct record_cluster **next_r)
static void session_database_destroy(struct session_database *sdb)
static int run_icu(struct session *s, const char *icu_chain_id, const char *value, WRBUF norm_wr, WRBUF disp_wr)
void session_settings_dump(struct session *se, struct session_database *db, WRBUF w)
static int prepare_map(struct session *se, struct session_database *sdb)
#define SESSION_WATCH_BYTARGET
@ PAZPAR2_MALFORMED_PARAMETER_VALUE
#define SESSION_WATCH_TERMLIST
#define SESSION_WATCH_MAX
#define SESSION_WATCH_SHOW
#define SESSION_WATCH_SHOW_PREF
void(* session_watchfun)(void *data)
void expand_settings_array(struct setting ***set_ar, int *num, int offset, NMEM nmem)
int settings_create_offset(struct conf_service *service, const char *name)
int settings_lookup_offset(struct conf_service *service, const char *name)
#define PZ_TERMLIST_TERM_FACTOR
struct client_list * next
Represents client state for a connection to one search target.
pp2_charset_fact_t charsets
struct conf_sortkey * sortkeys
struct conf_metadata * metadata
struct settings_array * settings
enum conf_metadata_type type
struct setting ** settings
struct termlist * termlist
struct named_termlist * next
struct reclist_sortparms * next
enum conf_metadata_type type
struct record_metadata ** metadata
union data_types ** sortkeys
struct record_metadata ** metadata
struct database * database
struct session_database * next
struct setting ** settings
http_channel_observer_t obs
int number_of_warnings_unknown_elements
struct client_list * clients_cached
facet_limits_t facet_limits
struct client_list * clients_active
int number_of_warnings_unknown_metadata
struct session_watchentry watchlist[SESSION_WATCH_MAX+1]
struct named_termlist * termlists
struct session_database * databases
struct facet_id * facet_id_list
struct conf_service * service
struct relevance * relevance
struct reclist_sortparms * sorted_results
normalize_cache_t normalize_cache
struct termlist_score ** termlist_highscore(struct termlist *tl, int *len, NMEM nmem)
void termlist_insert(struct termlist *tl, const char *display_term, const char *norm_term, const char *id, size_t id_len, int freq)
struct termlist * termlist_create(NMEM nmem)
struct data_types::@3 text
struct data_types::@4 number