as input and return error information directly.
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.
* 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
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);
* 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
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()
{
* 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;
}
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,
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);
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
-## $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
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
--- /dev/null
+/* $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 <stdlib.h>
+#include <stdio.h>
+#include <yaz/xmalloc.h>
+#include <yaz/zoom.h>
+
+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
+ */
+