X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fyaz-z-query.cpp;h=9dc37810b0b026f04adbb5706977d58155dee842;hb=805b4fdf7b70b0e9b298064f24ceff0c1d38e05b;hp=3fbd3e62897a4df5b355e0beabbbc6044cf4d558;hpb=c6e5ad789740135af3558298f6e2014ae99ee7dd;p=yazpp-moved-to-github.git diff --git a/src/yaz-z-query.cpp b/src/yaz-z-query.cpp index 3fbd3e6..9dc3781 100644 --- a/src/yaz-z-query.cpp +++ b/src/yaz-z-query.cpp @@ -1,68 +1,161 @@ -/* - * Copyright (c) 1998-1999, Index Data. +/* This file is part of the yazpp toolkit. + * Copyright (C) 1998-2013 Index Data and Mike Taylor * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: yaz-z-query.cpp,v $ - * Revision 1.2 1999-04-09 11:46:57 adam - * Added object Yaz_Z_Assoc. Much more functional client. - * - * Revision 1.1 1999/03/23 14:17:57 adam - * More work on timeout handling. Work on yaz-client. - * */ -#include -#include +#if HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include + +using namespace yazpp_1; + +class Yaz_Z_Query::Rep { + friend class Yaz_Z_Query; + char *buf; + int len; + ODR odr_decode; + ODR odr_encode; + ODR odr_print; +}; + Yaz_Z_Query::Yaz_Z_Query() { - odr_encode = odr_createmem (ODR_ENCODE); - odr_decode = odr_createmem (ODR_DECODE); + m_p = new Rep; + m_p->odr_encode = odr_createmem(ODR_ENCODE); + m_p->odr_decode = odr_createmem(ODR_DECODE); + m_p->odr_print = odr_createmem(ODR_PRINT); + m_p->len = 0; + m_p->buf = 0; +} + + +Yaz_Z_Query::Yaz_Z_Query(const Yaz_Z_Query &q) +{ + m_p = new Rep; + + m_p->odr_encode = odr_createmem(ODR_ENCODE); + m_p->odr_decode = odr_createmem(ODR_DECODE); + m_p->odr_print = odr_createmem(ODR_PRINT); + + m_p->len = q.m_p->len; + m_p->buf = (char*) odr_malloc(m_p->odr_encode, m_p->len); + memcpy(m_p->buf, q.m_p->buf, m_p->len); } -int Yaz_Z_Query::set_rpn (const char *rpn) +Yaz_Z_Query& Yaz_Z_Query::operator=(const Yaz_Z_Query &q) { - buf = 0; - odr_reset (odr_encode); - Z_Query *query = (Z_Query*) odr_malloc (odr_encode, sizeof(*query)); + if (this != &q) + { + odr_reset(m_p->odr_encode); + if (!q.m_p->buf) + { + m_p->buf = 0; + m_p->len = 0; + } + else + { + m_p->len = q.m_p->len; + m_p->buf = (char*) odr_malloc(m_p->odr_encode, m_p->len); + memcpy(m_p->buf, q.m_p->buf, m_p->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_p->buf = 0; + odr_reset(m_p->odr_encode); + Z_Query *query = (Z_Query*) odr_malloc(m_p->odr_encode, sizeof(*query)); query->which = Z_Query_type_1; - query->u.type_1 = p_query_rpn (odr_encode, PROTO_Z3950, rpn); + query->u.type_1 = p_query_rpn(m_p->odr_encode, rpn); if (!query->u.type_1) - return -1; - if (!z_Query (odr_encode, &query, 0)) - return -1; - buf = odr_getbuf (odr_encode, &len, 0); - return len; + return -1; + if (!z_Query(m_p->odr_encode, &query, 0, 0)) + return -1; + m_p->buf = odr_getbuf(m_p->odr_encode, &m_p->len, 0); + return m_p->len; } void Yaz_Z_Query::set_Z_Query(Z_Query *z_query) { - buf = 0; - odr_reset (odr_encode); - if (!z_Query (odr_encode, &z_query, 0)) - return; - buf = odr_getbuf (odr_encode, &len, 0); + m_p->buf = 0; + odr_reset(m_p->odr_encode); + if (!z_Query(m_p->odr_encode, &z_query, 0, 0)) + return; + m_p->buf = odr_getbuf(m_p->odr_encode, &m_p->len, 0); } Yaz_Z_Query::~Yaz_Z_Query() { - odr_destroy (odr_encode); - odr_destroy (odr_decode); + odr_destroy(m_p->odr_encode); + odr_destroy(m_p->odr_decode); + odr_destroy(m_p->odr_print); + delete m_p; } -Z_Query *Yaz_Z_Query::get_Z_Query () +Z_Query *Yaz_Z_Query::get_Z_Query() { Z_Query *query; - if (!buf) - return 0; - odr_setbuf (odr_decode, buf, len, 0); - if (!z_Query(odr_decode, &query, 0)) - return 0; + if (!m_p->buf) + return 0; + odr_reset(m_p->odr_decode); + odr_setbuf(m_p->odr_decode, m_p->buf, m_p->len, 0); + if (!z_Query(m_p->odr_decode, &query, 0, 0)) + return 0; return query; } -void Yaz_Z_Query::print(char *str, int len) +void Yaz_Z_Query::print(char *str, size_t len) { + Z_Query *query; + *str = 0; + if (!m_p->buf) + return; + odr_setbuf(m_p->odr_decode, m_p->buf, m_p->len, 0); + if (!z_Query(m_p->odr_decode, &query, 0, 0)) + return; + WRBUF wbuf = wrbuf_alloc(); + yaz_query_to_wrbuf(wbuf, query); + if (wrbuf_len(wbuf) > len-1) + { + memcpy(str, wrbuf_buf(wbuf), len-1); + str[len-1] = '\0'; + } + else + strcpy(str, wrbuf_cstr(wbuf)); + wrbuf_destroy(wbuf); + odr_reset(m_p->odr_decode); +} +int Yaz_Z_Query::match(const Yaz_Z_Query *other) +{ + if (m_p->len != other->m_p->len) + return 0; + if (!m_p->buf || !other->m_p->buf) + return 0; + if (memcmp(m_p->buf, other->m_p->buf, m_p->len)) + return 0; + return 1; } + +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +