#include <sys/types.h>
#include <sys/stat.h>
#include <yaz/log.h>
+#include <yaz/nmem.h>
-#include "pazpar2.h"
+#include "ppmutex.h"
+#include "session.h"
#include "host.h"
+#include "pazpar2_config.h"
#include "settings.h"
#include "http.h"
#include "zeerex.h"
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)
xfree(host);
return 0;
}
- yaz_mutex_create(&host->mutex);
+ pazpar2_mutex_create(&host->mutex, "host");
- 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;
+ pazpar2_mutex_create(&p->mutex, "database");
+ return p;
+}
+
+void database_hosts_destroy(database_hosts_t *pp)
+{
+ if (*pp)
+ {
+ struct host *p = (*pp)->hosts;
+ while (p)
+ {
+ struct host *p_next = p->next;
+ yaz_mutex_destroy(&p->mutex);
+ xfree(p->ipport);
+ xfree(p->hostport);
+ xfree(p);
+ p = p_next;
+ }
+ yaz_mutex_destroy(&(*pp)->mutex);
+ xfree(*pp);
+ }
+}
+
/*
* Local variables:
* c-basic-offset: 4