Added open-url-resolver setting to the default set of targets.
[pazpar2-moved-to-github.git] / src / logic.c
index 5b0517b..4146612 100644 (file)
@@ -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