projects
/
pazpar2-moved-to-github.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Change all instances of AJAX into Ajax
[pazpar2-moved-to-github.git]
/
src
/
database.c
diff --git
a/src/database.c
b/src/database.c
index
c2fb3b1
..
8ffbee2
100644
(file)
--- a/
src/database.c
+++ b/
src/database.c
@@
-27,9
+27,11
@@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <sys/types.h>
#include <sys/stat.h>
#include <yaz/log.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <yaz/log.h>
+#include <yaz/nmem.h>
-#include "pazpar2.h"
+#include "session.h"
#include "host.h"
#include "host.h"
+#include "pazpar2_config.h"
#include "settings.h"
#include "http.h"
#include "zeerex.h"
#include "settings.h"
#include "http.h"
#include "zeerex.h"
@@
-63,7
+65,11
@@
struct database_criterion {
struct database_criterion *next;
};
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)
static xmlDoc *get_explain_xml(struct conf_targetprofiles *targetprofiles,
const char *id)
@@
-87,7
+93,7
@@
static xmlDoc *get_explain_xml(struct conf_targetprofiles *targetprofiles,
}
// Create a new host structure for hostport
}
// Create a new host structure for hostport
-static struct host *create_host(const char *hostport)
+static struct host *create_host(const char *hostport, iochan_man_t iochan_man)
{
struct host *host;
{
struct host *host;
@@
-95,28
+101,41
@@
static struct host *create_host(const char *hostport)
host->hostport = xstrdup(hostport);
host->connections = 0;
host->ipport = 0;
host->hostport = xstrdup(hostport);
host->connections = 0;
host->ipport = 0;
+ host->mutex = 0;
- if (host_getaddrinfo(host))
+ if (host_getaddrinfo(host, iochan_man))
{
xfree(host->hostport);
xfree(host);
return 0;
}
{
xfree(host->hostport);
xfree(host);
return 0;
}
- host->next = hosts;
- hosts = host;
+ yaz_mutex_create(&host->mutex);
+
return host;
}
return host;
}
-static struct host *find_host(const char *hostport)
+static struct host *find_host(database_hosts_t hosts,
+ const char *hostport, iochan_man_t iochan_man)
{
struct host *p;
{
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))
if (!strcmp(p->hostport, hostport))
- return p;
- return create_host(hostport);
+ 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 database *db)
+int resolve_database(struct conf_service *service, struct database *db)
{
if (db->host == 0)
{
{
if (db->host == 0)
{
@@
-126,7
+145,8
@@
int resolve_database(struct database *db)
strcpy(hostport, db->url);
if ((p = strchr(hostport, '/')))
*p = '\0';
strcpy(hostport, db->url);
if ((p = strchr(hostport, '/')))
*p = '\0';
- if (!(host = find_host(hostport)))
+ if (!(host = find_host(service->server->database_hosts,
+ hostport, service->server->iochan_man)))
return -1;
db->host = host;
}
return -1;
db->host = host;
}
@@
-137,7
+157,7
@@
void resolve_databases(struct conf_service *service)
{
struct database *db = service->databases;
for (; db; db = db->next)
{
struct database *db = service->databases;
for (; db; db = db->next)
- resolve_database(db);
+ resolve_database(service, db);
}
struct database *new_database(const char *id, NMEM nmem)
}
struct database *new_database(const char *id, NMEM nmem)
@@
-385,6
+405,15
@@
int predef_grep_databases(void *context, struct conf_service *service,
return i;
}
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
/*
* Local variables:
* c-basic-offset: 4