Added swich to use a pazpar2 php proxy (requires masterkey-core)
[pazpar2-moved-to-github.git] / src / settings.c
index dcc5996..5a0dd2a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: settings.c,v 1.18 2007-04-22 15:07:10 adam Exp $
+/* $Id: settings.c,v 1.26 2007-07-30 23:16:33 quinn Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -59,6 +59,8 @@ static char *hard_settings[] = {
     "pz:name",
     "pz:queryencoding",
     "pz:ip",
+    "pz:zproxy",
+    "pz:apdulog",
     0
 };
 
@@ -91,7 +93,7 @@ int settings_offset(const char *name)
 
 // Ignores everything after second colon, if present
 // A bit of a hack to support the pz:cclmap: scheme (and more to come?)
-static int settings_offset_cprefix(const char *name)
+int settings_offset_cprefix(const char *name)
 {
     const char *p;
     int maxlen = 100;
@@ -263,11 +265,12 @@ static void prepare_dictionary(struct setting *set)
         if (!strcmp(dictionary->dict[i], set->name))
             return;
 
-    if (!strncmp(set->name, "pz:", 3)) // Probably a typo in config fle
-    {
-        yaz_log(YLOG_FATAL, "Unknown pz: setting '%s'", set->name);
-        exit(1);
-    }
+    if (!strncmp(set->name, "pz:", 3)) // Probably a typo in config file
+        {
+            yaz_log(YLOG_FATAL, "Unknown pz: setting '%s'", set->name);
+            exit(1);
+        }
+
     // Create a new dictionary entry
     // Grow dictionary if necessary
     if (!dictionary->size)
@@ -294,6 +297,7 @@ static void update_database(void *context, struct database *db)
     if (!match_zurl(db->url, set->target))
         return;
 
+#ifdef GAGA
     // Initialize settings array if it doesn't exist.
     // If so, also set the 'id' automatic setting
     if (!db->settings)
@@ -308,6 +312,7 @@ static void update_database(void *context, struct database *db)
         id->next = 0;
         db->settings[PZ_ID] = id;
     }
+#endif
     if ((offset = settings_offset_cprefix(set->name)) < 0)
         abort(); // Should never get here
 
@@ -348,7 +353,7 @@ static void update_database(void *context, struct database *db)
 // This is used in pass 2 to assign name/value pairs to databases
 static void update_databases(struct setting *set)
 {
-    grep_databases(set, 0, update_database);
+    predef_grep_databases(set, 0, update_database);
 }
 
 // This simply copies the 'hard' (application-specific) settings
@@ -361,6 +366,30 @@ static void initialize_hard_settings(struct setting_dictionary *dict)
     dict->num = dict->size;
 }
 
+// Read any settings names introduced in service definition (config) and add to dictionary
+// This is done now to avoid errors if user settings are declared in session overrides
+static void initialize_soft_settings()
+{
+    struct conf_service *service = config->servers->service;
+    int i;
+
+    for (i = 0; i < service->num_metadata; i++)
+    {
+        struct setting set;
+        struct conf_metadata *md = &service->metadata[i];
+
+        if (md->setting == Metadata_setting_no)
+            continue;
+
+        set.precedence = 0;
+        set.target = "";
+        set.name = md->name;
+        set.value = "";
+        set.next = 0;
+        prepare_dictionary(&set);
+    }
+}
+
 // If we ever decide we need to be able to specify multiple settings directories,
 // the two calls to read_settings must be split -- so the dictionary is prepared
 // for the contents of every directory before the databases are updated.
@@ -381,6 +410,7 @@ void init_settings(void)
     memset(new, 0, sizeof(*new));
     initialize_hard_settings(new);
     dictionary = new;
+    initialize_soft_settings();
 }
 
 /*