Fix limit filter WRT 'retrieve limit' and refactor
[metaproxy-moved-to-github.git] / src / filter_virt_db.cpp
index aca2634..10d3f3d 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2009 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,15 +18,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "config.hpp"
 
-#include "filter.hpp"
-#include "package.hpp"
+#include "filter_virt_db.hpp"
+#include <metaproxy/package.hpp>
 
 #include <boost/thread/mutex.hpp>
 #include <boost/thread/condition.hpp>
 #include <boost/shared_ptr.hpp>
 
-#include "util.hpp"
-#include "filter_virt_db.hpp"
+#include <metaproxy/util.hpp>
 
 #include <yaz/zgdu.h>
 #include <yaz/otherinfo.h>
@@ -236,31 +235,24 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend(
         {
             b->m_named_result_sets = true;
         }
-        if (!*res->result)
+        if (*res->result)
         {
-            error_code = YAZ_BIB1_DATABASE_UNAVAILABLE;
-            mp::util::get_init_diagnostics(res, error_code, addinfo);
-            BackendPtr null;
-            return null; 
+            m_backend_list.push_back(b);
+            return b;
+
         }
-    }
-    else
-    {
         error_code = YAZ_BIB1_DATABASE_UNAVAILABLE;
-        // addinfo = database;
-        BackendPtr null;
-        return null;
-    }        
-    if (init_package.session().is_closed())
+        mp::util::get_init_diagnostics(res, error_code, addinfo);
+    }
+    if (!init_package.session().is_closed())
     {
-        error_code = YAZ_BIB1_DATABASE_UNAVAILABLE;
-        // addinfo = database;
-        BackendPtr null;
-        return null;
+        Package close_package(b->m_backend_session, package.origin());
+        close_package.copy_filter(package);
+        close_package.session().close();
+        close_package.move(b->m_route);  // closing it
     }
-
-    m_backend_list.push_back(b);
-    return b;
+    BackendPtr null;
+    return null; 
 }
 
 void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req)
@@ -275,7 +267,6 @@ void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req)
     for (i = 0; i<req->num_databaseNames; i++)
         databases.push_back(req->databaseNames[i]);
 
-    BackendPtr b; // null for now
     Sets_it sets_it = m_sets.find(req->resultSetName);
     if (sets_it != m_sets.end())
     {
@@ -294,37 +285,22 @@ void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req)
             return;
         } 
         sets_it->second.m_backend->m_number_of_sets--;
-
-        // pick up any existing backend with a database match
-        std::list<BackendPtr>::const_iterator map_it;
-        map_it = m_backend_list.begin();
-        for (; map_it != m_backend_list.end(); map_it++)
-        {
-            BackendPtr tmp = *map_it;
-            if (tmp->m_frontend_databases == databases)
-                break;
-        }
-        if (map_it != m_backend_list.end()) 
-            b = *map_it;
     }
-    else
+    // pick up any existing database with named result sets ..
+    // or one which has no result sets.. yet.
+    BackendPtr b; // null for now
+    std::list<BackendPtr>::const_iterator map_it;
+    map_it = m_backend_list.begin();
+    for (; map_it != m_backend_list.end(); map_it++)
     {
-        // new result set.
-
-        // pick up any existing database with named result sets ..
-        // or one which has no result sets.. yet.
-        std::list<BackendPtr>::const_iterator map_it;
-        map_it = m_backend_list.begin();
-        for (; map_it != m_backend_list.end(); map_it++)
+        BackendPtr tmp = *map_it;
+        if (tmp->m_frontend_databases == databases &&
+            (tmp->m_named_result_sets ||
+             tmp->m_number_of_sets == 0))
         {
-            BackendPtr tmp = *map_it;
-            if (tmp->m_frontend_databases == databases &&
-                (tmp->m_named_result_sets ||
-                 tmp->m_number_of_sets == 0))
-                break;
-        }
-        if (map_it != m_backend_list.end()) 
             b = *map_it;
+            break;
+        }
     }
     if (!b)  // no backend yet. Must create a new one
     {