Conn_Connecting,
Conn_Open
} state;
- int connect_timeout;
+ int operation_timeout;
int session_timeout;
struct connection *next; // next for same host or next in free list
};
// Creates a new connection for client, associated with the host of
// client's database
static struct connection *connection_create(struct client *cl,
- int connect_timeout,
+ int operation_timeout,
int session_timeout)
{
struct connection *new;
client_set_connection(cl, new);
new->link = 0;
new->state = Conn_Resolving;
- new->connect_timeout = connect_timeout;
+ new->operation_timeout = operation_timeout;
new->session_timeout = session_timeout;
if (host->ipport)
connection_connect(new);
yaz_log(YLOG_LOG, "Error %s from %s",
error, client_get_url(cl));
}
+ iochan_settimeout(iochan, co->session_timeout);
client_set_state(cl, Client_Idle);
}
break;
break;
case ZOOM_EVENT_SEND_APDU:
client_set_state(co->client, Client_Working);
+ iochan_settimeout(iochan, co->operation_timeout);
break;
case ZOOM_EVENT_RECV_APDU:
break;
case ZOOM_EVENT_CONNECT:
yaz_log(YLOG_LOG, "Connected to %s", client_get_url(cl));
co->state = Conn_Open;
- iochan_settimeout(iochan, co->session_timeout);
break;
case ZOOM_EVENT_RECV_SEARCH:
client_search_response(cl);
con->link = link;
con->iochan = iochan_create(0, connection_handler, 0);
con->state = Conn_Connecting;
- iochan_settimeout(con->iochan, con->connect_timeout);
+ iochan_settimeout(con->iochan, con->operation_timeout);
iochan_setdata(con->iochan, con);
iochan_setsocketfun(con->iochan, socketfun);
iochan_setmaskfun(con->iochan, maskfun);
// Ensure that client has a connection associated
int client_prep_connection(struct client *cl,
- int connect_timeout, int session_timeout)
+ int operation_timeout, int session_timeout)
{
struct connection *co;
struct session *se = client_get_session(cl);
if (zproxy && zproxy[0] == '\0')
zproxy = 0;
+ if (!host)
+ return 0;
+
co = client_get_connection(cl);
yaz_log(YLOG_DEBUG, "Client prep %s", client_get_url(cl));
connection_release(co);
client_set_connection(cl, co);
co->client = cl;
+ co->operation_timeout = operation_timeout;
+ co->session_timeout = session_timeout;
/* tells ZOOM to reconnect if necessary. Disabled becuase
the ZOOM_connection_connect flushes the task queue */
- co->connect_timeout = connect_timeout;
- co->session_timeout = session_timeout;
ZOOM_connection_connect(co->link, 0, 0);
}
else
{
- co = connection_create(cl, connect_timeout, session_timeout);
+ co = connection_create(cl, operation_timeout, session_timeout);
}
}
else
{
no_working++;
- if (client_prep_connection(cl, se->service->z3950_connect_timeout,
+ if (client_prep_connection(cl, se->service->z3950_operation_timeout,
se->service->z3950_session_timeout))
client_start_search(cl);
}
return mergekey_norm;
}
- static const char *str_tok_n(const char *s, const char *delim,
- const char **res, size_t *len)
- {
- *res = s;
- while (*s && !strchr(delim, *s))
- s++;
- *len = s - *res;
- if (*len == 0)
- return 0;
- if (*s && strchr(delim, *s))
- s++;
- return s;
- }
-
/** \brief see if metadata for pz:recordfilter exists
\param root xml root element of normalized record
\param sdb session database for client
xmlChar *type = xmlGetProp(n, (xmlChar *) "type");
if (type)
{
- const char *s1 = s;
size_t len;
- const char *value;
- while ((s1 = str_tok_n(s1, ",", &value, &len)) != 0)
+ const char *eq = strchr(s, '=');
+ if (eq)
+ len = eq - s;
+ else
+ len = strlen(s);
+ if (len == strlen((const char *)type) &&
+ !memcmp((const char *) type, s, len))
{
- if (len == strlen((const char *)type) &&
- !memcmp((const char *) type, s, len))
+ xmlChar *value = xmlNodeGetContent(n);
+ if (value && *value)
{
- xmlChar *value = xmlNodeGetContent(n);
- if (value && *value)
- {
- xmlFree(value);
+ if (!eq || strstr((const char *) value, eq+1))
match = 1;
- }
}
+ xmlFree(value);
}
xmlFree(type);
}