X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-cql2rpn.cpp;h=54d00069dd56829c64ebb76f6713ec62087fe640;hb=9db3735fa68528436821b0349f5acc788f448492;hp=3906dff95d7449f0983b6ee129a83516a11c0fb5;hpb=7411ed6df7fc0b535f83503f73d70e80f390e295;p=yazpp-moved-to-github.git diff --git a/src/yaz-cql2rpn.cpp b/src/yaz-cql2rpn.cpp index 3906dff..54d0006 100644 --- a/src/yaz-cql2rpn.cpp +++ b/src/yaz-cql2rpn.cpp @@ -1,13 +1,17 @@ -/* - * Copyright (c) 1998-2004, Index Data. +/* This file is part of the yazpp toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: yaz-cql2rpn.cpp,v 1.8 2005-06-25 15:53:19 adam Exp $ */ +#if HAVE_CONFIG_H +#include +#endif #include +#include #include -#include +#include +#include +#include using namespace yazpp_1; @@ -28,59 +32,101 @@ void Yaz_cql2rpn::set_pqf_file(const char *fname) m_transform = cql_transform_open_fname(fname); } -int Yaz_cql2rpn::query_transform(const char *cql_query, + +bool Yaz_cql2rpn::parse_spec_file(const char *fname, int *error) +{ + *error = 0; + cql_transform_close(m_transform); + m_transform = cql_transform_open_fname(fname); + return m_transform ? true : false; +} + +int Yaz_cql2rpn::rpn2cql_transform(Z_RPNQuery *q, WRBUF cql, ODR o, + char **addinfop) +{ + WRBUF addinfo = wrbuf_alloc(); + int r = cql_transform_rpn2cql_stream_r(m_transform, addinfo, + wrbuf_vp_puts, cql, q); + if (r && wrbuf_len(addinfo)) + *addinfop = odr_strdup_null(o, wrbuf_cstr(addinfo)); + else + *addinfop = 0; + wrbuf_destroy(addinfo); + return r; +} + +int Yaz_cql2rpn::query_transform(const char *cql_query, Z_RPNQuery **rpnquery, ODR o, char **addinfop) { - const char *addinfo = 0; if (!m_transform) return -3; CQL_parser cp = cql_parser_create(); + WRBUF addinfo = wrbuf_alloc(); + const char *lead = "query_transform::query_transform"; int r = cql_parser_string(cp, cql_query); if (r) { - yaz_log(YLOG_LOG, "CQL Parse Error"); - r = 10; + wrbuf_printf(addinfo, "%s:cql_parser_string failed: %s", + lead, cql_query); + r = YAZ_SRW_QUERY_SYNTAX_ERROR; } else { - char rpn_buf[1024]; - r = cql_transform_buf(m_transform, cql_parser_result(cp), - rpn_buf, sizeof(rpn_buf)-1); + WRBUF pqf = wrbuf_alloc(); + r = cql_transform_r(m_transform, cql_parser_result(cp), addinfo, + wrbuf_vp_puts, pqf); if (!r) { + WRBUF sortkeys = wrbuf_alloc(); + WRBUF sortspec = wrbuf_alloc(); + if (cql_sortby_to_sortkeys(cql_parser_result(cp), + wrbuf_vp_puts, sortkeys)) + { + wrbuf_printf(addinfo, "%s: cql_parser_string failed: %s", + lead, cql_query); + r = YAZ_SRW_UNSUPP_SORT_TYPE; + } + else + { + yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sortkeys), sortspec); + Z_SortKeySpecList *sksl = + yaz_sort_spec(o, wrbuf_cstr(sortspec)); + if (sksl) + yaz_sort_spec_to_type7(sksl, pqf); + } + wrbuf_destroy(sortspec); + wrbuf_destroy(sortkeys); + YAZ_PQF_Parser pp = yaz_pqf_create(); - *rpnquery = yaz_pqf_parse(pp, o, rpn_buf); + *rpnquery = yaz_pqf_parse(pp, o, wrbuf_cstr(pqf)); if (!*rpnquery) { size_t off; const char *pqf_msg; - int code = yaz_pqf_error(pp, &pqf_msg, &off); - yaz_log(YLOG_WARN, "PQF Parser Error %s (code %d)", - pqf_msg, code); - r = -1; + yaz_pqf_error(pp, &pqf_msg, &off); + wrbuf_printf(addinfo, "%s: yaz_pqf_parse failed: %s", + lead, wrbuf_cstr(pqf)); + r = YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE; } yaz_pqf_destroy(pp); } - else - { - r = cql_transform_error(m_transform, &addinfo); - yaz_log(YLOG_LOG, "CQL Transform Error %d %s", r, - addinfo ? addinfo : ""); - } - } + wrbuf_destroy(pqf); + } cql_parser_destroy(cp); - if (addinfo) - *addinfop = odr_strdup(o, addinfo); + if (r && wrbuf_len(addinfo)) + *addinfop = odr_strdup_null(o, wrbuf_cstr(addinfo)); else *addinfop = 0; + wrbuf_destroy(addinfo); return r; } /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab