/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2011 Index Data
* See the file LICENSE for details.
*/
/**
* \file zoom-c.c
* \brief Implements ZOOM C interface.
*/
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
#include <assert.h>
#include <string.h>
static void initlog(void)
{
static int log_level_initialized = 0;
+
if (!log_level_initialized)
{
log_api0 = yaz_log_module_level("zoom");
const char *host, int portnum)
{
const char *val;
- ZOOM_task task;
initlog();
c->async = ZOOM_options_get_bool(c->options, "async", 0);
yaz_log(c->log_details, "%p ZOOM_connection_connect async=%d", c, c->async);
- task = ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
+ ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT);
if (!c->async)
{
cs_close(c->cs);
#if ZOOM_RESULT_LISTS
- // Remove the connection's usage of resultsets
+ /* Remove the connection's usage of resultsets */
list = c->resultsets;
while (list) {
ZOOM_resultsets removed = list;
}
}
+static int g_resultsets = 0;
+static YAZ_MUTEX g_resultset_mutex = 0;
+
+/* TODO We need to initialize this before running threaded:
+ * call resultset_use(0) */
+
+static int resultset_use(int delta) {
+ int resultset_count;
+ if (g_resultset_mutex == 0)
+ yaz_mutex_create(&g_resultset_mutex);
+ yaz_mutex_enter(g_resultset_mutex);
+ g_resultsets += delta;
+ resultset_count = g_resultsets;
+ yaz_mutex_leave(g_resultset_mutex);
+ return resultset_count;
+}
+
+int resultsets_count(void) {
+ return resultset_use(0);
+}
+
ZOOM_resultset ZOOM_resultset_create(void)
{
int i;
YAZ_SHPTR_INIT(r->record_wrbuf, w);
}
#endif
+ resultset_use(1);
return r;
}
#if SHPTR
YAZ_SHPTR_DEC(r->record_wrbuf, wrbuf_destroy);
#endif
+ resultset_use(-1);
xfree(r);
}
else
}
static zoom_ret do_connect_host(ZOOM_connection c,
- const char *effective_host,
const char *logical_url);
static zoom_ret do_connect(ZOOM_connection c)
{
- const char *effective_host;
-
- if (c->proxy)
- effective_host = c->proxy;
- else
- effective_host = c->host_port;
- return do_connect_host(c, effective_host, c->host_port);
+ return do_connect_host(c, c->host_port);
}
-static zoom_ret do_connect_host(ZOOM_connection c, const char *effective_host,
- const char *logical_url)
+static zoom_ret do_connect_host(ZOOM_connection c, const char *logical_url)
{
void *add;
- yaz_log(c->log_details, "%p do_connect effective_host=%s", c, effective_host);
-
if (c->cs)
cs_close(c->cs);
- c->cs = cs_create_host(effective_host, 0, &add);
-
+ c->cs = cs_create_host_proxy(logical_url, 0, &add, c->proxy);
+
if (c->cs && c->cs->protocol == PROTO_HTTP)
{
#if YAZ_HAVE_XML2
- if (logical_url)
+ c->proto = PROTO_HTTP;
+ xfree(c->path);
+ if (c->proxy)
+ {
+ c->path = xstrdup(logical_url);
+ }
+ else
{
const char *db = 0;
- c->proto = PROTO_HTTP;
cs_get_host_args(logical_url, &db);
- xfree(c->path);
c->path = xmalloc(strlen(db) * 3 + 2);
yaz_encode_sru_dbpath_buf(c->path, db);
{
/* since redirect may change host we just reconnect. A smarter
implementation might check whether it's the same server */
- do_connect_host(c, location, 0);
+ do_connect_host(c, location);
send_HTTP_redirect(c, location, hres);
/* we're OK for now. Operation is not really complete */
ret = 0;
return "CCL configuration error";
case ZOOM_ERROR_CCL_PARSE:
return "CCL parsing error";
+ case ZOOM_ERROR_ES_INVALID_ACTION:
+ return "Extended Service. invalid action";
+ case ZOOM_ERROR_ES_INVALID_VERSION:
+ return "Extended Service. invalid version";
+ case ZOOM_ERROR_ES_INVALID_SYNTAX:
+ return "Extended Service. invalid syntax";
default:
return diagbib1_str(error);
}