Perform getaddrinfo in separate thread for a given struct host.
[pazpar2-moved-to-github.git] / src / database.c
index f3225ee..df6f11a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: database.c,v 1.16 2007-04-12 07:15:48 marc Exp $
+/* $Id: database.c,v 1.23 2007-04-21 12:00:54 adam Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -71,45 +71,19 @@ static xmlDoc *get_explain_xml(const char *id)
 // Create a new host structure for hostport
 static struct host *create_host(const char *hostport)
 {
-    struct addrinfo *addrinfo, hints;
     struct host *host;
-    char *port;
-    char ipport[128];
-    unsigned char addrbuf[4];
-    int res;
 
     host = xmalloc(sizeof(struct host));
     host->hostport = xstrdup(hostport);
     host->connections = 0;
+    host->ipport = 0;
 
-    if ((port = strchr(hostport, ':')))
-        *(port++) = '\0';
-    else
-        port = "210";
-
-    hints.ai_flags = 0;
-    hints.ai_family = PF_INET;
-    hints.ai_socktype = SOCK_STREAM;
-    hints.ai_protocol = IPPROTO_TCP;
-    hints.ai_addrlen = 0;
-    hints.ai_addr = 0;
-    hints.ai_canonname = 0;
-    hints.ai_next = 0;
-    // This is not robust code. It assumes that getaddrinfo always
-    // returns AF_INET address.
-    if ((res = getaddrinfo(hostport, port, &hints, &addrinfo)))
+    if (host_getaddrinfo(host))
     {
-        yaz_log(YLOG_WARN, "Failed to resolve %s: %s", hostport, gai_strerror(res));
         xfree(host->hostport);
         xfree(host);
         return 0;
     }
-    assert(addrinfo->ai_family == PF_INET);
-    memcpy(addrbuf, &((struct sockaddr_in*)addrinfo->ai_addr)->sin_addr.s_addr, 4);
-    sprintf(ipport, "%u.%u.%u.%u:%s",
-            addrbuf[0], addrbuf[1], addrbuf[2], addrbuf[3], port);
-    host->ipport = xstrdup(ipport);
-    freeaddrinfo(addrinfo);
     host->next = hosts;
     hosts = host;
     return host;
@@ -165,9 +139,6 @@ static struct database *load_database(const char *id)
     db->explain = explain;
     db->settings = 0;
     db->next = databases;
-    db->ccl_map = 0;
-    db->yaz_marc = 0;
-    db->map = 0;
     databases = db;
 
     return db;
@@ -227,19 +198,18 @@ static int match_criterion(struct setting **settings, struct database_criterion
         if (offset == PZ_ID)
         {
             if (match_zurl(settings[offset]->value, v->value))
-                return 1;
-            else
-                return 0;
+                break;
         }
         else 
         {
             if (!strcmp(settings[offset]->value, v->value))
-                return 1;
-            else
-                return 0;
+                break;
         }
     }
-    return 0;
+    if (v)
+        return 1;
+    else
+        return 0;
 }
 
 int database_match_criteria(struct setting **settings, struct database_criterion *cl)
@@ -289,99 +259,6 @@ int grep_databases(void *context, struct database_criterion *cl,
     return i;
 }
 
-// Initialize CCL map for a target
-// Note: This approach ignores user-specific CCL maps, for which I
-// don't presently see any application.
-static void prepare_cclmap(void *ignore, struct database *db)
-{
-    struct setting *s;
-
-    if (!db->settings)
-        return;
-    db->ccl_map = ccl_qual_mk();
-    for (s = db->settings[PZ_CCLMAP]; s; s = s->next)
-    {
-        char *p = strchr(s->name + 3, ':');
-        if (!p)
-        {
-            yaz_log(YLOG_FATAL, "Malformed cclmap name: %s", s->name);
-            exit(1);
-        }
-        p++;
-        ccl_qual_fitem(db->ccl_map, s->value, p);
-    }
-}
-
-// Initialize YAZ Map structures for MARC-based targets
-static void prepare_yazmarc(void *ignore, struct database *db)
-{
-    struct setting *s;
-
-    if (!db->settings)
-        return;
-    for (s = db->settings[PZ_NATIVESYNTAX]; s; s = s->next)
-        if (!strcmp(s->value, "iso2709"))
-        {
-            char *encoding = "marc-8s";
-            yaz_iconv_t cm;
-
-            db->yaz_marc = yaz_marc_create();
-            yaz_marc_subfield_str(db->yaz_marc, "\t");
-            // See if a native encoding is specified
-            if ((s = db->settings[PZ_ENCODING]))
-            {
-                encoding = s->value;
-                break;
-            }
-            if (!(cm = yaz_iconv_open("utf-8", encoding)))
-            {
-                yaz_log(YLOG_FATAL, "Unable to map from %s to UTF-8", encoding);
-                exit(1);
-            }
-            yaz_marc_iconv(db->yaz_marc, cm);
-            break;
-        }
-}
-
-// Prepare XSLT stylesheets for record normalization
-static void prepare_map(void *ignore, struct database *db)
-{
-    struct setting *s;
-
-    if (!db->settings)
-        return;
-    for (s = db->settings[PZ_XSLT]; s; s = s->next)
-    {
-        char **stylesheets;
-        struct database_retrievalmap **m = &db->map;
-        int num, i;
-
-        nmem_strsplit(nmem, ",", s->value, &stylesheets, &num);
-        for (i = 0; i < num; i++)
-        {
-            (*m) = nmem_malloc(nmem, sizeof(**m));
-            (*m)->next = 0;
-            if (!((*m)->stylesheet = conf_load_stylesheet(stylesheets[i])))
-            {
-                yaz_log(YLOG_FATAL, "Unable to load stylesheet: %s",
-                        stylesheets[i]);
-                exit(1);
-            }
-            m = &(*m)->next;
-        }
-    }
-    if (!db->map)
-        yaz_log(YLOG_WARN, "No Normalization stylesheet for target %s", db->url);
-}
-
-// Read settings for each database, and prepare support data structures
-void prepare_databases(void)
-{
-    grep_databases(0, 0, prepare_cclmap);
-    grep_databases(0, 0, prepare_yazmarc);
-    grep_databases(0, 0, prepare_map);
-}
-
 // This function will most likely vanish when a proper target profile mechanism is
 // introduced.
 void load_simpletargets(const char *fn)