Change implementation of Yaz_Z_Query::zquery2pquery to use YAZ'
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 27 Sep 2005 17:57:50 +0000 (17:57 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 27 Sep 2005 17:57:50 +0000 (17:57 +0000)
wrbuf_put_zquery. Added copy assignment for Yaz_Z_Query.

include/yaz++/z-query.h
src/Makefile.am
src/tstquery.cpp [new file with mode: 0644]
src/yaz-z-query.cpp

index 6977b82..33bda9e 100644 (file)
@@ -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 <yaz/proto.h>
@@ -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);
 };
 };
 /*
index e56d58a..e429145 100644 (file)
@@ -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 (file)
index 0000000..a93198a
--- /dev/null
@@ -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 <stdlib.h>
+#include <yaz++/z-query.h>
+
+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
+ */
index b852f9f..f8bb4a4 100644 (file)
@@ -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 <yaz/logrpn.h>
 #include <yaz++/z-query.h>
 #include <yaz/pquery.h>
 
@@ -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; i<len; i++)
-    {
-        int ch = buf[i];
-        if (ch == '"')
-            wrbuf_putc(wbuf, '\\');
-        wrbuf_putc(wbuf, ch);
-    }
-    wrbuf_puts(wbuf, "\" ");
-}
-
-int Yaz_Z_Query::rpn2pquery(Z_RPNStructure *s, WRBUF buf)
-{
-    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_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