Add LICENSE file and Refer to it from the source. Include license material
[metaproxy-moved-to-github.git] / src / filter_virt_db.cpp
index fdbe827..9b7e7e9 100644 (file)
@@ -1,7 +1,7 @@
-/* $Id: filter_virt_db.cpp,v 1.36 2006-03-16 10:40:59 adam Exp $
+/* $Id: filter_virt_db.cpp,v 1.41 2006-06-10 14:29:12 adam Exp $
    Copyright (c) 2005-2006, Index Data.
 
-%LICENSE%
+   See the LICENSE file for details
  */
 
 #include "config.hpp"
@@ -68,6 +68,11 @@ 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);
+
             BackendPtr lookup_backend_from_databases(
                 std::list<std::string> databases);
             BackendPtr create_backend_from_databases(
@@ -87,11 +92,8 @@ namespace metaproxy_1 {
             FrontendPtr get_frontend(Package &package);
             void release_frontend(Package &package);
         private:
-            boost::mutex m_sessions_mutex;
             std::map<std::string, Virt_db::Map>m_maps;
-
             typedef std::map<std::string,Virt_db::Set>::iterator Sets_it;
-
             boost::mutex m_mutex;
             boost::condition m_cond_session_ready;
             std::map<mp::Session, FrontendPtr> m_clients;
@@ -99,8 +101,6 @@ namespace metaproxy_1 {
     }
 }
 
-using namespace mp;
-
 yf::Virt_db::BackendPtr yf::Virt_db::Frontend::lookup_backend_from_databases(
     std::list<std::string> databases)
 {
@@ -129,7 +129,7 @@ yf::Virt_db::BackendPtr yf::Virt_db::Frontend::create_backend_from_databases(
     for (; db_it != databases.end(); db_it++)
     {
         std::map<std::string, Virt_db::Map>::iterator map_it;
-        map_it = m_p->m_maps.find(*db_it);
+        map_it = m_p->m_maps.find(mp::util::database_name_normalize(*db_it));
         if (map_it == m_p->m_maps.end())  // database not found
         {
             error_code = YAZ_BIB1_DATABASE_UNAVAILABLE;
@@ -161,7 +161,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 +237,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;
@@ -354,11 +354,11 @@ void yf::Virt_db::Frontend::search(Package &package, Z_APDU *apdu_req)
         package.session().close();
         return;
     }
-    package.response() = search_package.response();
-
     b->m_number_of_sets++;
 
     m_sets[resultSetId] = Virt_db::Set(b, backend_setname);
+    fixup_npr(search_package, b);
+    package.response() = search_package.response();
 }
 
 yf::Virt_db::Frontend::Frontend(Rep *rep)
@@ -367,7 +367,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 +385,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 +410,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,7 +462,47 @@ yf::Virt_db::Virt_db() : m_p(new Virt_db::Rep)
 yf::Virt_db::~Virt_db() {
 }
 
-void yf::Virt_db::Frontend::present(Package &package, Z_APDU *apdu_req)
+
+void yf::Virt_db::Frontend::fixup_npr(Z_Records *records, std::string database,
+                                      ODR odr)
+{
+    if (records && records->which == Z_Records_DBOSD)
+    {
+        Z_NamePlusRecordList *nprlist = records->u.databaseOrSurDiagnostics;
+        int i;
+        for (i = 0; i < nprlist->num_records; i++)
+        {
+            Z_NamePlusRecord *npr = nprlist->records[i];
+            npr->databaseName = odr_strdup(odr, database.c_str());
+        }
+    }
+}
+
+void yf::Virt_db::Frontend::fixup_npr(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)
+    {
+        fixup_npr(gdu->u.z3950->u.searchResponse->records, database, odr);
+        p.response() = gdu;
+    }
+}
+
+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;
@@ -492,6 +532,8 @@ 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);
+
     if (present_package.session().is_closed())
     {
         package.response() = present_package.response();
@@ -505,7 +547,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;
@@ -575,7 +617,8 @@ void yf::Virt_db::add_map_db2targets(std::string db,
                                      std::list<std::string> targets,
                                      std::string route)
 {
-    m_p->m_maps[db] = Virt_db::Map(targets, route);
+    m_p->m_maps[mp::util::database_name_normalize(db)] 
+        = Virt_db::Map(targets, route);
 }
 
 
@@ -586,10 +629,11 @@ void yf::Virt_db::add_map_db2target(std::string db,
     std::list<std::string> targets;
     targets.push_back(target);
 
-    m_p->m_maps[db] = Virt_db::Map(targets, route);
+    m_p->m_maps[mp::util::database_name_normalize(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);