-// $Id: settings.c,v 1.6 2007-04-03 03:55:12 quinn Exp $
+/* $Id: settings.c,v 1.12 2007-04-11 11:22:35 marc Exp $
+ Copyright (c) 2006-2007, Index Data.
+
+This file is part of Pazpar2.
+
+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
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Pazpar2; see the file LICENSE. If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+ */
+
+
// 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.
static char *hard_settings[] = {
"pz:piggyback",
"pz:elements",
- "pz:syntax",
+ "pz:requestsyntax",
"pz:cclmap:",
- "pz:charset",
+ "pz:encoding",
"pz:xslt",
+ "pz:nativesyntax",
+ "pz:authentication",
+ "pz:allow",
+ "pz:maxrecs",
+ "pz:id",
0
};
static struct setting_dictionary *dictionary = 0;
+// Returns size of settings directory
+int settings_num(void)
+{
+ return dictionary->num;
+}
+
int settings_offset(const char *name)
{
int i;
xmlFree(valuea);
xmlFree(usera);
xmlFree(targeta);
+
+ xmlFreeDoc(doc);
}
// Recursively read files in a directory structure, calling
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);
+ exit(1);
+ }
// Create a new dictionary entry
// Grow dictionary if necessary
if (!dictionary->size)
struct setting *s, **sp;
int offset;
+ // Is this the right database?
+ if (!match_zurl(db->url, set->target))
+ return;
+
+ // Initialize settings array if it doesn't exist.
+ // If so, also set the 'id' automatic setting
if (!db->settings)
{
+ struct setting *id = nmem_malloc(nmem, sizeof(struct setting));
+
db->settings = nmem_malloc(nmem, sizeof(struct settings*) * dictionary->num);
memset(db->settings, 0, sizeof(struct settings*) * dictionary->num);
+ id->precedence = 0;
+ id->name = "pz:id";
+ id->target = id->value = db->url;
+ id->user = "";
+ id->next = 0;
+ db->settings[PZ_ID] = id;
}
if ((offset = settings_offset_cprefix(set->name)) < 0)
abort(); // Should never get here
// This is used in pass 2 to assign name/value pairs to databases
static void update_databases(struct setting *set)
{
- struct database_criterion crit;
- struct database_criterion_value val;
-
- // Update all databases which match pattern in set->target
- crit.name = "id";
- crit.values = &val;
- crit.next = 0;
- val.value = set->target;
- val.next = 0;
- grep_databases(set, &crit, update_database);
+ grep_databases(set, 0, update_database);
}
// This simply copies the 'hard' (application-specific) settings