+/*
+ * Translate the CQL string client-side into RPN which is passed to
+ * the server. This is useful for server's that don't themselves
+ * support CQL, for which ZOOM_query_cql() is useless. `conn' is used
+ * only as a place to stash diagnostics if compilation fails; if this
+ * information is not needed, a null pointer may be used.
+ */
+ZOOM_API(int)
+ ZOOM_query_cql2rpn(ZOOM_query s, const char *str, ZOOM_connection conn)
+{
+ 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 = freeme = ZOOM_connection_create(0);
+
+ rpn = cql2pqf(conn, str);
+ if (freeme != 0)
+ ZOOM_connection_destroy(freeme);
+ if (rpn == 0)
+ return -1;
+
+ ret = ZOOM_query_prefix(s, rpn);
+ xfree(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_cstr(wr));
+ wrbuf_destroy(wr);
+ }
+ ccl_qual_rm(&bibset);
+ return ret;
+}
+