Fix split_zurl bug (missing char after /).
[metaproxy-moved-to-github.git] / src / util.cpp
index a6b57be..97b1125 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2011 Index Data
+   Copyright (C) 2005-2012 Index Data
 
 Metaproxy is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -20,10 +20,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <metaproxy/util.hpp>
 
 #include <yaz/odr.h>
+#include <yaz/comstack.h>
 #include <yaz/pquery.h>
 #include <yaz/otherinfo.h>
 #include <yaz/querytowrbuf.h>
 #include <yaz/oid_db.h>
+#include <yaz/srw.h>
 
 #include <iostream>
 
@@ -188,6 +190,18 @@ void mp_util::piggyback_sr(Z_SearchRequest *sreq,
               element_set_name);
 }
 
+void mp_util::piggyback(int smallSetUpperBound,
+                        int largeSetLowerBound,
+                        int mediumSetPresentNumber,
+                        int result_set_size,
+                        int &number_to_present)
+{
+    Odr_int tmp = number_to_present;
+    piggyback(smallSetUpperBound, largeSetLowerBound, mediumSetPresentNumber,
+              0, 0, result_set_size, tmp, 0);
+    number_to_present = tmp;
+}
+
 void mp_util::piggyback(Odr_int smallSetUpperBound,
                         Odr_int largeSetLowerBound,
                         Odr_int mediumSetPresentNumber,
@@ -249,22 +263,19 @@ std::string mp_util::zQueryToString(Z_Query *query)
 {
     std::string query_str = "";
 
-    if (query && query->which == Z_Query_type_1){
+    if (query && query->which == Z_Query_type_1)
+    {
         Z_RPNQuery *rpn = query->u.type_1;
         
-        if (rpn){
-            
-            // allocate wrbuf (strings in YAZ!)
-            WRBUF w = wrbuf_alloc();
+        if (rpn)
+        {
+            mp::wrbuf w;
             
             // put query in w
             yaz_rpnquery_to_wrbuf(w, rpn);
             
             // from w to std::string
-            query_str = std::string(wrbuf_buf(w), wrbuf_len(w));
-            
-            // destroy wrbuf
-            wrbuf_destroy(w);
+            query_str = std::string(w.buf(), w.len());
         }
     }
 
@@ -396,14 +407,15 @@ void mp_util::split_zurl(std::string zurl, std::string &host,
                          std::list<std::string> &db)
 {
     const char *zurl_cstr = zurl.c_str();
-    const char *sep = strchr(zurl_cstr, '/');
-    
-    if (sep)
-    {
-        host = std::string(zurl_cstr, sep - zurl_cstr);
+    const char *args = 0;
+    cs_get_host_args(zurl_cstr, &args);
+
+    if (args && *args)
+    { 
+        host = std::string(zurl_cstr, args - zurl_cstr);
 
-        const char *cp1 = sep+1;
-        while(1)
+        const char *cp1 = args;
+        while (1)
         {
             const char *cp2 = strchr(cp1, '+');
             if (cp2)
@@ -417,9 +429,7 @@ void mp_util::split_zurl(std::string zurl, std::string &host,
         }
     }
     else
-    {
         host = zurl;
-    }
 }
 
 bool mp_util::set_databases_from_zurl(
@@ -672,6 +682,50 @@ Z_ReferenceId **mp_util::get_referenceId(const Z_APDU *apdu)
     return 0;
 }
 
+std::string mp_util::uri_encode(std::string s)
+{
+    char *x = (char *) xmalloc(1 + s.length() * 3);
+    yaz_encode_uri_component(x, s.c_str());
+    std::string result(x);
+    xfree(x);
+    return result;
+}
+
+
+std::string mp_util::uri_decode(std::string s)
+{
+    char *x = (char *) xmalloc(1 + s.length());
+    yaz_decode_uri_component(x, s.c_str(), s.length());
+    std::string result(x);
+    xfree(x);
+    return result;
+}
+
+mp::wrbuf::wrbuf()
+{
+    m_wrbuf = wrbuf_alloc();
+}
+
+mp::wrbuf::~wrbuf()
+{
+    wrbuf_destroy(m_wrbuf);
+}
+
+mp::wrbuf::operator WRBUF() const
+{
+    return m_wrbuf;
+}
+
+size_t mp::wrbuf::len()
+{
+    return wrbuf_len(m_wrbuf);
+}
+
+const char *mp::wrbuf::buf()
+{
+    return wrbuf_buf(m_wrbuf);
+}
+
 
 /*
  * Local variables: