Remove 'Fix up:' message
[metaproxy-moved-to-github.git] / src / filter_virt_db.cpp
index 69a3ee4..cf666d2 100644 (file)
@@ -1,7 +1,7 @@
-/* $Id: filter_virt_db.cpp,v 1.38 2006-05-15 11:43:01 adam Exp $
+/* $Id: filter_virt_db.cpp,v 1.44 2006-08-01 13:24:53 adam Exp $
    Copyright (c) 2005-2006, Index Data.
 
-%LICENSE%
+   See the LICENSE file for details
  */
 
 #include "config.hpp"
@@ -68,11 +68,12 @@ namespace metaproxy_1 {
             void close(Package &package);
             typedef std::map<std::string,Virt_db::Set>::iterator Sets_it;
 
-            void fixup_npr(Package &p, BackendPtr b);
-
-            void fixup_npr(Z_Records *records, std::string database,
-                           ODR odr);
-
+            void fixup_package(Package &p, BackendPtr b);
+            void fixup_npr_record(ODR odr, Z_NamePlusRecord *npr,
+                                  BackendPtr b);
+            void fixup_npr_records(ODR odr, Z_Records *records,
+                                   BackendPtr b);
+    
             BackendPtr lookup_backend_from_databases(
                 std::list<std::string> databases);
             BackendPtr create_backend_from_databases(
@@ -161,7 +162,7 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::create_backend_from_databases(
 }
 
 yf::Virt_db::BackendPtr yf::Virt_db::Frontend::init_backend(
-    std::list<std::string> databases, Package &package,
+    std::list<std::string> databases, mp::Package &package,
     int &error_code, std::string &addinfo)
 {
     BackendPtr b = create_backend_from_databases(databases, error_code,
@@ -237,7 +238,7 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::init_backend(
     return b;
 }
 
-void yf::Virt_db::Frontend::search(Package &package, Z_APDU *apdu_req)
+void yf::Virt_db::Frontend::search(mp::Package &package, Z_APDU *apdu_req)
 {
     Z_SearchRequest *req = apdu_req->u.searchRequest;
     std::string vhost;
@@ -357,7 +358,7 @@ void yf::Virt_db::Frontend::search(Package &package, Z_APDU *apdu_req)
     b->m_number_of_sets++;
 
     m_sets[resultSetId] = Virt_db::Set(b, backend_setname);
-    fixup_npr(search_package, b);
+    fixup_package(search_package, b);
     package.response() = search_package.response();
 }
 
@@ -367,7 +368,7 @@ yf::Virt_db::Frontend::Frontend(Rep *rep)
     m_is_virtual = false;
 }
 
-void yf::Virt_db::Frontend::close(Package &package)
+void yf::Virt_db::Frontend::close(mp::Package &package)
 {
     std::list<BackendPtr>::const_iterator b_it;
     
@@ -385,7 +386,7 @@ yf::Virt_db::Frontend::~Frontend()
 {
 }
 
-yf::Virt_db::FrontendPtr yf::Virt_db::Rep::get_frontend(Package &package)
+yf::Virt_db::FrontendPtr yf::Virt_db::Rep::get_frontend(mp::Package &package)
 {
     boost::mutex::scoped_lock lock(m_mutex);
 
@@ -410,7 +411,7 @@ yf::Virt_db::FrontendPtr yf::Virt_db::Rep::get_frontend(Package &package)
     return f;
 }
 
-void yf::Virt_db::Rep::release_frontend(Package &package)
+void yf::Virt_db::Rep::release_frontend(mp::Package &package)
 {
     boost::mutex::scoped_lock lock(m_mutex);
     std::map<mp::Session,yf::Virt_db::FrontendPtr>::iterator it;
@@ -462,9 +463,48 @@ yf::Virt_db::Virt_db() : m_p(new Virt_db::Rep)
 yf::Virt_db::~Virt_db() {
 }
 
+void yf::Virt_db::Frontend::fixup_npr_record(ODR odr, Z_NamePlusRecord *npr,
+                                             BackendPtr b)
+{
+    if (npr->databaseName)
+    {
+        std::string b_database = std::string(npr->databaseName);
+
+        // consider each of the frontend databases..
+        std::list<std::string>::const_iterator db_it;
+        for (db_it = b->m_frontend_databases.begin(); 
+             db_it != b->m_frontend_databases.end(); db_it++)
+        {
+            // see which target it corresponds to.. (if any)
+            std::map<std::string,Virt_db::Map>::const_iterator map_it;
+            map_it = m_p->m_maps.find(*db_it);
+            if (map_it != m_p->m_maps.end())
+            { 
+                Virt_db::Map m = map_it->second;
+                
+                std::list<std::string>::const_iterator t;
+                for (t = m.m_targets.begin(); t != m.m_targets.end(); t++)
+                {
+                    if (*t == b_database)
+                    {
+                        npr->databaseName = odr_strdup(odr, (*db_it).c_str());
+                        return;
+                    }
+                }
+            }
+            
+        }
+        db_it = b->m_frontend_databases.begin();
+        if (db_it != b->m_frontend_databases.end())
+        {
+            std::string database = *db_it;
+            npr->databaseName = odr_strdup(odr, database.c_str());
+        }
+    }
+}
 
-void yf::Virt_db::Frontend::fixup_npr(Z_Records *records, std::string database,
-                                      ODR odr)
+void yf::Virt_db::Frontend::fixup_npr_records(ODR odr, Z_Records *records,
+                                              BackendPtr b)
 {
     if (records && records->which == Z_Records_DBOSD)
     {
@@ -472,38 +512,33 @@ void yf::Virt_db::Frontend::fixup_npr(Z_Records *records, std::string database,
         int i;
         for (i = 0; i < nprlist->num_records; i++)
         {
-            Z_NamePlusRecord *npr = nprlist->records[i];
-            npr->databaseName = odr_strdup(odr, database.c_str());
+            fixup_npr_record(odr, nprlist->records[i], b);
         }
     }
 }
 
-void yf::Virt_db::Frontend::fixup_npr(Package &p, BackendPtr b)
+void yf::Virt_db::Frontend::fixup_package(mp::Package &p, BackendPtr b)
 {
     Z_GDU *gdu = p.response().get();
     mp::odr odr;
-    std::string database = "dummy";
-    std::list<std::string>::const_iterator db_it =
-        b->m_frontend_databases.begin();
-    if (db_it != b->m_frontend_databases.end())
-        database = *db_it;
 
-    if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
-        Z_APDU_presentResponse)
-    {
-        fixup_npr(gdu->u.z3950->u.presentResponse->records, database, odr);
-        p.response() = gdu;
-    }
-    if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
-        Z_APDU_searchResponse)
+    if (gdu && gdu->which == Z_GDU_Z3950)
     {
-        fixup_npr(gdu->u.z3950->u.searchResponse->records, database, odr);
-        p.response() = gdu;
+        Z_APDU *apdu = gdu->u.z3950;
+        if (apdu->which == Z_APDU_presentResponse)
+        {
+            fixup_npr_records(odr, apdu->u.presentResponse->records, b);
+            p.response() = gdu;
+        }
+        else if (apdu->which == Z_APDU_searchResponse)
+        {
+            fixup_npr_records(odr,  apdu->u.searchResponse->records, b);
+            p.response() = gdu;
+        }
     }
-
 }
 
-void yf::Virt_db::Frontend::present(Package &package, Z_APDU *apdu_req)
+void yf::Virt_db::Frontend::present(mp::Package &package, Z_APDU *apdu_req)
 {
     Z_PresentRequest *req = apdu_req->u.presentRequest;
     std::string resultSetId = req->resultSetId;
@@ -533,7 +568,7 @@ void yf::Virt_db::Frontend::present(Package &package, Z_APDU *apdu_req)
 
     present_package.move(sets_it->second.m_backend->m_route);
 
-    fixup_npr(present_package, sets_it->second.m_backend);
+    fixup_package(present_package, sets_it->second.m_backend);
 
     if (present_package.session().is_closed())
     {
@@ -548,7 +583,7 @@ void yf::Virt_db::Frontend::present(Package &package, Z_APDU *apdu_req)
     delete id;
 }
 
-void yf::Virt_db::Frontend::scan(Package &package, Z_APDU *apdu_req)
+void yf::Virt_db::Frontend::scan(mp::Package &package, Z_APDU *apdu_req)
 {
     Z_ScanRequest *req = apdu_req->u.scanRequest;
     std::string vhost;
@@ -634,7 +669,7 @@ void yf::Virt_db::add_map_db2target(std::string db,
         = Virt_db::Map(targets, route);
 }
 
-void yf::Virt_db::process(Package &package) const
+void yf::Virt_db::process(mp::Package &package) const
 {
     FrontendPtr f = m_p->get_frontend(package);
 
@@ -713,6 +748,10 @@ void yf::Virt_db::process(Package &package) const
         {
             f->scan(package, apdu);
         }
+        else if (apdu->which == Z_APDU_close)
+        {
+            package.session().close();
+        }
         else
         {
             mp::odr odr;