X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Fdatabase.c;h=3dfe74e0ef2405a319a557169ce96aad16351b34;hb=6639c716d02ad6117ae6053ca18160dbb21a404a;hp=1834b7854de0890440b1b412bcb597dbed8242b3;hpb=216073a7a0d2fdfc9d88c58b1a2ff83fa76d4628;p=pazpar2-moved-to-github.git diff --git a/src/database.c b/src/database.c index 1834b78..3dfe74e 100644 --- a/src/database.c +++ b/src/database.c @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include "pazpar2.h" #include "host.h" @@ -45,25 +46,21 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif -static struct host *hosts = 0; // The hosts we know about +static struct host *hosts = 0; /* thread pr */ -static xmlDoc *get_explain_xml(const char *id) +static xmlDoc *get_explain_xml(struct conf_targetprofiles *targetprofiles, + const char *id) { struct stat st; char *dir; char path[256]; char ide[256]; - if (!config || !config->targetprofiles) - { - yaz_log(YLOG_WARN, "Config must be loaded and specify targetprofiles"); - return 0; - } - if (config->targetprofiles->type != Targetprofiles_local) + if (targetprofiles->type != Targetprofiles_local) { yaz_log(YLOG_FATAL, "Only supports local type"); return 0; } - dir = config->targetprofiles->src; + dir = targetprofiles->src; urlencode(id, ide); sprintf(path, "%s/%s", dir, ide); if (!stat(path, &st)) @@ -102,21 +99,44 @@ static struct host *find_host(const char *hostport) return create_host(hostport); } +int resolve_database(struct database *db) +{ + if (db->host == 0) + { + struct host *host; + char *p; + char hostport[256]; + strcpy(hostport, db->url); + if ((p = strchr(hostport, '/'))) + *p = '\0'; + if (!(host = find_host(hostport))) + return -1; + db->host = host; + } + return 0; +} + +void resolve_databases(struct conf_service *service) +{ + struct database *db = service->databases; + for (; db; db = db->next) + resolve_database(db); +} + static struct database *load_database(const char *id, struct conf_service *service) { xmlDoc *doc = 0; struct zr_explain *explain = 0; struct database *db; - struct host *host; char hostport[256]; char *dbname; struct setting *idset; yaz_log(YLOG_LOG, "New database: %s", id); - if (config && config->targetprofiles - && (doc = get_explain_xml(id))) + if (service->targetprofiles + && (doc = get_explain_xml(service->targetprofiles, id))) { explain = zr_read_xml(service->nmem, xmlDocGetRootElement(doc)); if (!explain) @@ -130,13 +150,11 @@ static struct database *load_database(const char *id, *(dbname++) = '\0'; else dbname = ""; - if (!(host = find_host(hostport))) - return 0; db = nmem_malloc(service->nmem, sizeof(*db)); memset(db, 0, sizeof(*db)); - db->host = host; + db->host = 0; db->url = nmem_strdup(service->nmem, id); - db->databases = xmalloc(2 * sizeof(char *)); + db->databases = nmem_malloc(service->nmem, 2 * sizeof(char *)); db->databases[0] = nmem_strdup(service->nmem, dbname); db->databases[1] = 0; db->errors = 0;