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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdbcommon.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:46:36  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seqdbcommon.cpp,v 1000.1 2004/06/01 19:46:36 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:  Kevin Bealer
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <corelib/metareg.hpp>
  39. #include <corelib/ncbienv.hpp>
  40. #include <corelib/ncbifile.hpp>
  41. #include <objtools/readers/seqdb/seqdbcommon.hpp>
  42. BEGIN_NCBI_SCOPE
  43. // debug tricks/tools
  44. int seqdb_debug_class = 0; // debug_mvol | debug_alias;
  45. string SeqDB_GetFileName(string s)
  46. {
  47.     size_t off = s.find_last_of("/");
  48.     
  49.     if (off != s.npos) {
  50.         s.erase(0, off + 1);
  51.     }
  52.     
  53.     return s;
  54. }
  55. string SeqDB_GetDirName(string s)
  56. {
  57.     size_t off = s.find_last_of("/");
  58.     
  59.     if (off != s.npos) {
  60.         s.erase(off);
  61.     }
  62.     
  63.     return s;
  64. }
  65. string SeqDB_GetBasePath(string s)
  66. {
  67.     size_t off = s.find_last_of(".");
  68.     
  69.     if (off != s.npos) {
  70.         s.erase(off);
  71.     }
  72.     
  73.     return s;
  74. }
  75. string SeqDB_GetBaseName(string s)
  76. {
  77.     return SeqDB_GetBasePath( SeqDB_GetFileName(s) );
  78. }
  79. string SeqDB_CombinePath(const string & one, const string & two)
  80. {
  81.     char delim = CFile::GetPathSeparator();
  82.     
  83.     if (two.empty()) {
  84.         return one;
  85.     }
  86.     
  87.     if (one.empty() || two[0] == delim) {
  88.         return two;
  89.     }
  90.     
  91.     string result;
  92.     result.reserve(one.size() + two.size() + 1);
  93.     
  94.     result += one;
  95.     
  96.     if (result[one.size() - 1] != delim) {
  97.         result += delim;
  98.     }
  99.     
  100.     result += two;
  101.     
  102.     return result;
  103. }
  104. static bool s_SeqDB_DBExists(const string & dbname, char dbtype)
  105. {
  106.     return (CFile(dbname + "." + dbtype + "al").Exists() ||
  107.             CFile(dbname + "." + dbtype + "in").Exists());
  108. }
  109. static string s_SeqDB_TryPaths(const string & blast_paths,
  110.                                const string & dbname,
  111.                                char           dbtype)
  112. {
  113.     vector<string> roads;
  114.     NStr::Tokenize(blast_paths, ":", roads, NStr::eMergeDelims);
  115.     
  116.     string result;
  117.     
  118.     for(Uint4 i = 0; i < roads.size(); i++) {
  119.         string attempt = SeqDB_CombinePath(roads[i], dbname);
  120.         
  121.         if (s_SeqDB_DBExists(attempt, dbtype)) {
  122.             result = attempt;
  123.             break;
  124.         }
  125.     }
  126.     
  127.     return result;
  128. }
  129. string SeqDB_FindBlastDBPath(const string & dbname, char dbtype)
  130. {
  131.     // Local directory first;
  132.     
  133.     string pathology(".:");
  134.     
  135.     // Then, BLASTDB;
  136.     
  137.     CNcbiEnvironment env;
  138.     pathology += env.Get("BLASTDB");
  139.     pathology += ":";
  140.     
  141.     // Finally, the config file.
  142.     
  143.     CMetaRegistry::SEntry sentry =
  144.         CMetaRegistry::Load("ncbi", CMetaRegistry::eName_RcOrIni);
  145.     if (sentry.registry) {
  146.         pathology += sentry.registry->Get("BLAST", "BLASTDB");
  147.         pathology += ":";
  148.     }
  149.     
  150.     // Time to field test this new and terrible weapon.
  151.     
  152.     return s_SeqDB_TryPaths(pathology, dbname, dbtype);
  153. }
  154. END_NCBI_SCOPE