* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.76 2006-06-13 16:27:23 mike Exp $
+ * $Id: zoom-c.c,v 1.81 2006-07-06 10:17:54 adam Exp $
*/
/**
* \file zoom-c.c
static zoom_ret ZOOM_connection_send_init (ZOOM_connection c);
static zoom_ret do_write_ex (ZOOM_connection c, char *buf_out, int len_out);
static char *cql2pqf(ZOOM_connection c, const char *cql);
-static char *ccl2pqf(ZOOM_connection c, const char *ccl);
static void initlog()
{
event->kind = kind;
event->next = 0;
event->prev = 0;
+ yaz_log(log_details, "ZOOM_event_create(%d)", kind);
return event;
}
addinfo2 ? addinfo2 : "");
}
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
static void set_HTTP_error (ZOOM_connection c, int error,
const char *addinfo, const char *addinfo2)
{
{
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);
* 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, ZOOM_connection conn)
+ ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, const char *config,
+ int *ccl_error, const char **error_string,
+ int *error_pos)
{
- char *rpn;
int ret;
+ struct ccl_rpn_node *rpn;
+ CCL_bibset bibset = ccl_qual_mk();
- yaz_log(log_details, "%p ZOOM_query_ccl2rpn str=%s conn=%p", s, str, conn);
- if (conn == 0)
- conn = ZOOM_connection_create(0);
-
- if ((rpn = ccl2pqf(conn, str)) == 0)
- return -1;
+ if (config)
+ ccl_qual_buf(bibset, config);
- ret = ZOOM_query_prefix(s, rpn);
- xfree(rpn);
+ 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;
}
if (c->cs && c->cs->protocol == PROTO_HTTP)
{
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
const char *path = 0;
c->proto = PROTO_HTTP;
ZOOM_options_get(c->options, "implementationName"),
odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.76 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.81 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion = odr_prepend(c->odr_out,
return send_APDU (c, apdu);
}
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
{
Z_GDU *gdu;
}
#endif
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
static zoom_ret ZOOM_connection_srw_send_search(ZOOM_connection c)
{
int i;
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);
start = freeme = cql2pqf(c, q->query_string);
if (start == 0)
return 0;
- } else if (q->z_query->which == Z_Query_type_2) {
- yaz_log(log_api, "%p ZOOM_connection_scan1 q=%p CCL '%s'",
- c, q, q->query_string);
- start = freeme = ccl2pqf(c, q->query_string);
- if (start == 0)
- return 0;
} else {
yaz_log(YLOG_FATAL, "%p ZOOM_connection_scan1 q=%p unknown type '%s'",
c, q, q->query_string);
}
}
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
static void handle_srw_response(ZOOM_connection c,
Z_SRW_searchRetrieveResponse *res)
{
}
#endif
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres)
{
int ret = -1;
recv_apdu (c, gdu->u.z3950);
else if (gdu->which == Z_GDU_HTTP_Response)
{
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
handle_http (c, gdu->u.HTTP_Response);
#else
set_ZOOM_error(c, ZOOM_ERROR_DECODE, 0);
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);
}
-
-/* ### Could cache `bibset' */
-static char *ccl2pqf(ZOOM_connection c, const char *ccl)
-{
- const char *cclfile;
- CCL_bibset bibset;
- struct ccl_rpn_node *node;
- int errorcode;
- int errorpos;
- WRBUF w;
- char *pqf;
-
- if ((cclfile = ZOOM_connection_option_get(c, "cclfile")) == 0) {
- set_ZOOM_error(c, ZOOM_ERROR_CCL_CONFIG, "no CCL qualifier file");
- return 0;
- }
-
- bibset = ccl_qual_mk();
- if (ccl_qual_fname(bibset, cclfile) < 0) {
- char buf[512];
- ccl_qual_rm(&bibset);
- sprintf(buf, "can't open CCL qualifier file '%.200s': %.200s",
- cclfile, strerror(errno));
- set_ZOOM_error(c, ZOOM_ERROR_CCL_CONFIG, buf);
- return 0;
- }
-
- node = ccl_find_str (bibset, ccl, &errorcode, &errorpos);
- ccl_qual_rm(&bibset);
- if (node == 0) {
- /* code is one of the CCL_ERR_* constants; pos is unused here */
- set_ZOOM_error(c, ZOOM_ERROR_CCL_PARSE, ccl_err_msg(errorcode));
- return 0;
- }
-
- w = wrbuf_alloc();
- ccl_pquery(w, node);
- ccl_rpn_delete(node);
- pqf = xstrdup(wrbuf_buf(w));
- wrbuf_free(w, 1);
-
- return pqf;
-}
-
-
/*
* Local variables:
* c-basic-offset: 4