Work on session_shared - scan support, better error handling, Z39.50
[metaproxy-moved-to-github.git] / src / util.cpp
index 4570c31..2cc2759 100644 (file)
@@ -1,7 +1,7 @@
-/* $Id: util.cpp,v 1.13 2006-01-20 22:38:12 marc Exp $
-   Copyright (c) 2005, Index Data.
+/* $Id: util.cpp,v 1.18 2006-06-19 23:54:02 adam Exp $
+   Copyright (c) 2005-2006, Index Data.
 
-%LICENSE%
+   See the LICENSE file for details
  */
 
 #include "config.hpp"
 
 //#include <iostream>
 
-void yp2::util::piggyback(int smallSetUpperBound,
-                          int largeSetLowerBound,
-                          int mediumSetPresentNumber,
-                          int result_set_size,
-                          int &number_to_present)
+namespace mp = metaproxy_1;
+
+// Doxygen doesn't like mp::util, so we use this instead
+namespace mp_util = metaproxy_1::util;
+
+int mp_util::memcmp2(const void *buf1, int len1,
+                     const void *buf2, int len2)
+{
+    int d = len1 - len2;
+
+    // compare buffer (common length)
+    int c = memcmp(buf1, buf2, d > 0 ? len2 : len1);
+    if (c > 0)
+        return 1;
+    else if (c < 0)
+        return -1;
+    
+    // compare (remaining bytes)
+    if (d > 0)
+        return 1;
+    else if (d < 0)
+        return -1;
+    return 0;
+}
+
+
+std::string mp_util::database_name_normalize(const std::string &s)
+{
+    std::string r = s;
+    size_t i;
+    for (i = 0; i < r.length(); i++)
+    {
+        int ch = r[i];
+        if (ch >= 'A' && ch <= 'Z')
+            r[i] = ch + 'a' - 'A';
+    }
+    return r;
+
+}
+
+void mp_util::piggyback(int smallSetUpperBound,
+                                  int largeSetLowerBound,
+                                  int mediumSetPresentNumber,
+                                  int result_set_size,
+                                  int &number_to_present)
 {
     // deal with piggyback
 
@@ -42,7 +82,8 @@ void yp2::util::piggyback(int smallSetUpperBound,
 }
 
 
-bool yp2::util::pqf(ODR odr, Z_APDU *apdu, const std::string &q) {
+bool mp_util::pqf(ODR odr, Z_APDU *apdu, const std::string &q)
+{
     YAZ_PQF_Parser pqf_parser = yaz_pqf_create();
     
     Z_RPNQuery *rpn = yaz_pqf_parse(pqf_parser, odr, q.c_str());
@@ -61,7 +102,7 @@ bool yp2::util::pqf(ODR odr, Z_APDU *apdu, const std::string &q) {
 }
 
 
-std::string yp2::util::zQueryToString(Z_Query *query)
+std::string mp_util::zQueryToString(Z_Query *query)
 {
     std::string query_str = "";
 
@@ -103,8 +144,8 @@ std::string yp2::util::zQueryToString(Z_Query *query)
     return query_str;
 }
 
-void yp2::util::get_default_diag(Z_DefaultDiagFormat *r,
-                                 int &error_code, std::string &addinfo)
+void mp_util::get_default_diag(Z_DefaultDiagFormat *r,
+                                         int &error_code, std::string &addinfo)
 {
     error_code = *r->condition;
     switch (r->which)
@@ -118,8 +159,8 @@ void yp2::util::get_default_diag(Z_DefaultDiagFormat *r,
     }
 }
 
-void yp2::util::get_init_diagnostics(Z_InitResponse *initrs,
-                                     int &error_code, std::string &addinfo)
+void mp_util::get_init_diagnostics(
+    Z_InitResponse *initrs, int &error_code, std::string &addinfo)
 {
     Z_External *uif = initrs->userInformationField;
     
@@ -142,7 +183,7 @@ void yp2::util::get_init_diagnostics(Z_InitResponse *initrs,
                 {
                     Z_DiagnosticFormat_s *ds = diag->elements[0];
                     if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec)
-                        yp2::util::get_default_diag(ds->u.defaultDiagRec,
+                        mp::util::get_default_diag(ds->u.defaultDiagRec,
                                                     error_code, addinfo);
                 }
             } 
@@ -150,9 +191,10 @@ void yp2::util::get_init_diagnostics(Z_InitResponse *initrs,
     }
 }
 
-int yp2::util::get_vhost_otherinfo(Z_OtherInformation **otherInformation,
-                                   bool remove_flag,
-                                   std::list<std::string> &vhosts)
+int mp_util::get_vhost_otherinfo(
+    Z_OtherInformation **otherInformation,
+    bool remove_flag,
+    std::list<std::string> &vhosts)
 {
     int cat;
     for (cat = 1; ; cat++)
@@ -171,9 +213,9 @@ int yp2::util::get_vhost_otherinfo(Z_OtherInformation **otherInformation,
     return cat;
 }
 
-void yp2::util::set_vhost_otherinfo(Z_OtherInformation **otherInformation,
-                                    ODR odr,
-                                    const std::list<std::string> &vhosts)
+void mp_util::set_vhost_otherinfo(
+    Z_OtherInformation **otherInformation, ODR odr,
+    const std::list<std::string> &vhosts)
 {
     int cat;
     std::list<std::string>::const_iterator it = vhosts.begin();
@@ -184,8 +226,8 @@ void yp2::util::set_vhost_otherinfo(Z_OtherInformation **otherInformation,
     }
 }
 
-void yp2::util::split_zurl(std::string zurl, std::string &host,
-                           std::list<std::string> &db)
+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, '/');
@@ -214,8 +256,9 @@ void yp2::util::split_zurl(std::string zurl, std::string &host,
     }
 }
 
-bool yp2::util::set_databases_from_zurl(ODR odr, std::string zurl,
-                                        int *db_num, char ***db_strings)
+bool mp_util::set_databases_from_zurl(
+    ODR odr, std::string zurl,
+    int *db_num, char ***db_strings)
 {
     std::string host;
     std::list<std::string> dblist;
@@ -233,28 +276,28 @@ bool yp2::util::set_databases_from_zurl(ODR odr, std::string zurl,
     return true;
 }
 
-yp2::odr::odr(int type)
+mp::odr::odr(int type)
 {
     m_odr = odr_createmem(type);
 }
 
-yp2::odr::odr()
+mp::odr::odr()
 {
     m_odr = odr_createmem(ODR_ENCODE);
 }
 
-yp2::odr::~odr()
+mp::odr::~odr()
 {
     odr_destroy(m_odr);
 }
 
-yp2::odr::operator ODR() const
+mp::odr::operator ODR() const
 {
     return m_odr;
 }
 
-Z_APDU *yp2::odr::create_close(Z_APDU *in_apdu,
-                               int reason, const char *addinfo)
+Z_APDU *mp::odr::create_close(const Z_APDU *in_apdu,
+                              int reason, const char *addinfo)
 {
     Z_APDU *apdu = create_APDU(Z_APDU_close, in_apdu);
     
@@ -264,20 +307,25 @@ Z_APDU *yp2::odr::create_close(Z_APDU *in_apdu,
     return apdu;
 }
 
-Z_APDU *yp2::odr::create_APDU(int type, Z_APDU *in_apdu)
+Z_APDU *mp::odr::create_APDU(int type, const Z_APDU *in_apdu)
 {
-    return yp2::util::create_APDU(m_odr, type, in_apdu);
+    return mp::util::create_APDU(m_odr, type, in_apdu);
 }
 
-Z_APDU *yp2::util::create_APDU(ODR odr, int type, Z_APDU *in_apdu)
+Z_APDU *mp_util::create_APDU(ODR odr, int type, const Z_APDU *in_apdu)
 {
     Z_APDU *out_apdu = zget_APDU(odr, type);
+    transfer_referenceId(odr, in_apdu, out_apdu);
+    return out_apdu;
+}
 
-    Z_ReferenceId **id_to = yp2::util::get_referenceId(out_apdu);
+void mp_util::transfer_referenceId(ODR odr, const Z_APDU *src, Z_APDU *dst)
+{
+    Z_ReferenceId **id_to = mp::util::get_referenceId(dst);
     *id_to = 0;
-    if (in_apdu)
+    if (src)
     {
-        Z_ReferenceId **id_from = yp2::util::get_referenceId(in_apdu);
+        Z_ReferenceId **id_from = mp::util::get_referenceId(src);
         if (id_from && *id_from && id_to)
         {
             *id_to = (Z_ReferenceId*) odr_malloc (odr, sizeof(**id_to));
@@ -288,11 +336,10 @@ Z_APDU *yp2::util::create_APDU(ODR odr, int type, Z_APDU *in_apdu)
         else if (id_to)
             *id_to = 0;
     }
-    return out_apdu;
 }
 
-Z_APDU *yp2::odr::create_initResponse(Z_APDU *in_apdu,
-                                      int error, const char *addinfo)
+Z_APDU *mp::odr::create_initResponse(const Z_APDU *in_apdu,
+                                     int error, const char *addinfo)
 {
     Z_APDU *apdu = create_APDU(Z_APDU_initResponse, in_apdu);
     if (error)
@@ -304,8 +351,8 @@ Z_APDU *yp2::odr::create_initResponse(Z_APDU *in_apdu,
     return apdu;
 }
 
-Z_APDU *yp2::odr::create_searchResponse(Z_APDU *in_apdu,
-                                        int error, const char *addinfo)
+Z_APDU *mp::odr::create_searchResponse(const Z_APDU *in_apdu,
+                                       int error, const char *addinfo)
 {
     Z_APDU *apdu = create_APDU(Z_APDU_searchResponse, in_apdu);
     if (error)
@@ -321,8 +368,8 @@ Z_APDU *yp2::odr::create_searchResponse(Z_APDU *in_apdu,
     return apdu;
 }
 
-Z_APDU *yp2::odr::create_presentResponse(Z_APDU *in_apdu,
-                                         int error, const char *addinfo)
+Z_APDU *mp::odr::create_presentResponse(const Z_APDU *in_apdu,
+                                        int error, const char *addinfo)
 {
     Z_APDU *apdu = create_APDU(Z_APDU_presentResponse, in_apdu);
     if (error)
@@ -338,8 +385,8 @@ Z_APDU *yp2::odr::create_presentResponse(Z_APDU *in_apdu,
     return apdu;
 }
 
-Z_APDU *yp2::odr::create_scanResponse(Z_APDU *in_apdu,
-                                      int error, const char *addinfo)
+Z_APDU *mp::odr::create_scanResponse(const Z_APDU *in_apdu,
+                                     int error, const char *addinfo)
 {
     Z_APDU *apdu = create_APDU(Z_APDU_scanResponse, in_apdu);
     Z_ScanResponse *res = apdu->u.scanResponse;
@@ -365,8 +412,8 @@ Z_APDU *yp2::odr::create_scanResponse(Z_APDU *in_apdu,
     return apdu;
 }
 
-Z_GDU *yp2::odr::create_HTTP_Response(yp2::Session &session,
-                                      Z_HTTP_Request *hreq, int code)
+Z_GDU *mp::odr::create_HTTP_Response(mp::Session &session,
+                                     Z_HTTP_Request *hreq, int code)
 {
     const char *response_version = "1.0";
     bool keepalive = false;
@@ -398,7 +445,7 @@ Z_GDU *yp2::odr::create_HTTP_Response(yp2::Session &session,
     return gdu;
 }
 
-Z_ReferenceId **yp2::util::get_referenceId(Z_APDU *apdu)
+Z_ReferenceId **mp_util::get_referenceId(const Z_APDU *apdu)
 {
     switch (apdu->which)
     {