/*
* Copyright (c) 1998-2005, Index Data.
* See the file LICENSE for details.
*
* $Id: yaz-z-query.cpp,v 1.19 2006/03/29 13:14:18 adam Exp $
*/
#include <yaz/logrpn.h>
#include <yazpp/z-query.h>
#include <yaz/pquery.h>
using namespace yazpp_1;
Yaz_Z_Query::Yaz_Z_Query()
{
odr_encode = odr_createmem(ODR_ENCODE);
odr_decode = odr_createmem(ODR_DECODE);
odr_print = odr_createmem(ODR_PRINT);
}
Yaz_Z_Query& Yaz_Z_Query::operator=(const Yaz_Z_Query &p)
{
if (this != &p)
{
odr_reset(odr_encode);
if (!p.m_buf)
{
m_buf = 0;
m_len = 0;
}
else
{
m_len = p.m_len;
m_buf = (char*) odr_malloc(odr_encode, m_len);
memcpy(m_buf, p.m_buf, m_len);
}
}
return *this;
}
Yaz_Z_Query& Yaz_Z_Query::operator=(const char *rpn)
{
set_rpn(rpn);
return *this;
}
int Yaz_Z_Query::set_rpn(const char *rpn)
{
m_buf = 0;
odr_reset(odr_encode);
Z_Query *query = (Z_Query*) odr_malloc(odr_encode, sizeof(*query));
query->which = Z_Query_type_1;
query->u.type_1 = p_query_rpn(odr_encode, PROTO_Z3950, rpn);
if (!query->u.type_1)
return -1;
if (!z_Query(odr_encode, &query, 0, 0))
return -1;
// z_Query(odr_print, &query, 0, 0);
m_buf = odr_getbuf(odr_encode, &m_len, 0);
return m_len;
}
void Yaz_Z_Query::set_Z_Query(Z_Query *z_query)
{
m_buf = 0;
odr_reset(odr_encode);
if (!z_Query(odr_encode, &z_query, 0, 0))
return;
m_buf = odr_getbuf(odr_encode, &m_len, 0);
}
Yaz_Z_Query::~Yaz_Z_Query()
{
odr_destroy(odr_encode);
odr_destroy(odr_decode);
odr_destroy(odr_print);
}
Z_Query *Yaz_Z_Query::get_Z_Query()
{
Z_Query *query;
if (!m_buf)
return 0;
odr_reset(odr_decode);
odr_setbuf(odr_decode, m_buf, m_len, 0);
if (!z_Query(odr_decode, &query, 0, 0))
return 0;
return query;
}
void Yaz_Z_Query::print(char *str, int len)
{
Z_Query *query;
*str = 0;
if (!m_buf)
return;
odr_setbuf(odr_decode, m_buf, m_len, 0);
if (!z_Query(odr_decode, &query, 0, 0))
return;
WRBUF wbuf = zquery2pquery(query);
if (wbuf)
{
if (wrbuf_len(wbuf) > len-1)
{
memcpy(str, wrbuf_buf(wbuf), len-1);
str[len-1] = '\0';
}
else
strcpy(str, wrbuf_buf(wbuf));
wrbuf_free(wbuf,1);
}
odr_reset(odr_decode);
}
int Yaz_Z_Query::match(Yaz_Z_Query *other)
{
if (m_len != other->m_len)
return 0;
if (!m_buf || !other->m_buf)
return 0;
if (memcmp(m_buf, other->m_buf, m_len))
return 0;
return 1;
}
WRBUF Yaz_Z_Query::zquery2pquery(Z_Query *q)
{
WRBUF w = wrbuf_alloc();
wrbuf_put_zquery(w, q);
return w;
}
/*
* Local variables:
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab
*/
syntax highlighted by Code2HTML, v. 0.9.1