Add test for marc map
[pazpar2-moved-to-github.git] / src / logic.c
index 7241594..e927782 100644 (file)
@@ -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,15 +79,8 @@ struct parameters global_parameters =
 {
     0,   // dump_records
     0,   // debug_mode
-    30,  // operations timeout 
-    "81",
-    "Index Data PazPar2",
-    VERSION,
     60,   // session timeout 
     100,
-    MAX_CHUNK,
-    0,
-    0,
     180, // Z39.50 session timeout
     15   // Connect timeout
 };
@@ -267,8 +261,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",
@@ -352,12 +355,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;
         }
     }
@@ -507,7 +528,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;
@@ -611,6 +632,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;
@@ -873,54 +896,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)
-    {
-        char hp[128];
-        *hp = '\0';
-        if (listener_override)
-        {
-            strcpy(hp, listener_override);
-            listener_override = 0; /* only first server is overriden */
-        }
-        else
-        {
-            strcpy(hp, ser->host ? ser->host : "");
-            if (ser->port)
-            {
-                if (*hp)
-                    strcat(hp, ":");
-                sprintf(hp + strlen(hp), "%d", ser->port);
-            }
-        }
-        if (http_init(hp, ser))
-            return -1;
-
-        *hp = '\0';
-        if (proxy_override)
-            strcpy(hp, proxy_override);
-        else if (ser->proxy_host || ser->proxy_port)
-        {
-            strcpy(hp, ser->proxy_host ? ser->proxy_host : "");
-            if (ser->proxy_port)
-            {
-                if (*hp)
-                    strcat(hp, ":");
-                sprintf(hp + strlen(hp), "%d", ser->proxy_port);
-            }
-        }
-        if (*hp)
-            http_set_proxyaddr(hp, ser->myurl ? ser->myurl : "");
-    }
-    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;