1 /* This file is part of the yazpp toolkit.
2 * Copyright (C) 1998-2012 Index Data and Mike Taylor
3 * See the file LICENSE for details.
9 #include <yaz/querytowrbuf.h>
10 #include <yazpp/z-query.h>
11 #include <yaz/pquery.h>
14 using namespace yazpp_1;
16 class Yaz_Z_Query::Rep {
17 friend class Yaz_Z_Query;
26 Yaz_Z_Query::Yaz_Z_Query()
29 m_p->odr_encode = odr_createmem(ODR_ENCODE);
30 m_p->odr_decode = odr_createmem(ODR_DECODE);
31 m_p->odr_print = odr_createmem(ODR_PRINT);
37 Yaz_Z_Query::Yaz_Z_Query(const Yaz_Z_Query &q)
41 m_p->odr_encode = odr_createmem(ODR_ENCODE);
42 m_p->odr_decode = odr_createmem(ODR_DECODE);
43 m_p->odr_print = odr_createmem(ODR_PRINT);
45 m_p->len = q.m_p->len;
46 m_p->buf = (char*) odr_malloc(m_p->odr_encode, m_p->len);
47 memcpy(m_p->buf, q.m_p->buf, m_p->len);
50 Yaz_Z_Query& Yaz_Z_Query::operator=(const Yaz_Z_Query &q)
54 odr_reset(m_p->odr_encode);
62 m_p->len = q.m_p->len;
63 m_p->buf = (char*) odr_malloc(m_p->odr_encode, m_p->len);
64 memcpy(m_p->buf, q.m_p->buf, m_p->len);
70 Yaz_Z_Query& Yaz_Z_Query::operator=(const char *rpn)
76 int Yaz_Z_Query::set_rpn(const char *rpn)
79 odr_reset(m_p->odr_encode);
80 Z_Query *query = (Z_Query*) odr_malloc(m_p->odr_encode, sizeof(*query));
81 query->which = Z_Query_type_1;
82 query->u.type_1 = p_query_rpn(m_p->odr_encode, rpn);
85 if (!z_Query(m_p->odr_encode, &query, 0, 0))
87 m_p->buf = odr_getbuf(m_p->odr_encode, &m_p->len, 0);
91 void Yaz_Z_Query::set_Z_Query(Z_Query *z_query)
94 odr_reset(m_p->odr_encode);
95 if (!z_Query(m_p->odr_encode, &z_query, 0, 0))
97 m_p->buf = odr_getbuf(m_p->odr_encode, &m_p->len, 0);
100 Yaz_Z_Query::~Yaz_Z_Query()
102 odr_destroy(m_p->odr_encode);
103 odr_destroy(m_p->odr_decode);
104 odr_destroy(m_p->odr_print);
108 Z_Query *Yaz_Z_Query::get_Z_Query()
113 odr_reset(m_p->odr_decode);
114 odr_setbuf(m_p->odr_decode, m_p->buf, m_p->len, 0);
115 if (!z_Query(m_p->odr_decode, &query, 0, 0))
120 void Yaz_Z_Query::print(char *str, size_t len)
126 odr_setbuf(m_p->odr_decode, m_p->buf, m_p->len, 0);
127 if (!z_Query(m_p->odr_decode, &query, 0, 0))
129 WRBUF wbuf = wrbuf_alloc();
130 yaz_query_to_wrbuf(wbuf, query);
131 if (wrbuf_len(wbuf) > len-1)
133 memcpy(str, wrbuf_buf(wbuf), len-1);
137 strcpy(str, wrbuf_cstr(wbuf));
139 odr_reset(m_p->odr_decode);
142 int Yaz_Z_Query::match(const Yaz_Z_Query *other)
144 if (m_p->len != other->m_p->len)
146 if (!m_p->buf || !other->m_p->buf)
148 if (memcmp(m_p->buf, other->m_p->buf, m_p->len))
156 * c-file-style: "Stroustrup"
157 * indent-tabs-mode: nil
159 * vim: shiftwidth=4 tabstop=8 expandtab