From: Adam Dickmeiss Date: Tue, 27 Sep 2005 17:57:50 +0000 (+0000) Subject: Change implementation of Yaz_Z_Query::zquery2pquery to use YAZ' X-Git-Tag: YAZPP.1.0.0~49 X-Git-Url: http://lists.indexdata.dk/?a=commitdiff_plain;h=58ad752713282ff9d9baa1b958f09eaa26c4c822;p=yazpp-moved-to-github.git Change implementation of Yaz_Z_Query::zquery2pquery to use YAZ' wrbuf_put_zquery. Added copy assignment for Yaz_Z_Query. --- diff --git a/include/yaz++/z-query.h b/include/yaz++/z-query.h index 6977b82..33bda9e 100644 --- a/include/yaz++/z-query.h +++ b/include/yaz++/z-query.h @@ -1,8 +1,8 @@ /* - * Copyright (c) 1998-2000, Index Data. + * Copyright (c) 1998-2005, Index Data. * See the file LICENSE for details. * - * $Id: z-query.h,v 1.5 2005-06-25 15:53:19 adam Exp $ + * $Id: z-query.h,v 1.6 2005-09-27 17:57:50 adam Exp $ */ #include @@ -28,16 +28,17 @@ class YAZ_EXPORT Yaz_Z_Query : public Yaz_Query { void print(char *str, int len); /// match query int match(Yaz_Z_Query *other); + /// Copy + Yaz_Z_Query &operator=(const Yaz_Z_Query &); + /// Assign RPN string to it + Yaz_Z_Query& Yaz_Z_Query::operator=(const char *rpn); private: char *m_buf; int m_len; ODR odr_decode; ODR odr_encode; ODR odr_print; - void oid2str(Odr_oid *o, WRBUF buf); - int rpn2pquery(Z_RPNStructure *s, WRBUF buf); WRBUF zquery2pquery(Z_Query *q); - void pr_term(WRBUF wbuf, char *buf, int len); }; }; /* diff --git a/src/Makefile.am b/src/Makefile.am index e56d58a..e429145 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,10 @@ -## $Id: Makefile.am,v 1.27 2005-09-22 12:40:45 adam Exp $ +## $Id: Makefile.am,v 1.28 2005-09-27 17:57:51 adam Exp $ + +check_PROGRAMS = tstquery +noinst_PROGRAMS = yaz-my-server yaz-my-client +bin_SCRIPTS = yaz++-config + +TESTS = $(check_PROGRAMS) AM_CXXFLAGS = -I$(srcdir)/../include $(YAZINC) @@ -15,11 +21,11 @@ libyazcpp_la_SOURCES=socket-observer.cpp pdu-observer.cpp query.cpp \ yaz-z-server-ill.cpp yaz-z-server-update.cpp yaz-z-databases.cpp \ yaz-z-cache.cpp yaz-cql2rpn.cpp gdu.cpp -noinst_PROGRAMS = yaz-my-server yaz-my-client -bin_SCRIPTS = yaz++-config yaz_my_client_SOURCES=yaz-my-client.cpp yaz_my_server_SOURCES=yaz-my-server.cpp yaz-marc-sample.cpp +tstquery_SOURCES=tstquery.cpp + LDADD=libyazcpp.la $(YAZLALIB) diff --git a/src/tstquery.cpp b/src/tstquery.cpp new file mode 100644 index 0000000..a93198a --- /dev/null +++ b/src/tstquery.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1998-2005, Index Data. + * See the file LICENSE for details. + * + * $Id: tstquery.cpp,v 1.1 2005-09-27 17:57:51 adam Exp $ + */ + +#include +#include + +using namespace yazpp_1; + +void tst1(const char *query_str_in, const char *query_expected) +{ + Yaz_Z_Query q; + + q = query_str_in; + + Yaz_Z_Query q2; + + q2 = q; + + char query_str_out[100]; + q2.print(query_str_out, sizeof(query_str_out)-1); + + if (strcmp(query_str_out, query_expected)) + { + fprintf(stderr, "tstquery: query mismatch out=%s expected=%s\n", + query_str_out, query_expected); + exit(1); + } +} + +int main(int argc, char **argv) +{ + tst1("", ""); + tst1("x", "RPN: @attrset Bib-1 x"); + tst1("@and a b", "RPN: @attrset Bib-1 @and a b"); +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ diff --git a/src/yaz-z-query.cpp b/src/yaz-z-query.cpp index b852f9f..f8bb4a4 100644 --- a/src/yaz-z-query.cpp +++ b/src/yaz-z-query.cpp @@ -1,10 +1,11 @@ /* - * Copyright (c) 1998-2003, Index Data. + * Copyright (c) 1998-2005, Index Data. * See the file LICENSE for details. * - * $Id: yaz-z-query.cpp,v 1.17 2005-06-25 15:53:19 adam Exp $ + * $Id: yaz-z-query.cpp,v 1.18 2005-09-27 17:57:51 adam Exp $ */ +#include #include #include @@ -12,44 +13,70 @@ 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); + odr_encode = odr_createmem(ODR_ENCODE); + odr_decode = odr_createmem(ODR_DECODE); + odr_print = odr_createmem(ODR_PRINT); } -int Yaz_Z_Query::set_rpn (const char *rpn) +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)); + 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); + 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)) + 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); + 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)) + odr_reset(odr_encode); + if (!z_Query(odr_encode, &z_query, 0, 0)) return; - m_buf = odr_getbuf (odr_encode, &m_len, 0); + 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); + odr_destroy(odr_encode); + odr_destroy(odr_decode); + odr_destroy(odr_print); } -Z_Query *Yaz_Z_Query::get_Z_Query () +Z_Query *Yaz_Z_Query::get_Z_Query() { Z_Query *query; if (!m_buf) @@ -67,7 +94,7 @@ void Yaz_Z_Query::print(char *str, int len) *str = 0; if (!m_buf) return; - odr_setbuf (odr_decode, m_buf, m_len, 0); + odr_setbuf(odr_decode, m_buf, m_len, 0); if (!z_Query(odr_decode, &query, 0, 0)) return; WRBUF wbuf = zquery2pquery(query); @@ -96,104 +123,13 @@ int Yaz_Z_Query::match(Yaz_Z_Query *other) return 1; } -void Yaz_Z_Query::oid2str(Odr_oid *o, WRBUF buf) -{ - for (; *o >= 0; o++) { - char ibuf[16]; - sprintf(ibuf, "%d", *o); - wrbuf_puts(buf, ibuf); - if (o[1] > 0) - wrbuf_putc(buf, '.'); - } -} - -void Yaz_Z_Query::pr_term(WRBUF wbuf, char *buf, int len) -{ - int i; - wrbuf_putc(wbuf, '"'); - for (i = 0; iwhich == 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_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; - } - return 1; -} - WRBUF Yaz_Z_Query::zquery2pquery(Z_Query *q) { - if (q->which != Z_Query_type_1 && q->which != Z_Query_type_101) - return 0; - WRBUF buf = wrbuf_alloc(); - 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; + WRBUF w = wrbuf_alloc(); + wrbuf_put_zquery(w, q); + return w; } - /* * Local variables: * c-basic-offset: 4