Version 1.2.3
[metaproxy-moved-to-github.git] / src / filter_z3950_client.cpp
index 70f7703..683c09a 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2008 Index Data
+   Copyright (C) 2005-2010 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
@@ -18,10 +18,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "config.hpp"
 
-#include "filter.hpp"
-#include "package.hpp"
-#include "util.hpp"
 #include "filter_z3950_client.hpp"
+#include <metaproxy/package.hpp>
+#include <metaproxy/util.hpp>
 
 #include <map>
 #include <stdexcept>
@@ -274,7 +273,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package)
                 package.response() = odr.create_initResponse(
                     apdu,
                     YAZ_BIB1_INIT_NEGOTIATION_OPTION_REQUIRED,
-                    "z3950_client: No virtal host given");
+                    "z3950_client: No vhost given");
                 
                 package.session().close();
                 return 0;
@@ -304,17 +303,32 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package)
 
     while (max_sockets)
     {
+        int no_not_in_use = 0;
         int number = 0;
         it = m_clients.begin();
         for (; it != m_clients.end(); it++)
         {
             yf::Z3950Client::Assoc *as = it->second;
-            if (!strcmp(as->get_hostname(), host.c_str()))
+            if (!strcmp(as->m_host.c_str(), host.c_str()))
+            {
                 number++;
+                if (!as->m_in_use)
+                    no_not_in_use++;
+            }
         }
-        yaz_log(YLOG_LOG, "Found %d connections for %s", number, host.c_str());
+        yaz_log(YLOG_LOG, "Found %d/%d connections for %s", number, max_sockets,
+                host.c_str());
         if (number < max_sockets)
             break;
+        if (no_not_in_use == 0) // all in use..
+        {
+            mp::odr odr;
+            
+            package.response() = odr.create_initResponse(
+                apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions");
+            package.session().close();
+            return 0;
+        }
         boost::xtime xt;
         xtime_get(&xt, boost::TIME_UTC);