Updates for yaz/ylog.h
[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.5 2004-11-30 21:10:30 adam Exp $
6  */
7
8 #include <yaz/ylog.h>
9 #include <yaz/pquery.h>
10 #include <yaz++/cql2rpn.h>
11
12 Yaz_cql2rpn::Yaz_cql2rpn()
13 {
14     m_transform = 0;
15 }
16
17 Yaz_cql2rpn::~Yaz_cql2rpn()
18 {
19     if (m_transform)
20         cql_transform_close(m_transform);
21 }
22
23 void Yaz_cql2rpn::set_pqf_file(const char *fname)
24 {
25     if (!m_transform)
26         m_transform = cql_transform_open_fname(fname);
27 }
28
29 int Yaz_cql2rpn::query_transform(const char *cql_query, 
30                                  Z_RPNQuery **rpnquery, ODR o,
31                                  char **addinfop)
32 {
33     const char *addinfo = 0;
34     if (!m_transform)
35         return -3;
36     CQL_parser cp = cql_parser_create();
37
38     int r = cql_parser_string(cp, cql_query);
39     if (r)
40     {
41         yaz_log(YLOG_LOG, "CQL Parse Error");
42         r = 10;
43     }
44     else
45     {
46         char rpn_buf[1024];
47         r = cql_transform_buf(m_transform, cql_parser_result(cp), 
48                               rpn_buf, sizeof(rpn_buf)-1);
49         if (!r)
50         {
51             YAZ_PQF_Parser pp = yaz_pqf_create();
52
53             *rpnquery = yaz_pqf_parse(pp, o, rpn_buf);
54             if (!*rpnquery)
55             {
56                 size_t off;
57                 const char *pqf_msg;
58                 int code = yaz_pqf_error(pp, &pqf_msg, &off);
59                 yaz_log(YLOG_WARN, "PQF Parser Error %s (code %d)",
60                         pqf_msg, code);
61                 r = -1;
62             }
63             yaz_pqf_destroy(pp);
64         }
65         else
66         {
67             r = cql_transform_error(m_transform, &addinfo);
68             yaz_log(YLOG_LOG, "CQL Transform Error %d %s", r,
69                     addinfo ? addinfo : "");
70         }
71     }   
72     cql_parser_destroy(cp);
73     if (addinfo)
74         *addinfop = odr_strdup(o, addinfo);
75     else
76         *addinfop = 0;
77     return r;
78 }