d0276408bd369fe7db9317c629dea5e017311ff5
[yazpp-moved-to-github.git] / src / yaz-z-query.cpp
1 /*
2  * Copyright (c) 1998-2005, Index Data.
3  * See the file LICENSE for details.
4  * 
5  * $Id: yaz-z-query.cpp,v 1.19 2006-03-29 13:14:18 adam Exp $
6  */
7
8 #include <yaz/logrpn.h>
9 #include <yazpp/z-query.h>
10 #include <yaz/pquery.h>
11
12 using namespace yazpp_1;
13
14 Yaz_Z_Query::Yaz_Z_Query()
15 {
16     odr_encode = odr_createmem(ODR_ENCODE);
17     odr_decode = odr_createmem(ODR_DECODE);
18     odr_print = odr_createmem(ODR_PRINT);
19 }
20
21 Yaz_Z_Query& Yaz_Z_Query::operator=(const Yaz_Z_Query &p)
22 {
23     if (this != &p)
24     {
25         odr_reset(odr_encode);
26         if (!p.m_buf)
27         {
28             m_buf = 0;
29             m_len = 0;
30         }
31         else
32         {
33             m_len = p.m_len;
34             m_buf = (char*) odr_malloc(odr_encode, m_len);
35             memcpy(m_buf, p.m_buf, m_len);
36         }
37     }
38     return *this;
39 }
40
41 Yaz_Z_Query& Yaz_Z_Query::operator=(const char *rpn)
42 {
43     set_rpn(rpn);
44     return *this;
45 }
46
47 int Yaz_Z_Query::set_rpn(const char *rpn)
48 {
49     m_buf = 0;
50     odr_reset(odr_encode);
51     Z_Query *query = (Z_Query*) odr_malloc(odr_encode, sizeof(*query));
52     query->which = Z_Query_type_1;
53     query->u.type_1 = p_query_rpn(odr_encode, PROTO_Z3950, rpn);
54     if (!query->u.type_1)
55         return -1;
56     if (!z_Query(odr_encode, &query, 0, 0))
57         return -1;
58     // z_Query(odr_print, &query, 0, 0);
59     m_buf = odr_getbuf(odr_encode, &m_len, 0);
60     return m_len;
61 }
62
63 void Yaz_Z_Query::set_Z_Query(Z_Query *z_query)
64 {
65     m_buf = 0;
66     odr_reset(odr_encode);
67     if (!z_Query(odr_encode, &z_query, 0, 0))
68         return;
69     m_buf = odr_getbuf(odr_encode, &m_len, 0);
70 }
71
72 Yaz_Z_Query::~Yaz_Z_Query()
73 {
74     odr_destroy(odr_encode);
75     odr_destroy(odr_decode);
76     odr_destroy(odr_print);
77 }
78
79 Z_Query *Yaz_Z_Query::get_Z_Query()
80 {
81     Z_Query *query;
82     if (!m_buf)
83         return 0;
84     odr_reset(odr_decode);
85     odr_setbuf(odr_decode, m_buf, m_len, 0);
86     if (!z_Query(odr_decode, &query, 0, 0))
87         return 0;
88     return query;
89 }
90
91 void Yaz_Z_Query::print(char *str, int len)
92 {
93     Z_Query *query;
94     *str = 0;
95     if (!m_buf)
96         return;
97     odr_setbuf(odr_decode, m_buf, m_len, 0);
98     if (!z_Query(odr_decode, &query, 0, 0))
99         return;
100     WRBUF wbuf = zquery2pquery(query);
101     if (wbuf)
102     {
103         if (wrbuf_len(wbuf) > len-1)
104         {
105             memcpy(str, wrbuf_buf(wbuf), len-1);
106             str[len-1] = '\0';
107         }
108         else
109             strcpy(str, wrbuf_buf(wbuf));
110         wrbuf_free(wbuf,1);
111     }
112     odr_reset(odr_decode);
113 }
114
115 int Yaz_Z_Query::match(Yaz_Z_Query *other)
116 {
117     if (m_len != other->m_len)
118         return 0;
119     if (!m_buf || !other->m_buf)
120         return 0;
121     if (memcmp(m_buf, other->m_buf, m_len))
122         return 0;
123     return 1;
124 }
125
126 WRBUF Yaz_Z_Query::zquery2pquery(Z_Query *q)
127 {
128     WRBUF w = wrbuf_alloc();
129     wrbuf_put_zquery(w, q);
130     return w;
131 }
132
133 /*
134  * Local variables:
135  * c-basic-offset: 4
136  * indent-tabs-mode: nil
137  * End:
138  * vim: shiftwidth=4 tabstop=8 expandtab
139  */
140