plugin_init.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:21k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_init.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:56:32  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_init.cpp,v 1000.5 2004/06/01 20:56:32 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *           Anatoliy Kuznetsov
  36.  *
  37.  * File Description:
  38.  *    CGBenchPluginInit -- single standard autoloading plugin for Genome
  39.  *                         Workbench
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include "plugin_init.hpp"
  43. #include <bdb/bdb_blobcache.hpp>
  44. #include <corelib/ncbiapp.hpp>
  45. #include <corelib/ncbireg.hpp>
  46. #include <corelib/ncbitime.hpp> 
  47. #include <corelib/ncbi_process.hpp>
  48. #include <gui/core/data_store.hpp>
  49. #include <gui/core/doc_manager.hpp>
  50. #include <gui/core/plugin_exception.hpp>
  51. #include <gui/core/plugin_handle.hpp>
  52. #include <gui/core/plugin_registry.hpp>
  53. #include <gui/utils/system_path.hpp>
  54. #include <gui/core/version.hpp>
  55. #include <gui/plugin/PluginCommand.hpp>
  56. #include <gui/plugin/PluginCommandSet.hpp>
  57. #include <gui/plugin/PluginInfo.hpp>
  58. #include <gui/plugin/PluginValueConstraint.hpp>
  59. #include <gui/utils/message_box.hpp>
  60. #include <objmgr/object_manager.hpp>
  61. #include <objtools/data_loaders/lds/lds_dataloader.hpp>
  62. #include <objtools/data_loaders/genbank/gbloader.hpp>
  63. #include <objtools/data_loaders/genbank/readers/id1/reader_id1_cache.hpp>
  64. #include <objtools/lds/admin/lds_admin.hpp>
  65. #include <objtools/lds/lds.hpp>
  66. #include <objtools/lds/lds_reader.hpp>
  67. BEGIN_NCBI_SCOPE
  68. USING_SCOPE(objects);
  69. void CGBenchPluginInit::GetInfo(CPluginInfo& info)
  70. {
  71.     info.Reset();
  72.     // version info macro
  73.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  74.                  string(__DATE__) + " " + string(__TIME__),
  75.                  "CGBenchPluginInit", "", "", "");
  76.     // command info
  77.     info.SetCommands().AddAlgoCommand(eAlgoCommand_run);
  78.     info.SetAutorun(true);
  79. }
  80. void CGBenchPluginInit::RunCommand(CPluginMessage& msg)
  81. {
  82.     CPluginReply& reply = msg.SetReply();
  83.     //
  84.     // first, set up our stock data loaders
  85.     // these must be present for sequence ID resolution to work correctly
  86.     //
  87.     // Create GenBank data loader and register it with the OM.
  88.     // The last argument "eDefault" informs the OM that the loader must
  89.     // be included in scopes during the CScope::AddDefaults() call.
  90.     try {
  91.         x_InitGenBank();
  92.     }
  93.     catch (CException& e) {
  94.         LOG_POST(Error << "error creating GenBank data loader: " << e.what());
  95.         string msg("Error connecting to GenBank:n");
  96.         msg += e.GetMsg();
  97.         msg += "nGenBank will not be available.";
  98.         NcbiMessageBox(msg);
  99.     }
  100. #ifndef _DEBUG
  101.     catch (...) {
  102.         LOG_POST(Error << "unknown error creating GenBank data loader");
  103.         NcbiMessageBox("An unknown error has occurred while trying to "
  104.                        "connect to GenBank");
  105.     }
  106. #endif
  107.     //
  108.     // initialize the local data storage
  109.     //
  110.     try {
  111.         x_InitLDS();
  112.     }
  113.     catch(CException& e) {
  114.         LOG_POST(Error << "error initializing local data storage: "
  115.                  << e.what());
  116.         string msg("Error initializing local data storage:n");
  117.         msg += e.GetMsg();
  118.         msg += "nLDS will not be available.";
  119.         NcbiMessageBox(msg);
  120.     }
  121. #ifndef _DEBUG
  122.     catch (...) {
  123.         LOG_POST(Error << "unknown error creating GenBank data loader");
  124.         NcbiMessageBox("An unknown error has occurred while trying to "
  125.                        "initialize the local data stores.");
  126.     }
  127. #endif
  128.     //
  129.     // PLANNED:
  130.     //
  131.     // - establish named pipe for gbench-agent (our mime droid)
  132.     // - check NCBI to see if there are any gbench updates
  133.     // - evaluate history to see what the user has looked at recently and see
  134.     //   if there are any recent changes in those sequences / organisms
  135.     // - check the user's cubby at NCBI to see if there are any updates in any
  136.     //   watched files
  137.     //
  138.     reply.SetStatus(eMessageStatus_success);
  139. }
  140. //
  141. // Create our GenBank connection
  142. //
  143. void CGBenchPluginInit::x_InitGenBank()
  144. {
  145.     CNcbiApplication* app = CNcbiApplication::Instance();
  146.     _ASSERT(app);
  147.     CNcbiRegistry& reg = app->GetConfig();
  148.     // general genbank loader options
  149.     int gc_size   = reg.GetInt("GBLOADER", "GcSize", 10000,
  150.                                CNcbiRegistry::eErrPost);
  151.     int priority  = reg.GetInt("GBLOADER", "Priority", 99,
  152.                                CNcbiRegistry::eErrPost);
  153.     // caching options
  154.     string cache_path = CSystemPath::ResolvePath("<home>", "cache");
  155.     cache_path    = reg.GetString("GBLOADER", "CachePath", cache_path,
  156.                                   CNcbiRegistry::eErrPost);
  157.     int cache_age = reg.GetInt("GBLOADER", "CacheAge", 5,
  158.                                CNcbiRegistry::eErrPost);
  159.     if (cache_age == 0) {
  160.         cache_age = 5;   // keep objects for 5 days (default)
  161.     }
  162.     // ID resolution time in hours
  163.     int id_resolution_time = reg.GetInt("GBLOADER",
  164.                                         "IdResolutionTime", 24,
  165.                                         CNcbiRegistry::eErrPost);
  166.     if (id_resolution_time > 24 * 3) 
  167.         id_resolution_time = 24 * 3; //  correct the unreasonable value
  168.     bool disable_cache = reg.GetBool("GBLOADER", "DisableCache", false,
  169.                                      CNcbiRegistry::eErrPost);
  170.     auto_ptr<CCachedId1Reader> id1_reader;
  171.     if (!cache_path.empty()  &&  !disable_cache) {
  172.         try {
  173.             auto_ptr<CBDB_Cache> bc(new CBDB_Cache());
  174.             try {
  175.                 ICache::TTimeStampFlags flags =
  176.                     ICache::fTimeStampOnRead |
  177.                     ICache::fExpireLeastFrequentlyUsed |
  178.                     ICache::fPurgeOnStartup;
  179.                 bc->SetTimeStampPolicy(flags, cache_age*24*60*60);
  180.                 bc->Open(cache_path.c_str(), "blobs", CBDB_Cache::ePidLock);
  181.                 // Cache cleaning
  182.                 // Objects age should be assigned in days, negative value
  183.                 // means cleaning is disabled
  184.                 if (cache_age > 0) {
  185.                     CTime time_stamp(CTime::eCurrent);
  186.                     time_t age = time_stamp.GetTimeT();
  187.                     age -= 60 * 60 * 24 * cache_age;
  188.                     bc->Purge(age);
  189.                 }
  190.             } catch (CPIDGuardException& ex) {
  191.                 switch (ex.GetErrCode())
  192.                 {
  193.                 case CPIDGuardException::eStillRunning:
  194.                     // We probably(!) have another program competing for cache,
  195.                     // So this copy is not getting access
  196.                     LOG_POST(Error << "GenBank Cache is in use by another process");
  197.                     LOG_POST(Error << "Local caching will be disabled.");
  198.                     throw;
  199.                 default:
  200.                     throw;
  201.                 } // switch
  202.             }
  203.             auto_ptr<CBDB_Cache> idc(new CBDB_Cache());
  204.             try {
  205.                 ICache::TTimeStampFlags flags =
  206.                     ICache::fTimeStampOnCreate|
  207.                     ICache::fCheckExpirationAlways;
  208.                 idc->SetTimeStampPolicy(flags, id_resolution_time * 60 * 60);
  209.                 idc->Open(cache_path.c_str(), "idc", CBDB_Cache::ePidLock);
  210.             } catch (CPIDGuardException& ex) {
  211.                 switch (ex.GetErrCode())
  212.                 {
  213.                 case CPIDGuardException::eStillRunning:
  214.                     // We probably(!) have another program competing for cache,
  215.                     // So this copy is not getting access
  216.                     LOG_POST(Error << "GenBank Cache is in use by another process");
  217.                     LOG_POST(Error << "Local caching will be disabled.");
  218.                     throw;
  219.                 default:
  220.                     throw;
  221.                 } // switch
  222.             }
  223.             CRef<CBDB_CacheHolder> 
  224.                        cache_holder(new CBDB_CacheHolder(bc.release(),
  225.                                                          idc.release()));
  226.             CDataStore::PutObject("BDB_Cache", *cache_holder);
  227.             id1_reader.reset(new CCachedId1Reader(5, 
  228.                                                   cache_holder->GetBlobCache(), 
  229.                                                   cache_holder->GetIdCache()));
  230.             LOG_POST(Info << "ID1 cache enabled at " << cache_path);
  231.         }
  232.         catch(CException& e) {
  233.             LOG_POST(Error << "ID1 cache initialization failed in "
  234.                      << cache_path << ": "
  235.                      << e.what());
  236.         }
  237. #ifndef _DEBUG
  238.         catch(...) {
  239.             LOG_POST(Error << "ID1 cache initialization failed in "
  240.                      << cache_path);
  241.         }
  242. #endif
  243.     } else {
  244.         LOG_POST(Info << "ID1 cache disabled.");
  245.     }
  246.     CRef<CGBDataLoader> loader
  247.         (new CGBDataLoader("GenBank", id1_reader.release(), gc_size));
  248.     if ( !loader  ) {
  249.         NCBI_THROW(CPluginException, eUnknownError,
  250.                    "CGBenchPluginInit(): "
  251.                    "can't create GenBank data loader");
  252.     }
  253.     CDocManager::GetObjectManager()
  254.         .RegisterDataLoader(*(loader.Release()),
  255.                             CObjectManager::eDefault, priority);
  256.     LOG_POST(Info << "registered GenBank data loader");
  257. }
  258. //
  259. // Create our local data storage connections
  260. //
  261. void CGBenchPluginInit::x_InitLDS()
  262. {
  263.     CNcbiApplication* app = CNcbiApplication::Instance();
  264.     _ASSERT(app);
  265.     const CNcbiRegistry& reg = app->GetConfig();
  266.     CRef<CLDS_DatabaseHolder> dbh(new CLDS_DatabaseHolder());
  267.     // Discover all LDS_* sections in the application registry
  268.     //
  269.     list<string> sections;
  270.     list<string> lds_sections;
  271.     reg.EnumerateSections(&sections);
  272.     ITERATE (list<string>, it, sections) {
  273.         if (it->find("LDS") == 0) {
  274.             lds_sections.push_back(*it);
  275.         }
  276.     }
  277.     vector<string>  plugin_aliases;
  278.     ITERATE(list<string>, it, lds_sections) {
  279.         string lds_section_name = *it;
  280.         string lds_path = 
  281.             reg.GetString(lds_section_name, "Path", "", CNcbiRegistry::eErrPost);
  282.         string lds_alias = 
  283.             reg.GetString(lds_section_name, "Alias", "Default", CNcbiRegistry::eReturn);
  284.         if (lds_path.empty()) {
  285.             LOG_POST(Error << "LDS: database " << lds_section_name 
  286.                            << " " << lds_alias << " ignored. No path.");
  287.             continue;
  288.         }
  289.         // Check if the database already open
  290.         {{
  291.             CLDS_Database* db1 = dbh->GetDatabase(lds_alias);
  292.             if (db1) {
  293.                 LOG_POST(Error << "LDS: database " << lds_section_name 
  294.                            << " alias=" << lds_alias 
  295.                            << " ignored. Alias already exists.");
  296.                 continue;
  297.             }
  298.         }}
  299.         bool recurse_sub_dir = 
  300.             reg.GetBool(lds_section_name, "SubDir", true, 0, CNcbiRegistry::eErrPost);
  301.         CLDS_Management::ERecurse recurse = 
  302.             (recurse_sub_dir) ? CLDS_Management::eRecurseSubDirs : 
  303.                                 CLDS_Management::eDontRecurse;
  304.         bool crc32 = 
  305.             reg.GetBool(lds_section_name, "ControlSum", true, 0, CNcbiRegistry::eErrPost);
  306.         // if ControlSum key is true (default), try an laternative "CRC32" key
  307.         // (more straightforward synonym for the same setting)
  308.         if (crc32) {
  309.             crc32 = reg.GetBool(lds_section_name, "CRC32", true, 0, CNcbiRegistry::eErrPost);
  310.         }
  311.         CLDS_Management::EComputeControlSum control_sum =
  312.             (crc32) ? CLDS_Management::eComputeControlSum : 
  313.                       CLDS_Management::eNoControlSum;
  314.         bool is_created;
  315.         CLDS_Database *ldb = 
  316.             CLDS_Management::OpenCreateDB(lds_path, "lds.db", 
  317.                                           &is_created, recurse, 
  318.                                           control_sum);
  319.         if (!lds_alias.empty()) {
  320.             ldb->SetAlias(lds_alias);
  321.         }
  322.         dbh->AddDatabase(ldb);
  323.         if (!is_created) {
  324.             CLDS_Management mgmt(*ldb);
  325.             mgmt.SyncWithDir(lds_path, recurse, control_sum);
  326.         }
  327.         plugin_aliases.push_back(lds_alias);
  328.   
  329.         // Adding NON DEFAULT LDS dataloader
  330.         // To be activated later in the LDS derived scopes by the dload_basic plugin
  331.         try {
  332.             string dl_name = string("LDS_dataloader_") + lds_alias;
  333.             CRef<CLDS_DataLoader> loader(new CLDS_DataLoader(*ldb, dl_name));
  334.             if ( !loader  ) {
  335.                 NCBI_THROW(CPluginException, eUnknownError,
  336.                            "CGBenchPluginInit(): "
  337.                            "can't create LDS data loader");
  338.             }
  339.             CDocManager::GetObjectManager()
  340.                 .RegisterDataLoader(*(loader.Release()),
  341.                                     CObjectManager::eNonDefault, 80);
  342.             LOG_POST(Info << "LDS: registered data loader: " << dl_name);
  343.         }
  344.         catch (CException& e) {
  345.             LOG_POST(Error << "error creating LDS data loader: " 
  346.                            << e.what() << " Alias:" << lds_alias);
  347.             string msg("Error creating LDS data loader:n");
  348.             msg += e.GetMsg();
  349.             msg += "nLocal data storage will not be available.";
  350.             msg += "Alias: " + lds_alias;
  351.             NcbiMessageBox(msg);
  352.         }
  353.         //break; // TODO: This break is temporary
  354.     } // ITERATE
  355.     //
  356.     // twiddle the plugin registry to handle our aliases
  357.     //
  358.     if (plugin_aliases.size() > 0) {
  359.         CPluginHandle handle = CPluginRegistry::GetPlugin("CLDS_Loader");
  360.         if (handle) {
  361.             //
  362.             // this is a (dangerous!) hack
  363.             // DON"T CHANGE THE MENU ITEM!!!!
  364.             //
  365.             // search for the load data command
  366.             CPluginInfo& info = const_cast<CPluginInfo&> (handle.GetInfo());
  367.             NON_CONST_ITERATE (CPluginInfo::TCommands::TData, cmd_iter,
  368.                                info.SetCommands().SetData()) {
  369.                 CPluginCommand& cmd = **cmd_iter;
  370.                 if ( cmd.GetCommand() != eDataCommand_load ) {
  371.                     continue;
  372.                 }
  373.                 string default_lds_alias = *(plugin_aliases.begin());
  374.                 //
  375.                 // found it.  Add an argument for our aliases
  376.                 //
  377.                 cmd.AddDefaultArgument("alias", "Directory to load from",
  378.                                        CPluginArg::eString, default_lds_alias);
  379.                 CRef<CPluginValueConstraint> cnst
  380.                     (CPluginValueConstraint::CreateSet());
  381.                 ITERATE(vector<string>, alias, plugin_aliases) {
  382.                     *cnst, *alias;
  383.                 }
  384.                 cmd.SetConstraint("alias", *cnst);
  385.                 break;
  386.             }
  387.         }
  388.     }
  389.     CDataStore::PutObject("LDS_Database", *dbh);
  390. }
  391. END_NCBI_SCOPE
  392. /*
  393.  * ===========================================================================
  394.  * $Log: plugin_init.cpp,v $
  395.  * Revision 1000.5  2004/06/01 20:56:32  gouriano
  396.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  397.  *
  398.  * Revision 1.42  2004/05/21 22:27:47  gorelenk
  399.  * Added PCH ncbi_pch.hpp
  400.  *
  401.  * Revision 1.41  2004/05/03 13:04:16  dicuccio
  402.  * Made log-post message for cache use conflict more user friendly
  403.  *
  404.  * Revision 1.40  2004/04/09 20:14:30  dicuccio
  405.  * Don't add the trace chromatogram loader by default
  406.  *
  407.  * Revision 1.39  2004/03/25 14:31:28  dicuccio
  408.  * Added TRACE chromatogram data loader
  409.  *
  410.  * Revision 1.38  2004/02/27 17:33:11  kuznets
  411.  * Removed CCacheHolder, it now lives in BDB library.
  412.  *
  413.  * Revision 1.37  2004/02/27 15:34:34  kuznets
  414.  * Id1 reader initialization: replaced old local cache with new ICache
  415.  * implementation (the old one is supposed to be phased out from the toolkit)
  416.  *
  417.  * Revision 1.36  2004/02/17 20:35:27  rsmith
  418.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  419.  *
  420.  * Revision 1.35  2004/02/17 17:19:57  dicuccio
  421.  * Moved all LOCAL_CACHE entries into GBLOADER section of registry
  422.  *
  423.  * Revision 1.34  2004/01/27 18:42:58  dicuccio
  424.  * Added flag to diable local cache.  CLeaned up processing of indexed local
  425.  * directories
  426.  *
  427.  * Revision 1.33  2004/01/05 18:09:43  vasilche
  428.  * Fixed path to genbank loader and readers.
  429.  *
  430.  * Revision 1.32  2003/12/09 15:46:54  dicuccio
  431.  * Use CException::GetMsg() instead of what()
  432.  *
  433.  * Revision 1.31  2003/12/02 14:41:42  dicuccio
  434.  * Restored autorun
  435.  *
  436.  * Revision 1.30  2003/11/26 17:16:18  dicuccio
  437.  * Use the correct class name for registering the initialization plugin
  438.  *
  439.  * Revision 1.29  2003/11/24 15:43:12  dicuccio
  440.  * Added new tip-of-the-day dialog.  Changed CVersion to CPluginVersion
  441.  *
  442.  * Revision 1.28  2003/11/04 17:49:23  dicuccio
  443.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  444.  * CPluginCommand/CPluginReply
  445.  *
  446.  * Revision 1.27  2003/10/29 15:10:12  kuznets
  447.  * Fixed crash on trying to change the lds pluging arguments when gbench.ini does
  448.  * not have any LDS instances.
  449.  *
  450.  * Revision 1.26  2003/10/28 14:22:07  kuznets
  451.  * Working on support of multiple LDS instances.
  452.  *
  453.  * Revision 1.25  2003/10/27 19:58:21  kuznets
  454.  * Added application registry scan for multiple LDS instances
  455.  * (not enabled yet)
  456.  *
  457.  * Revision 1.24  2003/10/24 12:41:14  kuznets
  458.  * Added cache locking. Removed explicit local cache directory check
  459.  * (lives in cache implementation now)
  460.  *
  461.  * Revision 1.23  2003/10/23 13:33:57  dicuccio
  462.  * Modify plugin arguments for LDS loader plugin to add a drop-down box for data
  463.  * alias
  464.  *
  465.  * Revision 1.22  2003/10/21 16:21:22  kuznets
  466.  * Enabled Id resolution cache for (cached id1 reader)
  467.  *
  468.  * Revision 1.21  2003/10/20 18:19:51  kuznets
  469.  * Changed cache ownership scheme.
  470.  * Now cache is dumped into a common reusable gbench data store (CDataStore)
  471.  * (it was owned by the ID1 reader before)
  472.  *
  473.  * Revision 1.20  2003/10/16 15:49:49  dicuccio
  474.  * Properly set the plugin reply status
  475.  *
  476.  * Revision 1.19  2003/10/14 16:25:04  dicuccio
  477.  * Moved GenBank data loader initialization into a separate function - easiter to
  478.  * follow the code this way
  479.  *
  480.  * Revision 1.18  2003/10/09 19:56:47  kuznets
  481.  * Added registry controlled alias to LDS database
  482.  *
  483.  * Revision 1.17  2003/10/08 18:21:26  kuznets
  484.  * Reflecting changes in LDS library API
  485.  *
  486.  * Revision 1.16  2003/10/07 18:28:20  dicuccio
  487.  * FIxed access to auto_ptr<> after release
  488.  *
  489.  * Revision 1.15  2003/10/07 13:40:08  dicuccio
  490.  * Code clean-up.  Use auto_ptr<> to manage memory locally.  Added default cache
  491.  * path if no path is found.
  492.  *
  493.  * Revision 1.14  2003/10/06 20:22:13  kuznets
  494.  * Added support for sub directories and option to disable CRC32 for files:
  495.  *  [LDS]
  496.  *    SubDir
  497.  *    ControlSum (alt.name CRC32)
  498.  *
  499.  * Revision 1.13  2003/10/06 16:31:21  kuznets
  500.  * Cache purge re-enabled.
  501.  *
  502.  * Revision 1.12  2003/10/06 15:58:05  dicuccio
  503.  * Various changes:
  504.  *     - Disabled cache purge (temporarily)
  505.  *     - Ensure the cache directory exists at app start-up
  506.  *     - Changed default priority of local data store
  507.  *     - Changed garbage collection trigger size
  508.  *
  509.  * Revision 1.11  2003/10/06 15:15:08  kuznets
  510.  * Added cache cleaning code (cache keeps objects for 5 days (default value))
  511.  *
  512.  * Revision 1.10  2003/10/06 14:33:32  kuznets
  513.  * Implemented local cache for the id1 reader
  514.  *
  515.  * Revision 1.9  2003/08/19 14:35:20  kuznets
  516.  * LDS dataloader re-included. Now as a NON DEFAULT dataloader.
  517.  * (To be later activated in the LDS derived scopes)
  518.  *
  519.  * Revision 1.8  2003/08/19 13:44:27  kuznets
  520.  * LDS dataloader excluded from the list of default loaders.
  521.  *
  522.  * Revision 1.7  2003/08/15 19:38:28  dicuccio
  523.  * Added setting of GenBank data loader settings in .ini file
  524.  *
  525.  * Revision 1.6  2003/08/05 15:24:42  kuznets
  526.  * Redefined default priorities for OM data loaders (GenBank