X-Git-Url: http://lists.indexdata.dk/cgi-bin?a=blobdiff_plain;f=src%2Fyaz-cql2rpn.cpp;h=711d49d1963e8ba10bc309021faa51772158f582;hb=4cdabec84822b8b4f52907b6c69b3aedd199bf5a;hp=fd4e5a90526f7f7457462278aed412c77daf980a;hpb=8b4334d3c1e2329c87c55eee70359cd927a4f34d;p=yazpp-moved-to-github.git diff --git a/src/yaz-cql2rpn.cpp b/src/yaz-cql2rpn.cpp index fd4e5a9..711d49d 100644 --- a/src/yaz-cql2rpn.cpp +++ b/src/yaz-cql2rpn.cpp @@ -1,11 +1,13 @@ -/* - * Copyright (c) 1998-2004, Index Data. +/* This file is part of the yazpp toolkit. + * Copyright (C) 1998-2013 Index Data and Mike Taylor * See the file LICENSE for details. - * - * $Id: yaz-cql2rpn.cpp,v 1.10 2006-09-11 23:06:28 adam Exp $ */ +#if HAVE_CONFIG_H +#include +#endif #include +#include #include #include @@ -28,7 +30,16 @@ 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::query_transform(const char *cql_query, Z_RPNQuery **rpnquery, ODR o, char **addinfop) { @@ -40,26 +51,22 @@ int Yaz_cql2rpn::query_transform(const char *cql_query, int r = cql_parser_string(cp, cql_query); if (r) { - yaz_log(YLOG_LOG, "CQL Parse Error"); - 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 w = wrbuf_alloc(); + r = cql_transform(m_transform, cql_parser_result(cp), wrbuf_vp_puts, w); if (!r) { YAZ_PQF_Parser pp = yaz_pqf_create(); - *rpnquery = yaz_pqf_parse(pp, o, rpn_buf); + *rpnquery = yaz_pqf_parse(pp, o, wrbuf_cstr(w)); 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); + yaz_pqf_error(pp, &pqf_msg, &off); r = -1; } yaz_pqf_destroy(pp); @@ -67,20 +74,17 @@ int Yaz_cql2rpn::query_transform(const char *cql_query, else { r = cql_transform_error(m_transform, &addinfo); - yaz_log(YLOG_LOG, "CQL Transform Error %d %s", r, - addinfo ? addinfo : ""); } - } + wrbuf_destroy(w); + } cql_parser_destroy(cp); - if (addinfo) - *addinfop = odr_strdup(o, addinfo); - else - *addinfop = 0; + *addinfop = odr_strdup_null(o, addinfo); return r; } /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab