From 3ee7ef4088b265faffbdcabe3eb13d5f04a3b832 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Tue, 13 Jun 2006 16:21:42 +0000 Subject: [PATCH] Add ZOOM_query_ccl2rpn() and two new error-codes that it generates: ZOOM_ERROR_CCL_CONFIG and ZOOM_ERROR_CCL_PARSE Also, new static utility function ccl2pqf() which may be useful elsewhere. Note that CCL is _not_ supported in scanning. --- src/zoom-c.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/zoom-c.c b/src/zoom-c.c index 5ca5e65..3149464 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom-c.c,v 1.74 2006-06-02 13:08:27 adam Exp $ + * $Id: zoom-c.c,v 1.75 2006-06-13 16:21:42 mike Exp $ */ /** * \file zoom-c.c @@ -25,6 +25,7 @@ #include #include #include +#include #if HAVE_SYS_TYPES_H #include @@ -53,6 +54,7 @@ typedef enum { 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() { @@ -576,6 +578,29 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) 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, ZOOM_connection conn) +{ + char *rpn; + int ret; + + 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; + + ret = ZOOM_query_prefix(s, rpn); + xfree(rpn); + return ret; +} + ZOOM_API(int) ZOOM_query_sortby(ZOOM_query s, const char *criteria) { @@ -1155,7 +1180,7 @@ static zoom_ret ZOOM_connection_send_init (ZOOM_connection c) ZOOM_options_get(c->options, "implementationName"), odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName)); - version = odr_strdup(c->odr_out, "$Revision: 1.74 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.75 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, @@ -2444,8 +2469,8 @@ ZOOM_connection_scan1 (ZOOM_connection c, ZOOM_query q) * 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. + * ### should add support for CCL here */ - 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); @@ -3717,6 +3742,10 @@ ZOOM_diag_str (int error) 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); } @@ -4073,6 +4102,50 @@ static char *cql2pqf(ZOOM_connection c, const char *cql) } +/* ### 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 -- 1.7.10.4