query_transform: any size for PQF result + minor refactor
[yazpp-moved-to-github.git] / src / yaz-cql2rpn.cpp
1 /* This file is part of the yazpp toolkit.
2  * Copyright (C) 1998-2013 Index Data and Mike Taylor
3  * See the file LICENSE for details.
4  */
5
6 #if HAVE_CONFIG_H
7 #include <config.h>
8 #endif
9 #include <yaz/log.h>
10 #include <yaz/diagsrw.h>
11 #include <yaz/pquery.h>
12 #include <yazpp/cql2rpn.h>
13
14 using namespace yazpp_1;
15
16 Yaz_cql2rpn::Yaz_cql2rpn()
17 {
18     m_transform = 0;
19 }
20
21 Yaz_cql2rpn::~Yaz_cql2rpn()
22 {
23     if (m_transform)
24         cql_transform_close(m_transform);
25 }
26
27 void Yaz_cql2rpn::set_pqf_file(const char *fname)
28 {
29     if (!m_transform)
30         m_transform = cql_transform_open_fname(fname);
31 }
32
33
34 bool Yaz_cql2rpn::parse_spec_file(const char *fname, int *error)
35 {
36     *error = 0;
37     cql_transform_close(m_transform);
38     m_transform = cql_transform_open_fname(fname);
39     return m_transform ? true : false;
40 }
41
42 int Yaz_cql2rpn::query_transform(const char *cql_query,
43                                  Z_RPNQuery **rpnquery, ODR o,
44                                  char **addinfop)
45 {
46     const char *addinfo = 0;
47     if (!m_transform)
48         return -3;
49     CQL_parser cp = cql_parser_create();
50
51     int r = cql_parser_string(cp, cql_query);
52     if (r)
53     {
54         r = YAZ_SRW_QUERY_SYNTAX_ERROR;
55     }
56     else
57     {
58         WRBUF w = wrbuf_alloc();
59         r = cql_transform(m_transform, cql_parser_result(cp), wrbuf_vp_puts, w);
60         if (!r)
61         {
62             YAZ_PQF_Parser pp = yaz_pqf_create();
63
64             *rpnquery = yaz_pqf_parse(pp, o, wrbuf_cstr(w));
65             if (!*rpnquery)
66             {
67                 size_t off;
68                 const char *pqf_msg;
69                 yaz_pqf_error(pp, &pqf_msg, &off);
70                 r = -1;
71             }
72             yaz_pqf_destroy(pp);
73         }
74         else
75         {
76             r = cql_transform_error(m_transform, &addinfo);
77         }
78         wrbuf_destroy(w);
79     }
80     cql_parser_destroy(cp);
81     *addinfop = odr_strdup_null(o, addinfo);
82     return r;
83 }
84 /*
85  * Local variables:
86  * c-basic-offset: 4
87  * c-file-style: "Stroustrup"
88  * indent-tabs-mode: nil
89  * End:
90  * vim: shiftwidth=4 tabstop=8 expandtab
91  */
92