The upgrade to automake 1.8/1.9 causes the product dist to be called
[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.9 2006-03-29 13:14:15 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 int Yaz_cql2rpn::query_transform(const char *cql_query, 
32                                  Z_RPNQuery **rpnquery, ODR o,
33                                  char **addinfop)
34 {
35     const char *addinfo = 0;
36     if (!m_transform)
37         return -3;
38     CQL_parser cp = cql_parser_create();
39
40     int r = cql_parser_string(cp, cql_query);
41     if (r)
42     {
43         yaz_log(YLOG_LOG, "CQL Parse Error");
44         r = 10;
45     }
46     else
47     {
48         char rpn_buf[1024];
49         r = cql_transform_buf(m_transform, cql_parser_result(cp), 
50                               rpn_buf, sizeof(rpn_buf)-1);
51         if (!r)
52         {
53             YAZ_PQF_Parser pp = yaz_pqf_create();
54
55             *rpnquery = yaz_pqf_parse(pp, o, rpn_buf);
56             if (!*rpnquery)
57             {
58                 size_t off;
59                 const char *pqf_msg;
60                 int code = yaz_pqf_error(pp, &pqf_msg, &off);
61                 yaz_log(YLOG_WARN, "PQF Parser Error %s (code %d)",
62                         pqf_msg, code);
63                 r = -1;
64             }
65             yaz_pqf_destroy(pp);
66         }
67         else
68         {
69             r = cql_transform_error(m_transform, &addinfo);
70             yaz_log(YLOG_LOG, "CQL Transform Error %d %s", r,
71                     addinfo ? addinfo : "");
72         }
73     }   
74     cql_parser_destroy(cp);
75     if (addinfo)
76         *addinfop = odr_strdup(o, addinfo);
77     else
78         *addinfop = 0;
79     return r;
80 }
81 /*
82  * Local variables:
83  * c-basic-offset: 4
84  * indent-tabs-mode: nil
85  * End:
86  * vim: shiftwidth=4 tabstop=8 expandtab
87  */
88