More clean-up (remove util.c).
[pazpar2-moved-to-github.git] / src / logic.c
index 3ea153f..2abae16 100644 (file)
@@ -57,7 +57,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/timing.h>
 #endif
 
-
+#include "parameters.h"
 #include "pazpar2.h"
 #include "eventl.h"
 #include "http.h"
@@ -68,6 +68,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "client.h"
 #include "settings.h"
 #include "normalize7bit.h"
+#include "marcmap.h"
 
 #define TERMLIST_HIGH_SCORE 25
 
@@ -78,11 +79,7 @@ struct parameters global_parameters =
 {
     0,   // dump_records
     0,   // debug_mode
-    30,  // operations timeout 
-    60,   // session timeout 
     100,
-    180, // Z39.50 session timeout
-    15   // Connect timeout
 };
 
 static void log_xml_doc(xmlDoc *doc)
@@ -261,8 +258,17 @@ xmlDoc *normalize_record(struct session_database *sdb, struct session *se,
 
                 insert_settings_parameters(sdb, se, parms);
 
-                new = xsltApplyStylesheet(m->stylesheet, rdoc, (const char **) parms);
-                root= xmlDocGetRootElement(new);
+                if (m->stylesheet)
+                {
+                    new = xsltApplyStylesheet(m->stylesheet, rdoc, (const char **) parms);
+                }
+                else if (m->marcmap)
+                {
+                    new = marcmap_apply(m->marcmap, rdoc);
+                }
+
+                root = xmlDocGetRootElement(new);
+
                 if (!new || !root || !(root->children))
                 {
                     yaz_log(YLOG_WARN, "XSLT transformation failed from %s",
@@ -346,12 +352,30 @@ static int prepare_map(struct session *se, struct session_database *sdb)
         {
             (*m) = nmem_malloc(se->session_nmem, sizeof(**m));
             (*m)->next = 0;
-            if (!((*m)->stylesheet = conf_load_stylesheet(stylesheets[i])))
+            // XSLT
+            if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) 
+            {    
+                (*m)->marcmap = NULL;
+                if (!((*m)->stylesheet = conf_load_stylesheet(se->service->config, stylesheets[i])))
+                {
+                    yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s",
+                            stylesheets[i]);
+                    return -1;
+                }
+            }
+            // marcmap
+            else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap"))
             {
-                yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s",
-                        stylesheets[i]);
-                return -1;
+                (*m)->stylesheet = NULL;
+               if (!((*m)->marcmap = marcmap_load(stylesheets[i], se->session_nmem)))
+                {
+                    yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s",
+                            stylesheets[i]);
+                    return -1;
+                }
             }
+
             m = &(*m)->next;
         }
     }
@@ -501,7 +525,7 @@ static struct database_criterion *parse_filter(NMEM m, const char *buf)
 }
 
 enum pazpar2_error_code search(struct session *se,
-                               char *query, char *filter,
+                               const char *query, const char *filter,
                                const char **addinfo)
 {
     int live_channels = 0;
@@ -542,7 +566,8 @@ enum pazpar2_error_code search(struct session *se,
         else
         {
             no_working++;
-            if (client_prep_connection(cl))
+            if (client_prep_connection(cl, se->service->z3950_connect_timeout,
+                    se->service->z3950_session_timeout))
                 client_start_search(cl);
         }
     }
@@ -605,6 +630,8 @@ static struct session_database *load_session_database(struct session *se,
 {
     struct database *db = find_database(id, 0, se->service);
 
+    resolve_database(db);
+
     session_init_databases_fun((void*) se, db);
     // New sdb is head of se->databases list
     return se->databases;
@@ -867,59 +894,10 @@ void statistics(struct session *se, struct statistics *stat)
     stat->num_clients = count;
 }
 
-int start_http_listener(struct conf_config *conf,
-                        const char *listener_override,
-                        const char *proxy_override)
-{
-    struct conf_server *ser;
-    for (ser = conf->servers; ser; ser = ser->next)
-    {
-        WRBUF w = wrbuf_alloc();
-        int r;
-        if (listener_override)
-        {
-            wrbuf_puts(w, listener_override);
-            listener_override = 0; /* only first server is overriden */
-        }
-        else
-        {
-            if (ser->host)
-                wrbuf_puts(w, ser->host);
-            if (ser->port)
-            {
-                if (wrbuf_len(w))
-                    wrbuf_puts(w, ":");
-                wrbuf_printf(w, "%d", ser->port);
-            }
-        }
-        r = http_init(wrbuf_cstr(w), ser);
-        wrbuf_destroy(w);
-        if (r)
-            return -1;
-
-        w = wrbuf_alloc();
-        if (proxy_override)
-            wrbuf_puts(w, proxy_override);
-        else if (ser->proxy_host || ser->proxy_port)
-        {
-            if (ser->proxy_host)
-                wrbuf_puts(w, ser->proxy_host);
-            if (ser->proxy_port)
-            {
-                if (wrbuf_len(w))
-                    wrbuf_puts(w, ":");
-                wrbuf_printf(w, "%d", ser->proxy_port);
-            }
-        }
-        if (wrbuf_len(w))
-            http_set_proxyaddr(wrbuf_cstr(w), ser);
-        wrbuf_destroy(w);
-    }
-    return 0;
-}
 
 // Master list of connections we're handling events to
-static IOCHAN channel_list = 0; 
+static IOCHAN channel_list = 0;  /* thread pr */
+
 void pazpar2_add_channel(IOCHAN chan)
 {
     chan->next = channel_list;