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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: driver_mgr.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:18:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: driver_mgr.cpp,v 1000.3 2004/06/01 19:18:33 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. * File Name:  $Id: driver_mgr.cpp,v 1000.3 2004/06/01 19:18:33 gouriano Exp $
  35. *
  36. * Author:  Michael Kholodov, Denis Vakatov
  37. *   
  38. * File Description:  Driver Manager implementation
  39. *
  40. *
  41. * $Log: driver_mgr.cpp,v $
  42. * Revision 1000.3  2004/06/01 19:18:33  gouriano
  43. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  44. *
  45. * Revision 1.13  2004/05/17 21:10:28  gorelenk
  46. * Added include of PCH ncbi_pch.hpp
  47. *
  48. * Revision 1.12  2004/04/22 11:29:53  ivanov
  49. * Use pointer to driver manager instance instead auto_ptr
  50. *
  51. * Revision 1.11  2003/12/17 14:56:33  ivanov
  52. * Changed type of the Driver Manager instance to auto_ptr.
  53. * Added RemoveInstance() method.
  54. *
  55. * Revision 1.10  2003/02/10 17:30:05  kholodov
  56. * Fixed: forgot to add actual deletion code to DestroyDs()
  57. *
  58. * Revision 1.9  2003/02/10 17:19:27  kholodov
  59. * Added: DestroyDs() method
  60. *
  61. * Revision 1.8  2002/09/23 18:35:24  kholodov
  62. * Added: GetErrorInfo() and GetErrorAsEx() methods.
  63. *
  64. * Revision 1.7  2002/09/04 22:18:57  vakatov
  65. * CDriverManager::CreateDs() -- Get rid of comp.warning, improve diagnostics
  66. *
  67. * Revision 1.6  2002/07/09 17:12:29  kholodov
  68. * Fixed duplicate context creation
  69. *
  70. * Revision 1.5  2002/07/03 15:03:05  kholodov
  71. * Added: throw exception when driver cannot be loaded
  72. *
  73. * Revision 1.4  2002/04/29 19:13:13  kholodov
  74. * Modified: using C_DriverMgr as parent class of CDriverManager
  75. *
  76. * Revision 1.3  2002/04/02 18:16:03  ucko
  77. * More fixes to CDriverManager::LoadDriverDll.
  78. *
  79. * Revision 1.2  2002/04/01 22:31:40  kholodov
  80. * Fixed DLL entry point names
  81. *
  82. * Revision 1.1  2002/01/30 14:51:21  kholodov
  83. * User DBAPI implementation, first commit
  84. *
  85. *
  86. *
  87. *
  88. */
  89. #include <ncbi_pch.hpp>
  90. #include <dbapi/driver_mgr.hpp>
  91. #include "ds_impl.hpp"
  92. #include <corelib/ncbistr.hpp>
  93. BEGIN_NCBI_SCOPE
  94. CDriverManager* CDriverManager::sm_Instance = 0;
  95. DEFINE_CLASS_STATIC_MUTEX(CDriverManager::sm_Mutex);
  96. CDriverManager& CDriverManager::GetInstance()
  97. {
  98.     if ( !sm_Instance ) {
  99.         CMutexGuard GUARD(sm_Mutex);
  100.         // Check again with the lock to avoid races
  101.         if ( !sm_Instance ) {
  102.             sm_Instance = new CDriverManager;
  103.         }
  104.     }
  105.     return *sm_Instance;
  106. }
  107. void CDriverManager::RemoveInstance()
  108. {
  109.     CMutexGuard GUARD(sm_Mutex);
  110.     delete sm_Instance;
  111.     sm_Instance = 0;
  112. }
  113. CDriverManager::CDriverManager()
  114. {
  115. }
  116. CDriverManager::~CDriverManager()
  117. {
  118.     map<string, IDataSource*>::iterator i_ds_list = m_ds_list.begin();
  119.     for( ; i_ds_list != m_ds_list.end(); ++i_ds_list ) {
  120.         delete (*i_ds_list).second;
  121.     }
  122.     m_ds_list.clear();
  123. }
  124. IDataSource* CDriverManager::CreateDs(const string&        driver_name,
  125.                                       map<string, string>* attr)
  126. {
  127.     map<string, IDataSource*>::iterator i_ds = m_ds_list.find(driver_name);
  128.     if (i_ds != m_ds_list.end()) {
  129.         return (*i_ds).second;
  130.     }
  131.     string err;
  132.     FDBAPI_CreateContext ctx_func = GetDriver(driver_name, &err);
  133.     if ( !ctx_func ) {
  134.         throw CDbapiException(err);
  135.     }
  136.     I_DriverContext* ctx = ctx_func(attr);
  137.     if ( !ctx ) {
  138.         throw CDbapiException
  139.             ("CDriverManager::CreateDs() -- Failed to get context for driver: "
  140.              + driver_name);
  141.     }
  142.     return RegisterDs(driver_name, ctx);
  143. }
  144. IDataSource* CDriverManager::CreateDsFrom(const string& drivers,
  145.                                           CNcbiRegistry* reg)
  146. {
  147.     list<string> names;
  148.     NStr::Split(drivers, ":", names);
  149.     list<string>::iterator i_name = names.begin();
  150.     for( ; i_name != names.end(); ++i_name ) {
  151.         FDBAPI_CreateContext ctx_func = GetDriver(*i_name);
  152.         if( ctx_func != 0 ) {
  153.             I_DriverContext *ctx = 0;
  154.             if( reg != 0 ) {
  155.                 // Get parameters from registry, if any
  156.                 map<string, string> attr;
  157.                 list<string> entries;
  158.                 reg->EnumerateEntries(*i_name, &entries);
  159.                 list<string>::iterator i_param = entries.begin();
  160.                 for( ; i_param != entries.end(); ++i_param ) {
  161.                     attr[*i_param] = reg->Get(*i_name, *i_param);
  162.                 }
  163.                 ctx = ctx_func(&attr);
  164.             }
  165.             else {
  166.                 ctx = ctx_func(0);
  167.             }
  168.             if( ctx != 0 ) { 
  169.                 return RegisterDs(*i_name, ctx);
  170.             }
  171.         }
  172.     }
  173.     return 0;
  174. }
  175. IDataSource* CDriverManager::RegisterDs(const string& driver_name,
  176.                                         I_DriverContext* ctx)
  177. {
  178.     IDataSource *ds = new CDataSource(ctx);
  179.     m_ds_list[driver_name] = ds;
  180.     return ds;
  181. }
  182. void CDriverManager::DestroyDs(const string& driver_name)
  183. {
  184.     map<string, IDataSource*>::iterator i_ds = m_ds_list.find(driver_name);
  185.     if (i_ds != m_ds_list.end()) {
  186.         delete (*i_ds).second;
  187.         m_ds_list.erase(i_ds);
  188.     }
  189. }
  190. END_NCBI_SCOPE