session_shared: don't reset timestap for query match
[metaproxy-moved-to-github.git] / src / filter_session_shared.cpp
index ac26c47..cccaee8 100644 (file)
@@ -74,7 +74,7 @@ namespace metaproxy_1 {
         public:
             std::string m_result_set_id;
             Databases m_databases;
-            int m_result_set_size;
+            Odr_int m_result_set_size;
             yazpp_1::Yaz_Z_Query m_query;
             time_t m_time_last_use;
             void timestamp();
@@ -195,6 +195,7 @@ namespace metaproxy_1 {
             int m_resultset_max;
             int m_session_ttl;
             bool m_optimize_search;
+            bool m_restart;
             int m_session_max;
         };
     }
@@ -463,33 +464,42 @@ void yf::SessionShared::Rep::init(mp::Package &package, const Z_GDU *gdu,
         }
     }
     BackendClassPtr bc = frontend->m_backend_class;
-    BackendInstancePtr backend = bc->get_backend(package);
-    
+    BackendInstancePtr backend;
     mp::odr odr;
-    if (!backend)
+
+    // we only need to get init response from "first" target in
+    // backend class - the assumption being that init response is
+    // same for all
+    if (bc->m_init_response.get() == 0)
     {
-        Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
-        *apdu->u.initResponse->result = 0;
-        package.response() = apdu;
-        package.session().close();
+        backend = bc->get_backend(package);
     }
-    else
     {
         boost::mutex::scoped_lock lock(bc->m_mutex_backend_class);
-        yazpp_1::GDU init_response = bc->m_init_response;
-        Z_GDU *response_gdu = init_response.get();
-        mp::util::transfer_referenceId(odr, gdu->u.z3950,
-                                       response_gdu->u.z3950);
-
-        Z_Options *server_options =
-            response_gdu->u.z3950->u.initResponse->options;
-        Z_Options *client_options = &frontend->m_init_options;
-
-        int i;
-        for (i = 0; i<30; i++)
-            if (!ODR_MASK_GET(client_options, i))
-                ODR_MASK_CLEAR(server_options, i);
-        package.response() = init_response;
+        if (bc->m_init_response.get() == 0)
+        {
+            Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
+            *apdu->u.initResponse->result = 0;
+            package.response() = apdu;
+            package.session().close();
+        }
+        else
+        {
+            yazpp_1::GDU init_response = bc->m_init_response;
+            Z_GDU *response_gdu = init_response.get();
+            mp::util::transfer_referenceId(odr, gdu->u.z3950,
+                                           response_gdu->u.z3950);
+            
+            Z_Options *server_options =
+                response_gdu->u.z3950->u.initResponse->options;
+            Z_Options *client_options = &frontend->m_init_options;
+            
+            int i;
+            for (i = 0; i < 30; i++)
+                if (!ODR_MASK_GET(client_options, i))
+                    ODR_MASK_CLEAR(server_options, i);
+            package.response() = init_response;
+        }
     }
     if (backend)
         bc->release_backend(backend);
@@ -657,7 +667,6 @@ restart:
                             found_set = *set_it;
                             found_backend = *it;
                             bc->use_backend(found_backend);
-                            found_set->timestamp();
                             // found matching set. No need to search again
                             return;
                         }
@@ -748,9 +757,10 @@ restart:
                 
             }
         }
-        if (!session_restarted &&
+        if (m_p->m_restart && !session_restarted &&
             condition == YAZ_BIB1_TEMPORARY_SYSTEM_ERROR)
         {
+            package.log("session_shared", YLOG_LOG, "restart");
             bc->remove_backend(found_backend);
             session_restarted = true;
             found_backend.reset();
@@ -782,8 +792,9 @@ restart:
             return; // search error 
         }
     }
-    if (!session_restarted && new_set->m_result_set_size < 0)
+    if (m_p->m_restart && !session_restarted && new_set->m_result_set_size < 0)
     {
+        package.log("session_shared", YLOG_LOG, "restart");
         bc->remove_backend(found_backend);
         session_restarted = true;
         found_backend.reset();
@@ -825,7 +836,7 @@ void yf::SessionShared::Frontend::search(mp::Package &package,
     query.set_Z_Query(req->query);
     Databases databases;
     int i;
-    for (i = 0; i<req->num_databaseNames; i++)
+    for (i = 0; i < req->num_databaseNames; i++)
         databases.push_back(req->databaseNames[i]);
 
     BackendSetPtr found_set; // null
@@ -1057,6 +1068,7 @@ yf::SessionShared::Rep::Rep()
     m_resultset_max = 10;
     m_session_ttl = 90;
     m_optimize_search = true;
+    m_restart = false;
     m_session_max = 100;
 }
 
@@ -1219,6 +1231,10 @@ void yf::SessionShared::configure(const xmlNode *ptr, bool test_only,
                     m_p->m_optimize_search =
                         mp::xml::get_bool(attr->children, true);
                 }
+                else if (!strcmp((const char *) attr->name, "restart"))
+                {
+                    m_p->m_restart = mp::xml::get_bool(attr->children, true);
+                }
                 else
                     throw mp::filter::FilterException(
                         "Bad attribute " + std::string((const char *)