WRBUF updates
[yazpp-moved-to-github.git] / src / yaz-z-query.cpp
index c375ea6..85d496a 100644 (file)
 /*
- * Copyright (c) 1998-1999, Index Data.
+ * Copyright (c) 1998-2007, Index Data.
  * See the file LICENSE for details.
- * Sebastian Hammer, Adam Dickmeiss
  * 
- * $Log: yaz-z-query.cpp,v $
- * Revision 1.5  1999-04-27 07:52:13  adam
- * Improved proxy; added query match for result set re-use.
- *
- * 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.21 2007-03-20 07:54:11 adam Exp $
  */
 
-#include <yaz-z-query.h>
-#include <pquery.h>
+#include <yaz/querytowrbuf.h>
+#include <yazpp/z-query.h>
+#include <yaz/pquery.h>
+#include <assert.h>
+
+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);
+}
+
+
+Yaz_Z_Query::Yaz_Z_Query(const Yaz_Z_Query &q)
+{
+    odr_encode = odr_createmem(ODR_ENCODE);
+    odr_decode = odr_createmem(ODR_DECODE);
+    odr_print = odr_createmem(ODR_PRINT);
+
+    m_len = q.m_len;
+    m_buf = (char*) odr_malloc(odr_encode, m_len);
+    memcpy(m_buf, q.m_buf, m_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(odr_encode);
+        if (!q.m_buf)
+        {
+            m_buf = 0;
+            m_len = 0;
+        }
+        else
+        {
+            m_len = q.m_len;
+            m_buf = (char*) odr_malloc(odr_encode, m_len);
+            memcpy(m_buf, q.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));
     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))
-       return -1;
-    z_Query(odr_print, &query, 0, 0);
-    buf = odr_getbuf (odr_encode, &len, 0);
-    return len;
+        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)
 {
-    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 = 0;
+    odr_reset(odr_encode);
+    if (!z_Query(odr_encode, &z_query, 0, 0))
+        return;
+    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 (!buf)
-       return 0;
-    odr_setbuf (odr_decode, buf, len, 0);
+    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 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_buf)
+        return;
+    odr_setbuf(odr_decode, m_buf, m_len, 0);
+    if (!z_Query(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(odr_decode);
 }
 
-int Yaz_Z_Query::match(Yaz_Z_Query *other)
+int Yaz_Z_Query::match(const Yaz_Z_Query *other)
 {
-    if (len != other->len)
-       return 0;
-    if (!buf || !other->buf)
-       return 0;
-    if (memcmp(buf, other->buf, len))
-       return 0;
+    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;
 }
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+