Using yaz_poll rather than select PAZ-947
[pazpar2-moved-to-github.git] / src / session.c
index a3862c1..eac40a0 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2013 Index Data
+   Copyright (C) Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -905,36 +905,38 @@ static struct session_database *find_session_database(struct session *se,
 }
 
 // Apply a session override to a database
-void session_apply_setting(struct session *se, char *dbname, char *setting,
+void session_apply_setting(struct session *se, char *dbname, char *name,
                            char *value)
 {
     struct session_database *sdb = find_session_database(se, dbname);
     struct conf_service *service = se->service;
-    struct setting *new = nmem_malloc(se->session_nmem, sizeof(*new));
-    int offset = settings_create_offset(service, setting);
+    struct setting *s;
+    int offset = settings_create_offset(service, name);
 
     expand_settings_array(&sdb->settings, &sdb->num_settings, offset,
                           se->session_nmem);
-    new->precedence = 0;
-    new->target = dbname;
-    new->name = setting;
-    new->value = value;
-    new->next = sdb->settings[offset];
-    sdb->settings[offset] = new;
-
-    se->settings_modified = 1;
 
     // Force later recompute of settings-driven data structures
     // (happens when a search starts and client connections are prepared)
-    switch (offset)
-    {
-    case PZ_XSLT:
-        if (sdb->map)
+    if (offset == PZ_XSLT)
+        sdb->map = 0;
+
+    se->settings_modified = 1;
+    for (s = sdb->settings[offset]; s; s = s->next)
+        if (!strcmp(s->name, name) &&
+            dbname && s->target && !strcmp(dbname, s->target))
         {
-            sdb->map = 0;
+            s->value = value;
+            return;
         }
-        break;
-    }
+    s = nmem_malloc(se->session_nmem, sizeof(*s));
+    s->precedence = 0;
+    s->target = dbname;
+    s->name = name;
+    s->value = value;
+    s->next = sdb->settings[offset];
+    sdb->settings[offset] = s;
+
 }
 
 void session_destroy(struct session *se)
@@ -1459,8 +1461,11 @@ static struct record_metadata *record_metadata_init(
     {
     case Metadata_type_generic:
     case Metadata_type_skiparticle:
-        rec_md->data.text.disp =
-            normalize7bit_generic(nmem_strdup(nmem, value), " ,/.:([");
+        if (strstr(value, "://")) /* looks like a URL */
+            rec_md->data.text.disp = nmem_strdup(nmem, value);
+        else
+            rec_md->data.text.disp =
+                normalize7bit_generic(nmem_strdup(nmem, value), " ,/.:([");
         rec_md->data.text.sort = 0;
         rec_md->data.text.snippet = 0;
         break;