X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Flogic.c;h=41466124e6859fee8ce026ccb367e2e42e22a4e3;hb=27f4fbe7aac495517af0b94bac3e53f409c163e5;hp=5b0517bbb64389beac729c3ec691546ba17f1b90;hpb=2ba8ac40a1911b9854478521556469909c6c96f0;p=pazpar2-moved-to-github.git diff --git a/src/logic.c b/src/logic.c index 5b0517b..4146612 100644 --- a/src/logic.c +++ b/src/logic.c @@ -1,4 +1,4 @@ -/* $Id: logic.c,v 1.57 2007-07-30 11:52:08 quinn Exp $ +/* $Id: logic.c,v 1.61 2007-08-16 11:30:45 adam Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -191,7 +191,18 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec) rdoc = xmlParseMemory((char*) wrbuf_buf(wrbuf_opac), wrbuf_len(wrbuf_opac)); if (!rdoc) + { yaz_log(YLOG_WARN, "Unable to parse OPAC XML"); + /* Was used to debug bug #1348 */ +#if 0 + FILE *f = fopen("/tmp/opac.xml.txt", "wb"); + if (f) + { + fwrite(wrbuf_buf(wrbuf_opac), 1, wrbuf_len(wrbuf_opac), f); + fclose(f); + } +#endif + } wrbuf_destroy(wrbuf_opac); } } @@ -223,7 +234,6 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec) return 0; } - yaz_marc_write_using_libxml2(sdb->yaz_marc, 1); if (yaz_marc_write_xml(sdb->yaz_marc, &res, "http://www.loc.gov/MARC21/slim", 0, 0) < 0) { @@ -262,6 +272,44 @@ xmlDoc *record_to_xml(struct session_database *sdb, Z_External *rec) return rdoc; } +#define MAX_XSLT_ARGS 16 + +// Add static values from session database settings if applicable +static void insert_settings_parameters(struct session_database *sdb, + struct session *se, char **parms) +{ + struct conf_service *service = global_parameters.server->service; + int i; + int nparms = 0; + int offset = 0; + + for (i = 0; i < service->num_metadata; i++) + { + struct conf_metadata *md = &service->metadata[i]; + int setting; + + if (md->setting == Metadata_setting_parameter && + (setting = settings_offset(md->name)) > 0) + { + char *val = session_setting_oneval(sdb, setting); + if (val && nparms < MAX_XSLT_ARGS) + { + char *buf; + int len = strlen(val); + buf = nmem_malloc(se->nmem, len + 3); + buf[0] = '\''; + strcpy(buf + 1, val); + buf[len+1] = '\''; + buf[len+2] = '\0'; + parms[offset++] = md->name; + parms[offset++] = buf; + nparms++; + } + } + } + parms[offset] = 0; +} + // Add static values from session database settings if applicable static void insert_settings_values(struct session_database *sdb, xmlDoc *doc) { @@ -288,7 +336,8 @@ static void insert_settings_values(struct session_database *sdb, xmlDoc *doc) } } -xmlDoc *normalize_record(struct session_database *sdb, Z_External *rec) +xmlDoc *normalize_record(struct session_database *sdb, struct session *se, + Z_External *rec) { struct database_retrievalmap *m; xmlDoc *rdoc = record_to_xml(sdb, rec); @@ -300,7 +349,11 @@ xmlDoc *normalize_record(struct session_database *sdb, Z_External *rec) { xmlNodePtr root = 0; - new = xsltApplyStylesheet(m->stylesheet, rdoc, 0); + char *parms[MAX_XSLT_ARGS*2+1]; + + insert_settings_parameters(sdb, se, parms); + + new = xsltApplyStylesheet(m->stylesheet, rdoc, (const char **) parms); root= xmlDocGetRootElement(new); if (!new || !root || !(root->children)) { @@ -594,23 +647,22 @@ enum pazpar2_error_code search(struct session *se, *addinfo = 0; nmem_reset(se->nmem); + se->relevance = 0; + se->total_records = se->total_hits = se->total_merged = 0; + se->reclist = 0; + se->num_termlists = 0; criteria = parse_filter(se->nmem, filter); se->requestid++; live_channels = select_targets(se, criteria); if (live_channels) { int maxrecs = live_channels * global_parameters.toget; - se->num_termlists = 0; se->reclist = reclist_create(se->nmem, maxrecs); - // This will be initialized in send_search() - se->total_records = se->total_hits = se->total_merged = 0; se->expected_maxrecs = maxrecs; } else return PAZPAR2_NO_TARGETS; - se->relevance = 0; - for (cl = se->clients; cl; cl = client_next_in_session(cl)) { if (prepare_session_database(se, client_get_database(cl)) < 0) @@ -1037,7 +1089,8 @@ static struct record_metadata *record_metadata_init( struct record *ingest_record(struct client *cl, Z_External *rec, int record_no) { - xmlDoc *xdoc = normalize_record(client_get_database(cl), rec); + xmlDoc *xdoc = normalize_record(client_get_database(cl), + client_get_session(cl), rec); xmlNode *root, *n; struct record *record; struct record_cluster *cluster; @@ -1105,7 +1158,7 @@ struct record *ingest_record(struct client *cl, Z_External *rec, type = xmlGetProp(n, (xmlChar *) "type"); value = xmlNodeListGetString(xdoc, n->children, 1); - if (!type || !value) + if (!type || !value || !*value) continue; md_field_id