X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fsettings.c;h=62121627a1588c4567ec2ae4105fbe47655f3b9b;hb=de79ce99355484d350009d4704c16ade68a76e98;hp=ba913dbd2866567d3cb8b8ebd12726a47ab57170;hpb=6e36a641ff911326f4ebb09c797c41ea15e3ecd3;p=pazpar2-moved-to-github.git diff --git a/src/settings.c b/src/settings.c index ba913db..6212162 100644 --- a/src/settings.c +++ b/src/settings.c @@ -1,4 +1,4 @@ -/* $Id: settings.c,v 1.12 2007-04-11 11:22:35 marc Exp $ +/* $Id: settings.c,v 1.16 2007-04-13 01:48:22 quinn Exp $ Copyright (c) 2006-2007, Index Data. This file is part of Pazpar2. @@ -20,9 +20,10 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA */ -// This module implements a generic system of settings (attribute-value) that can -// be associated with search targets. The system supports both default values, -// per-target overrides, and per-user settings. +// This module implements a generic system of settings +// (attribute-value) that can be associated with search targets. The +// system supports both default values, per-target overrides, and +// per-user settings. #include #include @@ -56,6 +57,8 @@ static char *hard_settings[] = { "pz:allow", "pz:maxrecs", "pz:id", + "pz:name", + "pz:queryencoding", 0 }; @@ -162,7 +165,6 @@ static void read_settings_file(const char *path, struct setting set; char nameb[1024]; char targetb[1024]; - char userb[1024]; char valueb[1024]; // Copy everything into a temporary buffer -- we decide @@ -173,13 +175,6 @@ static void read_settings_file(const char *path, set.precedence = atoi((char *) precedencea); else set.precedence = 0; - set.user = userb; - if (user) - strcpy(userb, user); - else if (usera) - strcpy(userb, (const char *) usera); - else - set.user = ""; if (target) strcpy(targetb, target); else @@ -219,49 +214,55 @@ static void read_settings_file(const char *path, xmlFreeDoc(doc); } -// Recursively read files in a directory structure, calling +// Recursively read files or directories, invoking a // callback for each one static void read_settings(const char *path, void (*fun)(struct setting *set)) { DIR *d; struct dirent *de; + char *dot; - if (!(d = opendir(path))) + if (isdir(path)) { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "%s", path); - exit(1); - } - while ((de = readdir(d))) - { - char tmp[1024]; - if (*de->d_name == '.' || !strcmp(de->d_name, "CVS")) - continue; - sprintf(tmp, "%s/%s", path, de->d_name); - if (isdir(tmp)) - read_settings(tmp, fun); - else + if (!(d = opendir(path))) { - char *dot; - if ((dot = rindex(de->d_name, '.')) && !strcmp(dot + 1, "xml")) - read_settings_file(tmp, fun); + yaz_log(YLOG_FATAL|YLOG_ERRNO, "%s", path); + exit(1); } + while ((de = readdir(d))) + { + char tmp[1024]; + if (*de->d_name == '.' || !strcmp(de->d_name, "CVS")) + continue; + sprintf(tmp, "%s/%s", path, de->d_name); + read_settings(tmp, fun); + } + closedir(d); } - closedir(d); + else if ((dot = rindex(path, '.')) && !strcmp(dot + 1, "xml")) + read_settings_file(path, fun); } // Callback. Adds a new entry to the dictionary if necessary // This is used in pass 1 to determine layout of dictionary +// and to load any databases mentioned static void prepare_dictionary(struct setting *set) { int i; char *p; + // If target address is not wildcard, add the database + if (*set->target && set->target[strlen(set->target) - 1] != '*') + find_database(set->target, 0); + + // Determine if we already have a dictionary entry if (!strncmp(set->name, "pz:", 3) && (p = strchr(set->name + 3, ':'))) *(p + 1) = '\0'; for (i = 0; i < dictionary->num; i++) 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); @@ -304,7 +305,6 @@ static void update_database(void *context, struct database *db) id->precedence = 0; id->name = "pz:id"; id->target = id->value = db->url; - id->user = ""; id->next = 0; db->settings[PZ_ID] = id; } @@ -315,7 +315,7 @@ static void update_database(void *context, struct database *db) // with the same name. for (s = db->settings[offset], sp = &db->settings[offset]; s; sp = &s->next, s = s->next) - if (!strcmp(s->user, set->user) && !strcmp(s->name, set->name)) + if (!strcmp(s->name, set->name)) { if (s->precedence < set->precedence) // We discard the value (nmem keeps track of the space) @@ -339,7 +339,6 @@ static void update_database(void *context, struct database *db) new->target = nmem_strdup(nmem, set->target); new->name = nmem_strdup(nmem, set->name); new->value = nmem_strdup(nmem, set->value); - new->user = nmem_strdup(nmem, set->user); new->next = db->settings[offset]; db->settings[offset] = new; }