The configure method takes test_only flag so we can avoid
[metaproxy-moved-to-github.git] / src / filter_session_shared.cpp
index b1351bd..bada836 100644 (file)
@@ -1,7 +1,22 @@
-/* $Id: filter_session_shared.cpp,v 1.13 2006-06-20 22:27:45 adam Exp $
-   Copyright (c) 2005-2006, Index Data.
+/* $Id: filter_session_shared.cpp,v 1.20 2008-02-20 15:07:52 adam Exp $
+   Copyright (c) 2005-2007, Index Data.
 
-   See the LICENSE file for details
+This file is part of Metaproxy.
+
+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
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Metaproxy; see the file LICENSE.  If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
  */
 
 #include "config.hpp"
@@ -105,7 +120,10 @@ namespace metaproxy_1 {
             time_t m_backend_expiry_ttl;
             size_t m_backend_set_max;
         public:
-            BackendClass(const yazpp_1::GDU &init_request);
+            BackendClass(const yazpp_1::GDU &init_request,
+                         int resultset_ttl,
+                         int resultset_max,
+                         int session_ttl);
             ~BackendClass();
         };
         class SessionShared::FrontendSet {
@@ -161,6 +179,9 @@ namespace metaproxy_1 {
             BackendClassMap m_backend_map;
             boost::mutex m_mutex_backend_map;
             boost::thread_group m_thrds;
+            int m_resultset_ttl;
+            int m_resultset_max;
+            int m_session_ttl;
         };
     }
 }
@@ -369,10 +390,13 @@ yf::SessionShared::BackendInstancePtr yf::SessionShared::BackendClass::create_ba
 }
 
 
-yf::SessionShared::BackendClass::BackendClass(const yazpp_1::GDU &init_request)
+yf::SessionShared::BackendClass::BackendClass(const yazpp_1::GDU &init_request,
+                                              int resultset_ttl,
+                                              int resultset_max,
+                                              int session_ttl)
     : m_named_result_sets(false), m_init_request(init_request),
-      m_sequence_top(0), m_backend_set_ttl(30),
-      m_backend_expiry_ttl(30), m_backend_set_max(10)
+      m_sequence_top(0), m_backend_set_ttl(resultset_ttl),
+      m_backend_expiry_ttl(session_ttl), m_backend_set_max(resultset_max)
 {}
 
 yf::SessionShared::BackendClass::~BackendClass()
@@ -392,17 +416,16 @@ void yf::SessionShared::Rep::init(mp::Package &package, const Z_GDU *gdu,
         it = m_backend_map.find(k);
         if (it == m_backend_map.end())
         {
-            BackendClassPtr b(new BackendClass(gdu->u.z3950));
+            BackendClassPtr b(new BackendClass(gdu->u.z3950,
+                                               m_resultset_ttl,
+                                               m_resultset_max,
+                                               m_session_ttl));
             m_backend_map[k] = b;
             frontend->m_backend_class = b;
-            std::cout << "SessionShared::Rep::init new session " 
-                      << frontend->m_backend_class << "\n";
         }
         else
         {
             frontend->m_backend_class = it->second;            
-            std::cout << "SessionShared::Rep::init existing session "
-                      << frontend->m_backend_class << "\n";
         }
     }
     BackendClassPtr bc = frontend->m_backend_class;
@@ -454,7 +477,7 @@ yf::SessionShared::BackendSet::BackendSet(
 }
 
 bool yf::SessionShared::BackendSet::search(
-    Package &frontend_package,
+    mp::Package &frontend_package,
     const Z_APDU *frontend_apdu,
     const BackendInstancePtr bp)
 {
@@ -554,7 +577,6 @@ void yf::SessionShared::Frontend::override_set(
                     found_backend = *it;
                     result_set_id = (*set_it)->m_result_set_id;
                     found_backend->m_sets.erase(set_it);
-                    std::cout << "REUSE TTL SET: " << result_set_id << "\n";
                     return;
                 }
             }
@@ -575,7 +597,6 @@ void yf::SessionShared::Frontend::override_set(
             }
             else
                 result_set_id = "default";
-            std::cout << "AVAILABLE SET: " << result_set_id << "\n";
             return;
         }
     }
@@ -610,8 +631,6 @@ void yf::SessionShared::Frontend::get_set(mp::Package &package,
                         found_backend = *it;
                         bc->use_backend(found_backend);
                         found_set->timestamp();
-                        std::cout << "MATCH SET: " << 
-                            found_set->m_result_set_id << "\n";
                         // found matching set. No need to search again
                         return;
                     }
@@ -649,8 +668,6 @@ void yf::SessionShared::Frontend::get_set(mp::Package &package,
             package.response() = f_apdu;
             return;
         }
-        std::cout << "NEW " << found_backend << "\n";
-        
         if (bc->m_named_result_sets)
         {
             result_set_id = boost::io::str(
@@ -659,14 +676,12 @@ void yf::SessionShared::Frontend::get_set(mp::Package &package,
         }
         else
             result_set_id = "default";
-        std::cout << "NEW SET: " << result_set_id << "\n";
     }
     // we must search ...
     BackendSetPtr new_set(new BackendSet(result_set_id,
                                          databases, query));
     if (!new_set->search(package, apdu_req, found_backend))
     {
-        std::cout << "search error\n";
         bc->remove_backend(found_backend);
         return; // search error 
     }
@@ -848,12 +863,10 @@ void yf::SessionShared::BackendClass::expire()
     BackendInstanceList::iterator bit = m_backend_list.begin();
     while (bit != m_backend_list.end())
     {
-        std::cout << "expiry ";
         time_t last_use = (*bit)->m_time_last_use;
         
         if ((*bit)->m_in_use)
         {
-            std::cout << "inuse";
             bit++;
         }
         else if ((now >= last_use && now - last_use > m_backend_expiry_ttl)
@@ -866,14 +879,11 @@ void yf::SessionShared::BackendClass::expire()
             (*bit)->m_close_package->move();
 
             bit = m_backend_list.erase(bit);
-            std::cout << "erase";
         }
         else
         {
-            std::cout << "keep";
             bit++;
         }
-        std::cout << std::endl;
     }
 }
 
@@ -885,7 +895,6 @@ void yf::SessionShared::Rep::expire()
         boost::xtime_get(&xt, boost::TIME_UTC);
         xt.sec += 30;
         boost::thread::sleep(xt);
-        std::cout << "." << std::endl;
         
         BackendClassMap::const_iterator b_it = m_backend_map.begin();
         for (; b_it != m_backend_map.end(); b_it++)
@@ -895,6 +904,9 @@ void yf::SessionShared::Rep::expire()
 
 yf::SessionShared::Rep::Rep()
 {
+    m_resultset_ttl = 30;
+    m_resultset_max = 10;
+    m_session_ttl = 90;
     yf::SessionShared::Worker w(this);
     m_thrds.add_thread(new boost::thread(w));
 }
@@ -1023,6 +1035,54 @@ void yf::SessionShared::process(mp::Package &package) const
     m_p->release_frontend(package);
 }
 
+void yf::SessionShared::configure(const xmlNode *ptr, bool test_only)
+{
+    for (ptr = ptr->children; ptr; ptr = ptr->next)
+    {
+        if (ptr->type != XML_ELEMENT_NODE)
+            continue;
+        if (!strcmp((const char *) ptr->name, "resultset"))
+        {
+            const struct _xmlAttr *attr;
+            for (attr = ptr->properties; attr; attr = attr->next)
+            {
+                if (!strcmp((const char *) attr->name, "ttl"))
+                    m_p->m_resultset_ttl = 
+                        mp::xml::get_int(attr->children, 30);
+                else if (!strcmp((const char *) attr->name, "max"))
+                {
+                    m_p->m_resultset_max = 
+                        mp::xml::get_int(attr->children, 10);
+                }
+                else
+                    throw mp::filter::FilterException(
+                        "Bad attribute " + std::string((const char *)
+                                                       attr->name));
+            }
+        }
+        else if (!strcmp((const char *) ptr->name, "session"))
+        {
+            const struct _xmlAttr *attr;
+            for (attr = ptr->properties; attr; attr = attr->next)
+            {
+                if (!strcmp((const char *) attr->name, "ttl"))
+                    m_p->m_session_ttl = 
+                        mp::xml::get_int(attr->children, 120);
+                else
+                    throw mp::filter::FilterException(
+                        "Bad attribute " + std::string((const char *)
+                                                       attr->name));
+            }
+        }
+        else
+        {
+            throw mp::filter::FilterException("Bad element " 
+                                               + std::string((const char *)
+                                                             ptr->name));
+        }
+    }
+}
+
 static mp::filter::Base* filter_creator()
 {
     return new mp::filter::SessionShared;