struct database_criterion *next;
};
-static struct host *hosts = 0; /* thread pr */
+
+struct database_hosts {
+ struct host *hosts;
+ YAZ_MUTEX mutex;
+};
static xmlDoc *get_explain_xml(struct conf_targetprofiles *targetprofiles,
const char *id)
}
yaz_mutex_create(&host->mutex);
- host->next = hosts;
- hosts = host;
return host;
}
-static struct host *find_host(const char *hostport, iochan_man_t iochan_man)
+static struct host *find_host(database_hosts_t hosts,
+ const char *hostport, iochan_man_t iochan_man)
{
struct host *p;
- for (p = hosts; p; p = p->next)
+ yaz_mutex_enter(hosts->mutex);
+ for (p = hosts->hosts; p; p = p->next)
if (!strcmp(p->hostport, hostport))
- return p;
- return create_host(hostport, iochan_man);
+ break;
+ if (!p)
+ {
+ p = create_host(hostport, iochan_man);
+ if (p)
+ {
+ p->next = hosts->hosts;
+ hosts->hosts = p;
+ }
+ }
+ yaz_mutex_leave(hosts->mutex);
+ return p;
}
int resolve_database(struct conf_service *service, struct database *db)
strcpy(hostport, db->url);
if ((p = strchr(hostport, '/')))
*p = '\0';
- if (!(host = find_host(hostport, service->server->iochan_man)))
+ if (!(host = find_host(service->server->database_hosts,
+ hostport, service->server->iochan_man)))
return -1;
db->host = host;
}
return i;
}
+database_hosts_t database_hosts_create(void)
+{
+ database_hosts_t p = xmalloc(sizeof(*p));
+ p->hosts = 0;
+ p->mutex = 0;
+ yaz_mutex_create(&p->mutex);
+ return p;
+}
+
/*
* Local variables:
* c-basic-offset: 4
#ifndef DATABASE_H
#define DATABASE_H
+typedef struct database_hosts *database_hosts_t;
+struct session_database;
+struct session;
struct database *find_database(const char *id, struct conf_service *service);
int session_grep_databases(struct session *se, const char *filter,
void (*fun)(void *context, struct session_database *db));
int match_zurl(const char *zurl, const char *pattern);
int resolve_database(struct conf_service *service, struct database *db);
struct database *new_database(const char *id, NMEM nmem);
+
+database_hosts_t database_hosts_create(void);
#endif
int no_threads;
WRBUF confdir;
iochan_man_t iochan_man;
+ database_hosts_t database_hosts;
};
server->server_settings = 0;
server->http_server = 0;
server->iochan_man = 0;
+ server->database_hosts = 0;
if (server_id)
{
void config_process_events(struct conf_config *conf)
{
struct conf_server *ser;
+
+ conf->database_hosts = database_hosts_create();
for (ser = conf->servers; ser; ser = ser->next)
{
struct conf_service *s = ser->service;
+
+ ser->database_hosts = conf->database_hosts;
+
for (;s ; s = s->next)
{
resolve_databases(s);
#include <yaz/mutex.h>
#include "charsets.h"
#include "http.h"
+#include "database.h"
enum conf_metadata_type {
Metadata_type_generic, // Generic text field
struct conf_config *config;
http_server_t http_server;
iochan_man_t iochan_man;
+ database_hosts_t database_hosts;
};
struct conf_targetprofiles