/* 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 resultset_destroy(ZOOM_resultset r);
static zoom_ret do_write_ex(ZOOM_connection c, char *buf_out, int len_out);
-ZOOM_API(const char *) ZOOM_get_event_str(int event)
-{
- static const char *ar[] = {
- "NONE",
- "CONNECT",
- "SEND_DATA",
- "RECV_DATA",
- "TIMEOUT",
- "UNKNOWN",
- "SEND_APDU",
- "RECV_APDU",
- "RECV_RECORD",
- "RECV_SEARCH",
- "END"
- };
- return ar[event];
-}
-
static void initlog(void)
{
static int log_level_initialized = 0;
+
if (!log_level_initialized)
{
log_api0 = yaz_log_module_level("zoom");
}
}
-ZOOM_Event ZOOM_Event_create(int kind)
-{
- ZOOM_Event event = (ZOOM_Event) xmalloc(sizeof(*event));
- event->kind = kind;
- event->next = 0;
- event->prev = 0;
- return event;
-}
-
-static void ZOOM_Event_destroy(ZOOM_Event event)
-{
- xfree(event);
-}
-
-void ZOOM_connection_put_event(ZOOM_connection c, ZOOM_Event event)
-{
- if (c->m_queue_back)
- {
- c->m_queue_back->prev = event;
- assert(c->m_queue_front);
- }
- else
- {
- assert(!c->m_queue_front);
- c->m_queue_front = event;
- }
- event->next = c->m_queue_back;
- event->prev = 0;
- c->m_queue_back = event;
-}
-
-static ZOOM_Event ZOOM_connection_get_event(ZOOM_connection c)
-{
- ZOOM_Event event = c->m_queue_front;
- if (!event)
- {
- c->last_event = ZOOM_EVENT_NONE;
- return 0;
- }
- assert(c->m_queue_back);
- c->m_queue_front = event->prev;
- if (c->m_queue_front)
- {
- assert(c->m_queue_back);
- c->m_queue_front->next = 0;
- }
- else
- c->m_queue_back = 0;
- c->last_event = event->kind;
- return event;
-}
-
-static void ZOOM_connection_remove_events(ZOOM_connection c)
-{
- ZOOM_Event event;
- while ((event = ZOOM_connection_get_event(c)))
- ZOOM_Event_destroy(event);
-}
-
-ZOOM_API(int) ZOOM_connection_peek_event(ZOOM_connection c)
-{
- ZOOM_Event event = c->m_queue_front;
-
- return event ? event->kind : ZOOM_EVENT_NONE;
-}
-
void ZOOM_connection_remove_tasks(ZOOM_connection c);
void ZOOM_set_dset_error(ZOOM_connection c, int error,
task->running = 0;
task->which = which;
- clear_error(c);
return task;
}
return zoom_sru_get;
else if (!yaz_matchstr(s, "post"))
return zoom_sru_post;
+ else if (!yaz_matchstr(s, "solr"))
+ return zoom_sru_solr;
return zoom_sru_error;
}
}
}
+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
}
if (cret == zoom_complete)
{
- yaz_log(YLOG_LOG, "removing tasks in handle_http");
+ yaz_log(c->log_details, "removing tasks in handle_http");
ZOOM_connection_remove_task(c);
}
{