X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-cql2rpn.cpp;fp=src%2Fyaz-cql2rpn.cpp;h=7b67975b91740fa408568f2d39625ad7b5ed1b5c;hb=6c6afc2c880abaf5ae19a5e7471e1bd149d1320c;hp=dfbcd4be6c1fd22ceb428a0b6c47c0aae8a83d8d;hpb=805b4fdf7b70b0e9b298064f24ceff0c1d38e05b;p=yazpp-moved-to-github.git diff --git a/src/yaz-cql2rpn.cpp b/src/yaz-cql2rpn.cpp index dfbcd4b..7b67975 100644 --- a/src/yaz-cql2rpn.cpp +++ b/src/yaz-cql2rpn.cpp @@ -7,7 +7,9 @@ #include #endif #include +#include #include +#include #include using namespace yazpp_1; @@ -50,18 +52,36 @@ int Yaz_cql2rpn::query_transform(const char *cql_query, int r = cql_parser_string(cp, cql_query); if (r) { - r = 10; + r = YAZ_SRW_QUERY_SYNTAX_ERROR; } else { - char rpn_buf[10240]; - r = cql_transform_buf(m_transform, cql_parser_result(cp), - rpn_buf, sizeof(rpn_buf)-1); + WRBUF pqf = wrbuf_alloc(); + r = cql_transform(m_transform, cql_parser_result(cp), + 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)) + { + 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; @@ -75,12 +95,10 @@ int Yaz_cql2rpn::query_transform(const char *cql_query, { r = cql_transform_error(m_transform, &addinfo); } + wrbuf_destroy(pqf); } cql_parser_destroy(cp); - if (addinfo) - *addinfop = odr_strdup(o, addinfo); - else - *addinfop = 0; + *addinfop = odr_strdup_null(o, addinfo); return r; } /*