Added Yaz_cql2rpn::parse_spec_file
[yazpp-moved-to-github.git] / src / yaz-cql2rpn.cpp
1 /*
2  * Copyright (c) 1998-2004, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-cql2rpn.cpp,v 1.11 2007-01-12 10:09:25 adam Exp $
6  */
7
8 #include <yaz/log.h>
9 #include <yaz/pquery.h>
10 #include <yazpp/cql2rpn.h>
11
12 using namespace yazpp_1;
13
14 Yaz_cql2rpn::Yaz_cql2rpn()
15 {
16     m_transform = 0;
17 }
18
19 Yaz_cql2rpn::~Yaz_cql2rpn()
20 {
21     if (m_transform)
22         cql_transform_close(m_transform);
23 }
24
25 void Yaz_cql2rpn::set_pqf_file(const char *fname)
26 {
27     if (!m_transform)
28         m_transform = cql_transform_open_fname(fname);
29 }
30
31
32 bool Yaz_cql2rpn::parse_spec_file(const char *fname, int *error)
33 {
34     *error = 0;
35     cql_transform_close(m_transform);
36     m_transform = cql_transform_open_fname(fname);
37     return m_transform ? true : false;
38 }
39
40 int Yaz_cql2rpn::query_transform(const char *cql_query, 
41                                  Z_RPNQuery **rpnquery, ODR o,
42                                  char **addinfop)
43 {
44     const char *addinfo = 0;
45     if (!m_transform)
46         return -3;
47     CQL_parser cp = cql_parser_create();
48
49     int r = cql_parser_string(cp, cql_query);
50     if (r)
51     {
52         yaz_log(YLOG_LOG, "CQL Parse Error");
53         r = 10;
54     }
55     else
56     {
57         char rpn_buf[10240];
58         r = cql_transform_buf(m_transform, cql_parser_result(cp), 
59                               rpn_buf, sizeof(rpn_buf)-1);
60         if (!r)
61         {
62             YAZ_PQF_Parser pp = yaz_pqf_create();
63
64             *rpnquery = yaz_pqf_parse(pp, o, rpn_buf);
65             if (!*rpnquery)
66             {
67                 size_t off;
68                 const char *pqf_msg;
69                 int code = yaz_pqf_error(pp, &pqf_msg, &off);
70                 yaz_log(YLOG_WARN, "PQF Parser Error %s (code %d)",
71                         pqf_msg, code);
72                 r = -1;
73             }
74             yaz_pqf_destroy(pp);
75         }
76         else
77         {
78             r = cql_transform_error(m_transform, &addinfo);
79             yaz_log(YLOG_LOG, "CQL Transform Error %d %s", r,
80                     addinfo ? addinfo : "");
81         }
82     }   
83     cql_parser_destroy(cp);
84     if (addinfo)
85         *addinfop = odr_strdup(o, addinfo);
86     else
87         *addinfop = 0;
88     return r;
89 }
90 /*
91  * Local variables:
92  * c-basic-offset: 4
93  * indent-tabs-mode: nil
94  * End:
95  * vim: shiftwidth=4 tabstop=8 expandtab
96  */
97