Merge with master
[pazpar2-moved-to-github.git] / src / session.c
index a3862c1..4e15246 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
@@ -508,7 +508,6 @@ static void select_targets_callback(struct session *se,
         l->next = se->clients_cached;
         se->clients_cached = l;
     }
-    /* set session always. If may be 0 if client is not active */
     client_set_session(cl, se);
 
     l = xmalloc(sizeof(*l));
@@ -557,6 +556,7 @@ static void session_remove_cached_clients(struct session *se)
         client_lock(l->client);
         client_set_session(l->client, 0);
         client_set_database(l->client, 0);
+        client_mark_dead(l->client);
         client_unlock(l->client);
         client_destroy(l->client);
         xfree(l);
@@ -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;