From: Adam Dickmeiss Date: Tue, 16 Jul 2013 12:40:53 +0000 (+0200) Subject: Make url part of connection rather than host PAZ-880 X-Git-Tag: v1.6.33~16 X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=65c19cd0aac859eb0554be572828e121a2cd977c;p=pazpar2-moved-to-github.git Make url part of connection rather than host PAZ-880 This makes better use of threaded resolver (if enabled). --- diff --git a/src/connection.c b/src/connection.c index 43cdc14..d5b5be2 100644 --- a/src/connection.c +++ b/src/connection.c @@ -92,6 +92,7 @@ struct connection { struct host *host; struct client *client; char *zproxy; + char *url; enum { Conn_Closed, Conn_Connecting, @@ -150,7 +151,7 @@ static void connection_destroy(struct connection *co) ZOOM_connection_destroy(co->link); iochan_destroy(co->iochan); } - yaz_log(YLOG_DEBUG, "%p Connection destroy %s", co, co->host->url); + yaz_log(YLOG_DEBUG, "%p Connection destroy %s", co, co->url); if (co->client) { @@ -158,6 +159,7 @@ static void connection_destroy(struct connection *co) } xfree(co->zproxy); + xfree(co->url); xfree(co); connection_use(-1); } @@ -165,6 +167,7 @@ static void connection_destroy(struct connection *co) // Creates a new connection for client, associated with the host of // client's database static struct connection *connection_create(struct client *cl, + const char *url, struct host *host, int operation_timeout, int session_timeout, @@ -176,6 +179,7 @@ static struct connection *connection_create(struct client *cl, co->host = host; co->client = cl; + co->url = xstrdup(url); co->zproxy = 0; client_set_connection(cl, co); co->link = 0; @@ -450,17 +454,25 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man) return -1; } - if (sru && *sru && !strstr(host->url, "://")) + if (sru && *sru && !strstr(con->url, "://")) { WRBUF w = wrbuf_alloc(); wrbuf_puts(w, "http://"); - wrbuf_puts(w, host->url); + wrbuf_puts(w, con->url); + ZOOM_connection_connect(con->link, wrbuf_cstr(w), 0); + wrbuf_destroy(w); + } + else if (strchr(con->url, '#')) + { + const char *cp = strchr(con->url, '#'); + WRBUF w = wrbuf_alloc(); + wrbuf_write(w, con->url, cp - con->url); ZOOM_connection_connect(con->link, wrbuf_cstr(w), 0); wrbuf_destroy(w); } else { - ZOOM_connection_connect(con->link, host->url, 0); + ZOOM_connection_connect(con->link, con->url, 0); } con->iochan = iochan_create(-1, connection_handler, 0, "connection_socket"); con->state = Conn_Connecting; @@ -539,6 +551,7 @@ int client_prep_connection(struct client *cl, for (co = host->connections; co; co = co->next) { if (connection_is_idle(co) && + !strcmp(url, co->url) && (!co->client || client_get_state(co->client) == Client_Idle) && !strcmp(ZOOM_connection_option_get(co->link, "user"), session_setting_oneval(client_get_database(cl), @@ -591,7 +604,8 @@ int client_prep_connection(struct client *cl, else { yaz_mutex_leave(host->mutex); - co = connection_create(cl, host, operation_timeout, session_timeout, + co = connection_create(cl, url, host, + operation_timeout, session_timeout, iochan_man); } assert(co->host); diff --git a/src/host.c b/src/host.c index ae536c6..20979b6 100644 --- a/src/host.c +++ b/src/host.c @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include "ppmutex.h" #include "session.h" @@ -38,39 +39,43 @@ struct database_hosts { YAZ_MUTEX mutex; }; +#if YAZ_VERSIONL > 0x4023e +#define strcmp_null(x, y) yaz_strcmp_null(x, y) +#else +#define strcmp_null(x, y) local_strcmp_null(x, y) + +static int local_strcmp_null(const char *v1, const char *v2) +{ + if (v1) + { + if (v2) + return strcmp(v1, v2); + else + return 1; + } + else if (v2) + return -1; + return 0; +} +#endif + // Create a new host structure for hostport -static struct host *create_host(const char *url, const char *proxy, - int default_port, +static struct host *create_host(const char *proxy, + const char *tproxy, iochan_man_t iochan_man) { struct host *host; - char *db_comment; host = xmalloc(sizeof(struct host)); - host->url = xstrdup(url); host->proxy = 0; host->tproxy = 0; if (proxy && *proxy) host->proxy = xstrdup(proxy); else { - char *cp; - - host->tproxy = xmalloc (strlen(url) + 10); /* so we can add :port */ - strcpy(host->tproxy, url); - for (cp = host->tproxy; *cp; cp++) - if (strchr("/?#~", *cp)) - { - *cp = '\0'; - break; - } - if (!strchr(host->tproxy, ':')) - sprintf(cp, ":%d", default_port); /* no port given, add it */ + assert(tproxy); + host->tproxy = xstrdup(tproxy); } - - db_comment = strchr(host->url, '#'); - if (db_comment) - *db_comment = '\0'; host->connections = 0; host->ipport = 0; host->mutex = 0; @@ -80,7 +85,6 @@ static struct host *create_host(const char *url, const char *proxy, xfree(host->ipport); xfree(host->tproxy); xfree(host->proxy); - xfree(host->url); xfree(host); return 0; } @@ -96,18 +100,35 @@ struct host *find_host(database_hosts_t hosts, const char *url, iochan_man_t iochan_man) { struct host *p; + char *tproxy = 0; + + if (!proxy || !*proxy) + { + char *cp; + + tproxy = xmalloc (strlen(url) + 10); /* so we can add :port */ + strcpy(tproxy, url); + for (cp = tproxy; *cp; cp++) + if (strchr("/?#~", *cp)) + { + *cp = '\0'; + break; + } + if (!strchr(tproxy, ':')) + sprintf(cp, ":%d", port); /* no port given, add it */ + } yaz_mutex_enter(hosts->mutex); for (p = hosts->hosts; p; p = p->next) - if (!strcmp(p->url, url)) + { + if (!strcmp_null(p->tproxy, tproxy) && + !strcmp_null(p->proxy, proxy)) { - if (p->proxy && proxy && !strcmp(p->proxy, proxy)) - break; - if (!p->proxy && !proxy) - break; + break; } + } if (!p) { - p = create_host(url, proxy, port, iochan_man); + p = create_host(proxy, tproxy, iochan_man); if (p) { p->next = hosts->hosts; @@ -115,6 +136,7 @@ struct host *find_host(database_hosts_t hosts, const char *url, } } yaz_mutex_leave(hosts->mutex); + xfree(tproxy); return p; } @@ -137,7 +159,6 @@ void database_hosts_destroy(database_hosts_t *pp) struct host *p_next = p->next; yaz_mutex_destroy(&p->mutex); yaz_cond_destroy(&p->cond_ready); - xfree(p->url); xfree(p->ipport); xfree(p); p = p_next; diff --git a/src/host.h b/src/host.h index c1f2d89..439bbee 100644 --- a/src/host.h +++ b/src/host.h @@ -26,7 +26,6 @@ typedef struct database_hosts *database_hosts_t; /** \brief Represents a host (irrespective of databases) */ struct host { - char *url; // logical host/database?args .. char *tproxy; // tproxy address (no Z39.50 UI) char *proxy; // logical proxy address char *ipport; // tproxy or proxy resolved