X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fsettings.c;h=155dac7d0102feef0dbc20a0ac37b03c8c41d60e;hb=6639c716d02ad6117ae6053ca18160dbb21a404a;hp=5486c7c54d09507cc2d7e736c9c68432c87eb513;hpb=5dc0e29d39f93d609bac1533a78a3cf1e2110347;p=pazpar2-moved-to-github.git diff --git a/src/settings.c b/src/settings.c index 5486c7c..155dac7 100644 --- a/src/settings.c +++ b/src/settings.c @@ -65,6 +65,8 @@ static char *hard_settings[] = { "pz:sru", "pz:sru_version", "pz:pqf_prefix", + "pz:sort", + "pz:recordfilter", 0 }; @@ -132,10 +134,10 @@ static int isdir(const char *path) } // Read settings from an XML file, calling handler function for each setting -static void read_settings_node(xmlNode *n, - struct conf_service *service, - void (*fun)(struct conf_service *service, - struct setting *set)) +void settings_read_node_x(xmlNode *n, + void *client_data, + void (*fun)(void *client_data, + struct setting *set)) { xmlChar *namea, *targeta, *valuea, *usera, *precedencea; @@ -194,7 +196,7 @@ static void read_settings_node(xmlNode *n, strcpy(valueb, (const char *) valuea); set.value = valueb; set.next = 0; - (*fun)(service, &set); + (*fun)(client_data, &set); } xmlFree(name); xmlFree(precedence); @@ -216,8 +218,8 @@ static void read_settings_node(xmlNode *n, } static void read_settings_file(const char *path, - struct conf_service *service, - void (*fun)(struct conf_service *service, + void *client_data, + void (*fun)(void *client_data, struct setting *set)) { xmlDoc *doc = xmlParseFile(path); @@ -229,7 +231,7 @@ static void read_settings_file(const char *path, exit(1); } n = xmlDocGetRootElement(doc); - read_settings_node(n, service, fun); + settings_read_node_x(n, client_data, fun); xmlFreeDoc(doc); } @@ -238,8 +240,8 @@ static void read_settings_file(const char *path, // Recursively read files or directories, invoking a // callback for each one static void read_settings(const char *path, - struct conf_service *service, - void (*fun)(struct conf_service *service, + void *client_data, + void (*fun)(void *client_data, struct setting *set)) { DIR *d; @@ -259,12 +261,12 @@ static void read_settings(const char *path, if (*de->d_name == '.' || !strcmp(de->d_name, "CVS")) continue; sprintf(tmp, "%s/%s", path, de->d_name); - read_settings(tmp, service, fun); + read_settings(tmp, client_data, fun); } closedir(d); } else if ((dot = strrchr(path, '.')) && !strcmp(dot + 1, "xml")) - read_settings_file(path, service, fun); + read_settings_file(path, client_data, fun); } // Determines if a ZURL is a wildcard, and what kind @@ -291,10 +293,6 @@ static void prepare_dictionary(struct conf_service *service, int i; char *p; - // If target address is not wildcard, add the database - if (*set->target && !zurl_wildcard(set->target)) - find_database(set->target, 0, service); - // Determine if we already have a dictionary entry if (!strncmp(set->name, "pz:", 3) && (p = strchr(set->name + 3, ':'))) *(p + 1) = '\0'; @@ -383,9 +381,9 @@ static void update_database(void *context, struct database *db) // Callback -- updates database records with dictionary entries as appropriate // This is used in pass 2 to assign name/value pairs to databases -static void update_databases(struct conf_service *service, - struct setting *set) +static void update_databases(void *client_data, struct setting *set) { + struct conf_service *service = (struct conf_service *) client_data; struct update_database_context context; context.set = set; context.service = service; @@ -426,9 +424,9 @@ static void initialize_soft_settings(struct conf_service *service) } } -static void prepare_target_dictionary(struct conf_service *service, - struct setting *set) +static void prepare_target_dictionary(void *client_data, struct setting *set) { + struct conf_service *service = (struct conf_service *) client_data; struct setting_dictionary *dictionary = service->dictionary; int i; @@ -447,21 +445,12 @@ static void prepare_target_dictionary(struct conf_service *service, yaz_log(YLOG_WARN, "Setting '%s' not configured as metadata", set->name); } -// 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. -void settings_read(struct conf_service *service, const char *path) -{ - read_settings(path, service, prepare_target_dictionary); - read_settings(path, service, update_databases); -} - void init_settings(struct conf_service *service) { struct setting_dictionary *new; - + assert(service->nmem); - + new = nmem_malloc(service->nmem, sizeof(*new)); memset(new, 0, sizeof(*new)); service->dictionary = new; @@ -469,6 +458,24 @@ void init_settings(struct conf_service *service) initialize_soft_settings(service); } +void settings_read_file(struct conf_service *service, const char *path, + int pass) +{ + if (pass == 1) + read_settings(path, service, prepare_target_dictionary); + else + read_settings(path, service, update_databases); +} + +void settings_read_node(struct conf_service *service, xmlNode *n, + int pass) +{ + if (pass == 1) + settings_read_node_x(n, service, prepare_target_dictionary); + else + settings_read_node_x(n, service, update_databases); +} + /* * Local variables: * c-basic-offset: 4