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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bdb_util.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:37:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bdb_util.cpp,v 1000.1 2004/06/01 18:37:39 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: BDB library utilities. 
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <bdb/bdb_util.hpp>
  41. #include <util/strsearch.hpp>
  42. BEGIN_NCBI_SCOPE
  43. /// Check if field is a variant of string, returns pointer on the
  44. /// internal buffer (or NULL).
  45. ///
  46. /// @internal
  47. static
  48. const char* BDB_GetStringFieldBuf(const CBDB_Field& fld)
  49. {
  50.     const CBDB_FieldString* str_fld = 
  51.           dynamic_cast<const CBDB_FieldString*>(&fld);
  52.     if (str_fld) {
  53.         return (const char*)fld.GetBuffer();
  54.     } else {
  55.         const CBDB_FieldLString* lstr_fld = 
  56.               dynamic_cast<const CBDB_FieldLString*>(&fld);
  57.         if (lstr_fld) {
  58.             return (const char*)fld.GetBuffer();
  59.         }
  60.     }
  61.     return 0;
  62. }
  63. /// Search for value in the field buffer
  64. ///
  65. /// @return -1 if not found, otherwise field number
  66. ///
  67. /// @internal
  68. static
  69. int BDB_find_field(const CBDB_BufferManager& buffer_man,
  70.                    const CBoyerMooreMatcher& matcher)
  71. {
  72.     int fidx = -1;
  73.     unsigned int fcount = buffer_man.FieldCount();
  74.     for (unsigned i = 0; i < fcount; ++i) {
  75.         const CBDB_Field& fld = buffer_man.GetField(i);
  76.         if (fld.IsNull()) {
  77.             continue;
  78.         }
  79.         unsigned str_buf_len;
  80.         const char* str_buf = BDB_GetStringFieldBuf(fld);
  81.         if (str_buf && (str_buf_len = fld.GetDataLength(str_buf))) {
  82.             int pos = matcher.Search(str_buf, 0, str_buf_len);
  83.             if (pos >= 0) {
  84.                 fidx = i;
  85.                 break;
  86.             }
  87.         }
  88.     } // for i
  89.     return fidx;
  90. }
  91. CBDB_File::TUnifiedFieldIndex BDB_find_field(const CBDB_File& dbf, 
  92.                                              const CBoyerMooreMatcher& matcher)
  93. {
  94.     CBDB_File::TUnifiedFieldIndex fidx = 0;
  95.     const CBDB_BufferManager* buffer_man;
  96.     buffer_man =  dbf.GetKeyBuffer();
  97.     if (buffer_man) {
  98.         fidx = BDB_find_field(*buffer_man, matcher);
  99.         if (fidx >= 0) {
  100.             fidx = BDB_GetUFieldIdx(fidx, true /* key */);
  101.             return fidx;
  102.         } else {
  103.             fidx = 0;
  104.         }
  105.     }
  106.     buffer_man =  dbf.GetDataBuffer();
  107.     if (buffer_man) {
  108.         fidx = BDB_find_field(*buffer_man, matcher);
  109.         if (fidx >= 0) {
  110.             fidx = BDB_GetUFieldIdx(fidx, false /* key */);
  111.             return fidx;        
  112.         } else {
  113.             fidx = 0;
  114.         }
  115.     }
  116.     return fidx;
  117. }
  118. int BDB_get_rowid(const CBDB_File& dbf)
  119. {
  120.     const CBDB_BufferManager* buffer_man;
  121.     buffer_man =  dbf.GetKeyBuffer();
  122.     if (!buffer_man) {
  123.         return 0;
  124.     }
  125.     const CBDB_Field& fld = buffer_man->GetField(0);
  126.     {{
  127.     const CBDB_FieldInt2* fi = dynamic_cast<const CBDB_FieldInt2*>(&fld);
  128.     if (fi)
  129.         return fi->Get();
  130.     }}
  131.     {{
  132.     const CBDB_FieldInt4* fi = dynamic_cast<const CBDB_FieldInt4*>(&fld);
  133.     if (fi)
  134.         return fi->Get();
  135.     }}
  136.     {{
  137.     const CBDB_FieldUint4* fi = dynamic_cast<const CBDB_FieldUint4*>(&fld);
  138.     if (fi)
  139.         return fi->Get();
  140.     }}
  141.     return 0;
  142. }
  143. END_NCBI_SCOPE
  144. /*
  145.  * ===========================================================================
  146.  * $Log: bdb_util.cpp,v $
  147.  * Revision 1000.1  2004/06/01 18:37:39  gouriano
  148.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  149.  *
  150.  * Revision 1.4  2004/05/17 20:55:12  gorelenk
  151.  * Added include of PCH ncbi_pch.hpp
  152.  *
  153.  * Revision 1.3  2004/03/11 13:15:40  kuznets
  154.  * Minor bugfix
  155.  *
  156.  * Revision 1.2  2004/03/10 14:03:11  kuznets
  157.  * + BDB_get_rowid
  158.  *
  159.  * Revision 1.1  2004/03/08 13:34:06  kuznets
  160.  * Initial revision
  161.  *
  162.  *
  163.  * ===========================================================================
  164.  */