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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: lds.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:45:47  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: lds.cpp,v 1000.2 2004/06/01 19:45:47 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.  * Author: Anatoliy Kuznetsov
  35.  *
  36.  * File Description:  LDS implementation.
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbifile.hpp>
  41. #include <bdb/bdb_cursor.hpp>
  42. #include <objtools/lds/lds.hpp>
  43. #include <objtools/lds/admin/lds_object.hpp>
  44. #include <objtools/lds/admin/lds_files.hpp>
  45. BEGIN_NCBI_SCOPE
  46. BEGIN_SCOPE(objects)
  47. CLDS_Database::CLDS_Database(const string& db_dir_name, 
  48.                              const string& db_name,
  49.                              const string& alias)
  50. : m_LDS_DirName(db_dir_name),
  51.   m_LDS_DbName(db_name)
  52. {
  53.     if (alias.empty()) {
  54.         m_Alias = db_dir_name;
  55.     }
  56.     else {
  57.         m_Alias = alias;
  58.     }
  59. }
  60. CLDS_Database::CLDS_Database(const string& db_dir_name,
  61.                              const string& alias)
  62. : m_LDS_DirName(db_dir_name)
  63. {
  64.     m_LDS_DbName = "lds.db";
  65.     if (alias.empty()) {
  66.         m_Alias = db_dir_name;
  67.     }
  68.     else {
  69.         m_Alias = alias;
  70.     }
  71. }
  72. CLDS_Database::~CLDS_Database()
  73. {
  74.     LOG_POST(Info << "Closing LDS database: " << m_LDS_DbName);
  75. }
  76. void CLDS_Database::Create()
  77. {
  78.     string fname;
  79.     LOG_POST(Info << "Creating LDS database: " << m_LDS_DbName);
  80.     {{
  81.         m_LDS_DirName = CDirEntry::AddTrailingPathSeparator(m_LDS_DirName);
  82.         // Conditionally add LDS subdirectory name 
  83.         // TODO: make name check more robust
  84.         if (m_LDS_DirName.find("LDS") == string::npos) {
  85.             m_LDS_DirName = CDirEntry::AddTrailingPathSeparator(m_LDS_DirName);
  86.             m_LDS_DirName += "LDS";
  87.             m_LDS_DirName = CDirEntry::AddTrailingPathSeparator(m_LDS_DirName);
  88.         }
  89.         CDir  lds_dir(m_LDS_DirName);
  90.         if (!lds_dir.Exists()) {
  91.             if (!lds_dir.Create()) {
  92.                 LDS_THROW(eCannotCreateDir, 
  93.                           "Cannot create directory:"+m_LDS_DirName);
  94.             }
  95.         }
  96.     }}
  97.     LOG_POST(Info << "Creating LDS table: " << "file");
  98.     fname = m_LDS_DirName + "lds_file.db"; 
  99.     m_db.file_db.Open(fname.c_str(),
  100.                       "file",
  101.                       CBDB_RawFile::eCreate);
  102.     LOG_POST(Info << "Creating LDS table: " << "objecttype");
  103.     fname = m_LDS_DirName + "lds_objecttype.db"; 
  104.     m_db.object_type_db.Open(fname.c_str(),
  105.                              "objecttype",
  106.                              CBDB_RawFile::eCreate);
  107.     LOG_POST(Info << "Creating LDS table: " << "object");
  108.     fname = m_LDS_DirName + "lds_object.db"; 
  109.     m_db.object_db.Open(fname.c_str(),
  110.                     "object",
  111.                     CBDB_RawFile::eCreate);
  112. /*
  113.     LOG_POST(Info << "Creating LDS table: " << "objectattr");
  114.     fname = m_LDS_DirName + "lds_objectattr.db"; 
  115.     m_db.object_attr_db.Open(fname.c_str(),
  116.                              "objectattr",
  117.                              CBDB_RawFile::eCreate);
  118. */
  119.     LOG_POST(Info << "Creating LDS table: " << "annotation");
  120.     fname = m_LDS_DirName + "lds_annotation.db"; 
  121.     m_db.annot_db.Open(fname.c_str(),
  122.                        "annotation",
  123.                        CBDB_RawFile::eCreate);
  124.     LOG_POST(Info << "Creating LDS table: " << "annot2obj");
  125.     fname = m_LDS_DirName + "lds_annot2obj.db"; 
  126.     m_db.annot2obj_db.Open(fname.c_str(),
  127.                            "annot2obj",
  128.                            CBDB_RawFile::eCreate);
  129.     LOG_POST(Info << "Creating LDS table: " << "seq_id_list");
  130.     fname = m_LDS_DirName + "lds_seq_id_list.db"; 
  131.     m_db.seq_id_list.Open(fname.c_str(),
  132.                           "seq_id_list",
  133.                           CBDB_RawFile::eCreate);
  134. }
  135. void CLDS_Database::Sync()
  136. {
  137.     m_db.annot2obj_db.Sync();
  138.     m_db.annot_db.Sync();
  139.     m_db.file_db.Sync();
  140. //    m_db.object_attr_db.Sync();
  141.     m_db.object_db.Sync();
  142.     m_db.object_type_db.Sync();
  143.     m_db.seq_id_list.Sync();    
  144. }
  145. void CLDS_Database::Open()
  146. {
  147.     string fname;
  148.     m_LDS_DirName = CDirEntry::AddTrailingPathSeparator(m_LDS_DirName);
  149.     if (m_LDS_DirName.find("LDS") == string::npos) {
  150.         m_LDS_DirName += "LDS";
  151.         m_LDS_DirName = CDirEntry::AddTrailingPathSeparator(m_LDS_DirName);
  152.     }
  153.     fname = m_LDS_DirName + "lds_file.db"; 
  154.     m_db.file_db.Open(fname.c_str(),
  155.                       "file",
  156.                       CBDB_RawFile::eReadWrite);
  157.     fname = m_LDS_DirName + "lds_objecttype.db"; 
  158.     m_db.object_type_db.Open(fname.c_str(),
  159.                              "objecttype",
  160.                              CBDB_RawFile::eReadWrite);
  161.     LoadTypeMap();
  162.     fname = m_LDS_DirName + "lds_object.db"; 
  163.     m_db.object_db.Open(fname.c_str(),
  164.                         "object",
  165.                         CBDB_RawFile::eReadWrite);
  166. /*
  167.     fname = m_LDS_DirName + "lds_objectattr.db"; 
  168.     m_db.object_attr_db.Open(fname.c_str(),
  169.                             "objectattr",
  170.                             CBDB_RawFile::eReadWrite);
  171. */
  172.     fname = m_LDS_DirName + "lds_annotation.db"; 
  173.     m_db.annot_db.Open(fname.c_str(),
  174.                        "annotation",
  175.                        CBDB_RawFile::eReadWrite);
  176.     fname = m_LDS_DirName + "lds_annot2obj.db"; 
  177.     m_db.annot2obj_db.Open(fname.c_str(),
  178.                            "annot2obj",
  179.                            CBDB_RawFile::eReadWrite);
  180.     fname = m_LDS_DirName + "lds_seq_id_list.db"; 
  181.     m_db.seq_id_list.Open(fname.c_str(),
  182.                           "seq_id_list",
  183.                            CBDB_RawFile::eReadWrite);
  184. }
  185. void CLDS_Database::LoadTypeMap()
  186. {
  187.     CBDB_FileCursor cur(m_db.object_type_db); 
  188.     cur.SetCondition(CBDB_FileCursor::eFirst); 
  189.     while (cur.Fetch() == eBDB_Ok) { 
  190.         m_ObjTypeMap.insert(pair<string, int>(string(m_db.object_type_db.type_name), 
  191.                                               m_db.object_type_db.object_type)
  192.                            );
  193.     }
  194. }
  195. CLDS_DatabaseHolder::CLDS_DatabaseHolder(CLDS_Database* db) 
  196. {
  197.     if (db) {
  198.         m_DataBases.push_back(db);
  199.     }
  200. }
  201. CLDS_DatabaseHolder::~CLDS_DatabaseHolder() 
  202.     ITERATE(vector<CLDS_Database*>, it, m_DataBases) {
  203.         CLDS_Database* db = *it;
  204.         delete db;
  205.     }   
  206. }
  207. CLDS_Database* CLDS_DatabaseHolder::GetDatabase(const string& alias)
  208. {
  209.     ITERATE(vector<CLDS_Database*>, it, m_DataBases) {
  210.         CLDS_Database* db = *it;
  211.         const string& db_alias = db->GetAlias();
  212.         if (db_alias == alias) {
  213.             return db;
  214.         }
  215.     }
  216.     return 0;
  217.     
  218. }
  219. void CLDS_DatabaseHolder::EnumerateAliases(vector<string>* aliases)
  220. {
  221.     ITERATE(vector<CLDS_Database*>, it, m_DataBases) {
  222.         CLDS_Database* db = *it;
  223.         const string& db_alias = db->GetAlias();
  224.         aliases->push_back(db_alias);
  225.     }
  226. }
  227. END_SCOPE(objects)
  228. END_NCBI_SCOPE
  229. /*
  230.  * ===========================================================================
  231.  * $Log: lds.cpp,v $
  232.  * Revision 1000.2  2004/06/01 19:45:47  gouriano
  233.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  234.  *
  235.  * Revision 1.17  2004/05/21 21:42:54  gorelenk
  236.  * Added PCH ncbi_pch.hpp
  237.  *
  238.  * Revision 1.16  2004/03/09 17:16:59  kuznets
  239.  * Merge object attributes with objects
  240.  *
  241.  * Revision 1.15  2003/10/29 16:23:31  kuznets
  242.  * Implemented CLDS_DatabaseHolder::EnumerateAliases
  243.  *
  244.  * Revision 1.14  2003/10/27 20:16:57  kuznets
  245.  * +CLDS_DatabaseHolder::GetDatabase
  246.  *
  247.  * Revision 1.13  2003/10/27 19:18:59  kuznets
  248.  * Added NULL database protection into CLDS_DatabaseHolder::CLDS_DatabaseHolder
  249.  *
  250.  * Revision 1.12  2003/10/09 18:12:26  kuznets
  251.  * Some functionality of lds migrated into lds_admin
  252.  *
  253.  * Revision 1.11  2003/10/09 16:48:33  kuznets
  254.  * Sync() implemented
  255.  *
  256.  * Revision 1.10  2003/10/08 18:19:52  kuznets
  257.  * Changes to support multi instance databases
  258.  *
  259.  * Revision 1.9  2003/08/12 14:12:05  kuznets
  260.  * All database files now created in separate LDS subdirectory.
  261.  *
  262.  * Revision 1.8  2003/08/11 20:01:00  kuznets
  263.  * Reworked lds database and file open procedure.
  264.  * Now all db tables are created in separate OS files, not colocate in one
  265.  * lds.db (looks like BerkeleyDB is not really supporting multiple tables in one file)
  266.  *
  267.  * Revision 1.7  2003/08/05 14:32:01  kuznets
  268.  * Reflecting changes in obj_sniff.hpp
  269.  *
  270.  * Revision 1.6  2003/07/09 19:33:40  kuznets
  271.  * Modified databse Open/Create procedures. (Reflecting new sequence id list table)
  272.  *
  273.  * Revision 1.5  2003/06/25 18:30:11  kuznets
  274.  * Fixed bug with creation of object attributes table
  275.  *
  276.  * Revision 1.4  2003/06/16 16:24:43  kuznets
  277.  * Fixed #include paths (lds <-> lds_admin separation)
  278.  *
  279.  * Revision 1.3  2003/06/16 15:39:18  kuznets
  280.  * Removing dead code
  281.  *
  282.  * Revision 1.2  2003/06/16 14:55:00  kuznets
  283.  * lds splitted into "lds" and "lds_admin"
  284.  *
  285.  * Revision 1.1  2003/06/03 14:13:25  kuznets
  286.  * Initial revision
  287.  *
  288.  *
  289.  * ===========================================================================
  290.  */