New host list manager: database_hosts_t
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 12 Feb 2010 12:31:05 +0000 (13:31 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 12 Feb 2010 12:31:05 +0000 (13:31 +0100)
src/database.c
src/database.h
src/pazpar2.h
src/pazpar2_config.c
src/pazpar2_config.h

index b121e95..6f1599a 100644 (file)
@@ -63,7 +63,11 @@ struct database_criterion {
     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)
@@ -105,18 +109,28 @@ static struct host *create_host(const char *hostport, iochan_man_t iochan_man)
     }
     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)
@@ -129,7 +143,8 @@ 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;
     }
@@ -388,6 +403,15 @@ int predef_grep_databases(void *context, struct conf_service *service,
     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
index 1c0d861..aabf394 100644 (file)
@@ -20,6 +20,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #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));
@@ -28,4 +31,6 @@ int predef_grep_databases(void *context, struct conf_service *service,
 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
index 7a55262..efd743f 100644 (file)
@@ -27,7 +27,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "termlists.h"
 #include "reclists.h"
-#include "pazpar2_config.h"
 #include "http.h"
 
 struct record;
index 4930f73..2cfba23 100644 (file)
@@ -52,6 +52,7 @@ struct conf_config
     int no_threads;
     WRBUF confdir;
     iochan_man_t iochan_man;
+    database_hosts_t database_hosts;
 };
 
 
@@ -722,6 +723,7 @@ static struct conf_server *server_create(struct conf_config *config,
     server->server_settings = 0;
     server->http_server = 0;
     server->iochan_man = 0;
+    server->database_hosts = 0;
 
     if (server_id)
     {
@@ -1043,9 +1045,14 @@ void config_stop_listeners(struct conf_config *conf)
 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);
index 5b5eee6..678e2e9 100644 (file)
@@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/mutex.h>
 #include "charsets.h"
 #include "http.h"
+#include "database.h"
 
 enum conf_metadata_type {
     Metadata_type_generic,    // Generic text field
@@ -146,6 +147,7 @@ struct conf_server
     struct conf_config *config;
     http_server_t http_server;
     iochan_man_t iochan_man;
+    database_hosts_t database_hosts;
 };
 
 struct conf_targetprofiles