* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.72 2006-05-10 07:34:38 adam Exp $
+ * $Id: zoom-c.c,v 1.80 2006-06-16 12:34:32 adam Exp $
*/
/**
* \file zoom-c.c
#include <yaz/ill.h>
#include <yaz/srw.h>
#include <yaz/cql.h>
+#include <yaz/ccl.h>
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
event->kind = kind;
event->next = 0;
event->prev = 0;
+ yaz_log(log_details, "ZOOM_event_create(%d)", kind);
return event;
}
{
char *rpn;
int ret;
+ ZOOM_connection freeme = 0;
yaz_log(log_details, "%p ZOOM_query_cql2rpn str=%s conn=%p", s, str, conn);
if (conn == 0)
- conn = ZOOM_connection_create(0);
+ conn = freeme = ZOOM_connection_create(0);
- if ((rpn = cql2pqf(conn, str)) == 0)
+ rpn = cql2pqf(conn, str);
+ if (freeme != 0)
+ ZOOM_connection_destroy(freeme);
+ if (rpn == 0)
return -1;
ret = ZOOM_query_prefix(s, rpn);
return ret;
}
+/*
+ * Analogous in every way to ZOOM_query_cql2rpn(), except that there
+ * is no analogous ZOOM_query_ccl() that just sends uninterpreted CCL
+ * to the server, as the YAZ GFS doesn't know how to handle this.
+ */
+ZOOM_API(int)
+ ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, const char *config,
+ int *ccl_error, const char **error_string,
+ int *error_pos)
+{
+ int ret;
+ struct ccl_rpn_node *rpn;
+ CCL_bibset bibset = ccl_qual_mk();
+
+ if (config)
+ ccl_qual_buf(bibset, config);
+
+ rpn = ccl_find_str(bibset, str, ccl_error, error_pos);
+ if (!rpn)
+ {
+ *error_string = ccl_err_msg(*ccl_error);
+ ret = -1;
+ }
+ else
+ {
+ WRBUF wr = wrbuf_alloc();
+ ccl_pquery(wr, rpn);
+ ccl_rpn_delete(rpn);
+ ret = ZOOM_query_prefix(s, wrbuf_buf(wr));
+ wrbuf_free(wr, 1);
+ }
+ ccl_qual_rm(&bibset);
+ return ret;
+}
+
ZOOM_API(int)
ZOOM_query_sortby(ZOOM_query s, const char *criteria)
{
ZOOM_options_get(c->options, "implementationName"),
odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.72 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.80 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion = odr_prepend(c->odr_out,
#if HAVE_XML2
static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
{
- Z_SOAP_Handler h[2] = {
- {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
- ODR o = odr_createmem(ODR_ENCODE);
- int ret;
- Z_SOAP *p = (Z_SOAP*) odr_malloc(o, sizeof(*p));
Z_GDU *gdu;
ZOOM_Event event;
- gdu = z_get_HTTP_Request(c->odr_out);
- gdu->u.HTTP_Request->path = c->path;
-
- if (c->host_port)
- {
- const char *cp0 = strstr(c->host_port, "://");
- const char *cp1 = 0;
- if (cp0)
- cp0 = cp0+3;
- else
- cp0 = c->host_port;
-
- cp1 = strchr(cp0, '/');
- if (!cp1)
- cp1 = cp0+strlen(cp0);
-
- if (cp0 && cp1)
- {
- char *h = (char*) odr_malloc(c->odr_out, cp1 - cp0 + 1);
- memcpy (h, cp0, cp1 - cp0);
- h[cp1-cp0] = '\0';
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "Host", h);
- }
- }
+ gdu = z_get_HTTP_Request_host_path(c->odr_out, c->host_port, c->path);
if (c->sru_mode == zoom_sru_get)
{
}
else if (c->sru_mode == zoom_sru_soap)
{
- z_HTTP_header_add_content_type(c->odr_out,
- &gdu->u.HTTP_Request->headers,
- "text/xml", c->charset);
-
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "SOAPAction", "\"\"");
- p->which = Z_SOAP_generic;
- p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
- p->u.generic->no = 0;
- p->u.generic->ns = 0;
- p->u.generic->p = sr;
- p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
-
- ret = z_soap_codec_enc(o, &p,
- &gdu->u.HTTP_Request->content_buf,
- &gdu->u.HTTP_Request->content_len, h,
- c->charset);
-
+ yaz_sru_post_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
}
if (!z_GDU(c->odr_out, &gdu, 0, 0))
return zoom_complete;
c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
- odr_destroy(o);
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
record_cache_lookup (resultset, i + resultset->start);
if (!rec)
break;
+ else
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
+ ZOOM_connection_put_event(c, event);
+ }
}
- if (i == resultset->count)
+ resultset->start += i;
+ resultset->count -= i;
+
+ if (resultset->count == 0)
return zoom_complete;
}
assert(resultset->query);
record_cache_add (resultset, p->records[i],
i+ resultset->start);
}
+ resultset->count -= i;
+ resultset->start += i;
/* transfer our response to search_nmem .. we need it later */
nmem_transfer (resultset->odr->mem, nmem);
nmem_destroy (nmem);
yaz_log(log_details, "%p send_present no tasks", c);
return zoom_complete;
}
+
switch (c->tasks->which)
{
case ZOOM_TASK_SEARCH:
record_cache_lookup (resultset, i + resultset->start);
if (!rec)
break;
+ else
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
+ ZOOM_connection_put_event(c, event);
+ }
}
- if (i == resultset->count)
+ resultset->start += i;
+ resultset->count -= i;
+
+ if (resultset->count == 0)
{
yaz_log(log_details, "%p send_present skip=%d no more to fetch", c, i);
return zoom_complete;
apdu = zget_APDU(c->odr_out, Z_APDU_presentRequest);
req = apdu->u.presentRequest;
- resultset->start += i;
- resultset->count -= i;
-
if (i)
yaz_log(log_details, "%p send_present skip=%d", c, i);
/*
* We need to check the query-type, so we can recognise CQL and
- * compile it into a form that we can use here. The ZOOM_query
- * structure has no explicit `type' member, but inspection of the
- * ZOOM_query_prefix() and ZOOM_query_cql() functions shows how
- * the structure is set up in each case.
+ * CCL and compile them into a form that we can use here. The
+ * ZOOM_query structure has no explicit `type' member, but
+ * inspection of the ZOOM_query_prefix() and ZOOM_query_cql()
+ * functions shows how the structure is set up in each case.
*/
-
if (q->z_query->which == Z_Query_type_1) {
yaz_log(log_api, "%p ZOOM_connection_scan1 q=%p PQF '%s'",
c, q, q->query_string);
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
- return do_write_ex (c, c->tasks->u.package->buf_out,
- c->tasks->u.package->len_out);
+ c->buf_out = c->tasks->u.package->buf_out;
+ c->len_out = c->tasks->u.package->len_out;
+
+ return do_write(c);
}
static zoom_ret send_scan (ZOOM_connection c)
return "CQL parsing error";
case ZOOM_ERROR_CQL_TRANSFORM:
return "CQL transformation error";
+ case ZOOM_ERROR_CCL_CONFIG:
+ return "CCL configuration error";
+ case ZOOM_ERROR_CCL_PARSE:
+ return "CCL parsing error";
default:
return diagbib1_str (error);
}
int i, r, nfds;
int max_fd = 0;
+ yaz_log(log_details, "ZOOM_event no=%d", no);
for (i = 0; i<no; i++)
{
ZOOM_connection c = cs[i];
for (i = 0; i<no; i++)
{
ZOOM_connection c = cs[i];
- ZOOM_Event event;
- if (c && ZOOM_connection_exec_task (c))
+ if (c)
{
+ ZOOM_Event event;
+ ZOOM_connection_exec_task (c);
if ((event = ZOOM_connection_get_event(c)))
{
ZOOM_Event_destroy (event);
return xstrdup(pqfbuf);
}
-
/*
* Local variables:
* c-basic-offset: 4