X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-z-query.cpp;h=5e8ba845b75501d7a4ad62771657a28e75c7a5ea;hp=16c3fb483902f98dcedb6d45d54081c1cecbca32;hb=d84b43231c7c5b0786e9aa62d0f7ca7ecd83bdb5;hpb=5c45ffbb2b430a6f41277c303a5e9b94242dab96 diff --git a/src/yaz-z-query.cpp b/src/yaz-z-query.cpp index 16c3fb4..5e8ba84 100644 --- a/src/yaz-z-query.cpp +++ b/src/yaz-z-query.cpp @@ -1,27 +1,12 @@ /* - * Copyright (c) 1998-1999, Index Data. + * Copyright (c) 1998-2003, Index Data. * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * - * $Log: yaz-z-query.cpp,v $ - * Revision 1.4 1999-04-21 12:09:01 adam - * Many improvements. Modified to proxy server to work with "sessions" - * based on cookies. - * - * Revision 1.3 1999/04/20 10:30:05 adam - * Implemented various stuff for client and proxy. Updated calls - * to ODR to reflect new name parameter. - * - * 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. - * + * $Id: yaz-z-query.cpp,v 1.15 2003-12-20 22:42:53 adam Exp $ */ -#include -#include +#include +#include Yaz_Z_Query::Yaz_Z_Query() { @@ -32,7 +17,7 @@ Yaz_Z_Query::Yaz_Z_Query() int Yaz_Z_Query::set_rpn (const char *rpn) { - buf = 0; + m_buf = 0; odr_reset (odr_encode); Z_Query *query = (Z_Query*) odr_malloc (odr_encode, sizeof(*query)); query->which = Z_Query_type_1; @@ -41,18 +26,18 @@ int Yaz_Z_Query::set_rpn (const char *rpn) return -1; if (!z_Query (odr_encode, &query, 0, 0)) return -1; - z_Query(odr_print, &query, 0, 0); - buf = odr_getbuf (odr_encode, &len, 0); - return len; + // 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) { - buf = 0; + m_buf = 0; odr_reset (odr_encode); if (!z_Query (odr_encode, &z_query, 0, 0)) return; - buf = odr_getbuf (odr_encode, &len, 0); + m_buf = odr_getbuf (odr_encode, &m_len, 0); } Yaz_Z_Query::~Yaz_Z_Query() @@ -65,9 +50,10 @@ Yaz_Z_Query::~Yaz_Z_Query() Z_Query *Yaz_Z_Query::get_Z_Query () { Z_Query *query; - if (!buf) + if (!m_buf) return 0; - odr_setbuf (odr_decode, buf, len, 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; @@ -75,5 +61,134 @@ Z_Query *Yaz_Z_Query::get_Z_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; +} + +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; +} + +