From a89ed3c40c9eab3721ccbd5e91919ba06208edbc Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 15 Jun 2006 10:34:15 +0000 Subject: [PATCH] Changed ZOOM_query_ccl2rpn function so that it takes a CCL config as input and return error information directly. --- NEWS | 9 ++--- include/yaz/zoom.h | 6 ++-- src/zoom-c.c | 92 ++++++++++++++-------------------------------------- zoom/Makefile.am | 5 +-- zoom/zoomtst10.c | 66 +++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 78 deletions(-) create mode 100644 zoom/zoomtst10.c diff --git a/NEWS b/NEWS index 4ec9074..8cbcb82 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,7 @@ Added support for CCL, compiled on the client side, in ZOOM-C. This -is invoked using ZOOM_query_ccl2rpn(); the resulting query objects can -be used for for searching with ZOOM_connection_search() and scanning -with ZOOM_connection_scan1(). Before it can be used for CCL -searching and scanning, the connection object must be configured by -setting the "cclfile" option to the name of a CCL qualifier file such -as the one in "client/default.bib". +is invoked using ZOOM_query_ccl2rpn() with the CCL configuration as +input; the resulting query objects can be used for for searching with +ZOOM_connection_search() and scanning with ZOOM_connection_scan1(). YAZ' configure searches for OpenSSL by default. diff --git a/include/yaz/zoom.h b/include/yaz/zoom.h index d64e40b..7c3cb85 100644 --- a/include/yaz/zoom.h +++ b/include/yaz/zoom.h @@ -2,7 +2,7 @@ * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. * - * $Id: zoom.h,v 1.35 2006-06-13 16:20:04 mike Exp $ + * $Id: zoom.h,v 1.36 2006-06-15 10:34:16 adam Exp $ */ /** * \file zoom.h @@ -204,7 +204,9 @@ ZOOM_API(int) ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn); /* CCL translated client-side into RPN: `conn' is optional for diagnostics */ ZOOM_API(int) -ZOOM_query_ccl2rpn(ZOOM_query s, const char *str, ZOOM_connection conn); +ZOOM_query_ccl2rpn(ZOOM_query s, const char *query_str, + const char *config, + int *ccl_error, const char **error_string, int *error_pos); /* PQF */ ZOOM_API(int) ZOOM_query_prefix(ZOOM_query s, const char *str); diff --git a/src/zoom-c.c b/src/zoom-c.c index 169037f..22c4719 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.77 2006-06-14 09:15:28 mike Exp $ + * $Id: zoom-c.c,v 1.78 2006-06-15 10:34:17 adam Exp $ */ /** * \file zoom-c.c @@ -54,7 +54,6 @@ 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() { @@ -588,24 +587,32 @@ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn) * 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; - ZOOM_connection freeme = 0; - - yaz_log(log_details, "%p ZOOM_query_ccl2rpn str=%s conn=%p", s, str, conn); - if (conn == 0) - conn = freeme = ZOOM_connection_create(0); + struct ccl_rpn_node *rpn; + CCL_bibset bibset = ccl_qual_mk(); - rpn = ccl2pqf(conn, str); - if (freeme != 0) - ZOOM_connection_destroy(freeme); - if (rpn == 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; } @@ -1188,7 +1195,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.77 $"); + version = odr_strdup(c->odr_out, "$Revision: 1.78 $"); if (strlen(version) > 10) /* check for unexpanded CVS strings */ version[strlen(version)-2] = '\0'; ireq->implementationVersion = odr_prepend(c->odr_out, @@ -2488,12 +2495,6 @@ ZOOM_connection_scan1 (ZOOM_connection c, ZOOM_query q) 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); @@ -4114,51 +4115,6 @@ static char *cql2pqf(ZOOM_connection c, const char *cql) 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 diff --git a/zoom/Makefile.am b/zoom/Makefile.am index 0d06f90..3be0484 100644 --- a/zoom/Makefile.am +++ b/zoom/Makefile.am @@ -1,9 +1,9 @@ -## $Id: Makefile.am,v 1.17 2006-02-02 13:14:58 adam Exp $ +## $Id: Makefile.am,v 1.18 2006-06-15 10:34:24 adam Exp $ ## Copyright (C) 2001, Index Data AM_CPPFLAGS = -I$(top_srcdir)/include -EXTRA_PROGRAMS = zoomtst1 zoomtst2 zoomtst3 zoomtst4 zoomtst5 zoomtst6 zoomtst7 zoomtst8 zoomtst9 +EXTRA_PROGRAMS = zoomtst1 zoomtst2 zoomtst3 zoomtst4 zoomtst5 zoomtst6 zoomtst7 zoomtst8 zoomtst9 zoomtst10 bin_PROGRAMS = zoomsh noinst_PROGRAMS = zoom-benchmark @@ -18,6 +18,7 @@ zoomtst6_SOURCES = zoomtst6.c zoomtst7_SOURCES = zoomtst7.c zoomtst8_SOURCES = zoomtst8.c zoomtst9_SOURCES = zoomtst9.c +zoomtst10_SOURCES = zoomtst10.c zoomsh_SOURCES = zoomsh.c zoom_benchmark_SOURCES = zoom-benchmark.c diff --git a/zoom/zoomtst10.c b/zoom/zoomtst10.c new file mode 100644 index 0000000..73710be --- /dev/null +++ b/zoom/zoomtst10.c @@ -0,0 +1,66 @@ +/* $Id: zoomtst10.c,v 1.1 2006-06-15 10:34:24 adam Exp $ */ + +/** \file zoomtst10.c + \brief Synchronous single-target search using CCL conversion +*/ + +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + ZOOM_connection z; + ZOOM_resultset r; + ZOOM_query q = ZOOM_query_create(); + int error; + const char *errmsg, *addinfo; + int ccl_error_code, ccl_error_pos; + const char *ccl_error_string; + + if (argc != 3) + { + fprintf (stderr, "usage:\n%s target cclquery\n", *argv); + fprintf (stderr, " eg. bagel.indexdata.dk/gils 'ti=computer'\n"); + exit (1); + } + + if (ZOOM_query_ccl2rpn(q, argv[2], + "term t=l,r s=al\n" "ti u=4 s=pw\n", + &ccl_error_code, &ccl_error_string, &ccl_error_pos)) + { + printf("CCL Error %d: %s\n", ccl_error_code, ccl_error_string); + if (ccl_error_pos >= 0) + printf("%s\n%*s^\n", argv[2], ccl_error_pos, ""); + ZOOM_query_destroy(q); + } + else + { + z = ZOOM_connection_new (argv[1], 0); + + if ((error = ZOOM_connection_error(z, &errmsg, &addinfo))) + { + fprintf (stderr, "Error: %s (%d) %s\n", errmsg, error, addinfo); + exit (2); + } + + r = ZOOM_connection_search (z, q); + ZOOM_query_destroy(q); + if ((error = ZOOM_connection_error(z, &errmsg, &addinfo))) + fprintf (stderr, "Error: %s (%d) %s\n", errmsg, error, addinfo); + else + printf ("Result count: %ld\n", (long) ZOOM_resultset_size(r)); + ZOOM_resultset_destroy (r); + ZOOM_connection_destroy (z); + } + exit (0); +} +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ + -- 1.7.10.4