X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-z-query.cpp;h=b71381b50a8e871e416e6f6b6b56bc5e1effd5d7;hp=1f178cc42349e4efe805055e6dda6ea455cf3495;hb=HEAD;hpb=307a8638d6429b0f77ad762d52309c550e45648c diff --git a/src/yaz-z-query.cpp b/src/yaz-z-query.cpp index 1f178cc..b71381b 100644 --- a/src/yaz-z-query.cpp +++ b/src/yaz-z-query.cpp @@ -1,195 +1,161 @@ -/* - * Copyright (c) 1998-2003, Index Data. +/* This file is part of the yazpp toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: yaz-z-query.cpp,v 1.14 2003-12-16 14:17:01 adam Exp $ */ -#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); - odr_print = odr_createmem (ODR_PRINT); + 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; } -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) +Yaz_Z_Query::Yaz_Z_Query(const Yaz_Z_Query &q) { - 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); + 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); } -Yaz_Z_Query::~Yaz_Z_Query() +Yaz_Z_Query& Yaz_Z_Query::operator=(const Yaz_Z_Query &q) { - odr_destroy (odr_encode); - odr_destroy (odr_decode); - odr_destroy (odr_print); + 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; } -Z_Query *Yaz_Z_Query::get_Z_Query () +Yaz_Z_Query& Yaz_Z_Query::operator=(const char *rpn) { - 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; + set_rpn(rpn); + return *this; } -void Yaz_Z_Query::print(char *str, int len) +int Yaz_Z_Query::set_rpn(const char *rpn) { - 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); + 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(m_p->odr_encode, rpn); + if (!query->u.type_1) + 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; } -int Yaz_Z_Query::match(Yaz_Z_Query *other) +void Yaz_Z_Query::set_Z_Query(Z_Query *z_query) { - 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; + 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); } -void Yaz_Z_Query::oid2str(Odr_oid *o, WRBUF buf) +Yaz_Z_Query::~Yaz_Z_Query() { - for (; *o >= 0; o++) { - char ibuf[16]; - sprintf(ibuf, "%d", *o); - wrbuf_puts(buf, ibuf); - if (o[1] > 0) - wrbuf_putc(buf, '.'); - } + odr_destroy(m_p->odr_encode); + odr_destroy(m_p->odr_decode); + odr_destroy(m_p->odr_print); + delete m_p; } -void Yaz_Z_Query::pr_term(WRBUF wbuf, char *buf, int len) +Z_Query *Yaz_Z_Query::get_Z_Query() { - int i; - wrbuf_putc(wbuf, '"'); - for (i = 0; ibuf) + 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; } -int Yaz_Z_Query::rpn2pquery(Z_RPNStructure *s, WRBUF buf) +void Yaz_Z_Query::print(char *str, size_t len) { - if (s->which == Z_RPNStructure_simple) - { - Z_Operand *o = s->u.simple; - - if (o->which == Z_Operand_APT) - { - Z_AttributesPlusTerm *at = s->u.simple->u.attributesPlusTerm; - if (at->attributes) { - int i; - for (i = 0; i < at->attributes->num_attributes; i++) { - wrbuf_puts(buf, "@attr "); - if (at->attributes->attributes[i]->attributeSet) { - oid2str(at->attributes->attributes[i]->attributeSet, buf); - wrbuf_putc(buf, ' '); - } - wrbuf_printf(buf, "%d=", *at->attributes->attributes[i]->attributeType); - wrbuf_printf(buf, "%d ", *at->attributes->attributes[i]->value.numeric); - } - } - if (at->term->which == Z_Term_general) - { - pr_term(buf, (char*) at->term->u.general->buf, - at->term->u.general->len); - } - else if (at->term->which == Z_Term_characterString) - { - wrbuf_puts(buf, "@term string "); - pr_term(buf, at->term->u.characterString, - strlen(at->term->u.characterString)); - - } - } - else if (o->which == Z_Operand_resultSetId) - { - wrbuf_printf(buf, "@set %s ", o->u.resultSetId); - } - } - else if (s->which == Z_RPNStructure_complex) + 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) { - Z_Complex *c = s->u.complex; - - switch (c->roperator->which) { - case Z_Operator_and: wrbuf_puts(buf, "@and "); break; - case Z_Operator_or: wrbuf_puts(buf, "@or "); break; - case Z_Operator_and_not: wrbuf_puts(buf, "@not "); break; - case Z_Operator_prox: wrbuf_puts(buf, "@prox "); break; - default: wrbuf_puts(buf, "@unknown "); - } - if (!rpn2pquery(c->s1, buf)) - return 0; - if (!rpn2pquery(c->s2, buf)) - return 0; + memcpy(str, wrbuf_buf(wbuf), len-1); + str[len-1] = '\0'; } - return 1; + else + strcpy(str, wrbuf_cstr(wbuf)); + wrbuf_destroy(wbuf); + odr_reset(m_p->odr_decode); } -WRBUF Yaz_Z_Query::zquery2pquery(Z_Query *q) +int Yaz_Z_Query::match(const Yaz_Z_Query *other) { - WRBUF buf = wrbuf_alloc(); - - if (q->which != Z_Query_type_1 && q->which != Z_Query_type_101) - return 0; - if (q->u.type_1->attributeSetId) { - /* Output attribute set ID */ - wrbuf_puts(buf, "@attrset "); - oid2str(q->u.type_1->attributeSetId, buf); - wrbuf_putc(buf, ' '); - } - return rpn2pquery(q->u.type_1->RPNStructure, buf) ? buf : 0; + 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 + */