NCBI C++ ToolKit
driver_mgr.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: driver_mgr.cpp 77792 2017-05-08 13:38:35Z ivanov $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Vladimir Soussov
27  *
28  * File Description: Driver manager
29  *
30  */
31 
32 #include <ncbi_pch.hpp>
33 #include <corelib/ncbidll.hpp>
34 #include <corelib/ncbireg.hpp>
35 
40 
42 
43 
45 
46 
47 ///////////////////////////////////////////////////////////////////////////////
49 MakePluginManagerParamTree(const string& driver_name, const map<string, string>* attr)
50 {
52  CMemoryRegistry reg;
53  TCIter citer = attr->begin();
54  TCIter cend = attr->end();
55 
56  for ( ; citer != cend; ++citer ) {
57  reg.Set( driver_name, citer->first, citer->second );
58  }
59 
61 
62  return tr;
63 }
64 
65 
66 ///////////////////////////////////////////////////////////////////////////////
69 {
70  unique_ptr<TPluginManagerParamTree> tr(new TPluginManagerParamTree);
71 
72  tr->GetKey() = params.GetDriverName();
73 
74  string param_value;
75 
76  param_value = params.GetParam("reuse_context");
77  if (!param_value.empty()) {
78  tr->AddNode(CConfig::TParamValue(
79  "reuse_context",
80  param_value
81  ));
82  }
83 
84  param_value = params.GetParam("packet");
85  if (!param_value.empty()) {
86  tr->AddNode(CConfig::TParamValue(
87  "packet",
88  param_value
89  ));
90  }
91 
92  param_value = params.GetParam("prog_name");
93  if (!param_value.empty()) {
94  tr->AddNode(CConfig::TParamValue(
95  "prog_name",
96  param_value
97  ));
98  }
99 
100  param_value = params.GetParam("host_name");
101  if (!param_value.empty()) {
102  tr->AddNode(CConfig::TParamValue(
103  "host_name",
104  param_value
105  ));
106  }
107 
108  if (params.GetProtocolVersion() != 0) {
109  tr->AddNode(CConfig::TParamValue("version" ,
111  }
112 
113  switch (params.GetEncoding()) {
114  case eEncoding_UTF8:
115  tr->AddNode(CConfig::TParamValue("client_charset" , "UTF8"));
116  break;
117  default:
118  break;
119  };
120 
121  return tr.release();
122 }
123 
124 
125 ///////////////////////////////////////////////////////////////////////////////
128 {
129  CPluginManager_DllResolver* resolver =
132  kEmptyStr,
135  resolver->SetDllNamePrefix("ncbi");
136  return resolver;
137 }
138 
139 ///////////////////////////////////////////////////////////////////////////////
141 {
142 public:
143  C_xDriverMgr(void);
144  virtual ~C_xDriverMgr(void);
145 
146 public:
147  /// Add path for the DLL lookup
148  void AddDllSearchPath(const string& path);
149  /// Delete all user-installed paths for the DLL lookup (for all resolvers)
150  /// @param previous_paths
151  /// If non-NULL, store the prevously set search paths in this container
152  void ResetDllSearchPath(vector<string>* previous_paths = NULL);
153 
154  /// Specify which standard locations should be used for the DLL lookup
155  /// (for all resolvers). If standard locations are not set explicitelly
156  /// using this method CDllResolver::fDefaultDllPath will be used by default.
159 
160  /// Get standard locations which should be used for the DLL lookup.
161  /// @sa SetDllStdSearchPath
163 
165  const string& driver_name,
166  const TPluginManagerParamTree* const attr = NULL);
167 
169  const string& driver_name,
170  const map<string, string>* attr = NULL);
171 
172 private:
173  struct SDrivers {
174  typedef I_DriverContext* (*FDBAPI_CreateContext)(const map<string,string>* attr);
175 
176  SDrivers(const string& name, FDBAPI_CreateContext func) :
177  drv_name(name),
178  drv_func(func)
179  {
180  }
181 
182  string drv_name;
184  };
185  vector<SDrivers> m_Drivers;
186 
188 
189 private:
192 
194 };
195 
197 {
199 #ifndef NCBI_COMPILER_COMPAQ
200  // For some reason, Compaq's compiler thinks m_ContextManager is
201  // inaccessible here!
203 #endif
204 }
205 
206 
208 {
209 }
210 
211 
212 void
214 {
216 
217  m_ContextManager->AddDllSearchPath( path );
218 }
219 
220 
221 void
222 C_xDriverMgr::ResetDllSearchPath(vector<string>* previous_paths)
223 {
225 
226  m_ContextManager->ResetDllSearchPath( previous_paths );
227 }
228 
229 
232 {
234 
235  return m_ContextManager->SetDllStdSearchPath( standard_paths );
236 }
237 
238 
241 {
243 
244  return m_ContextManager->GetDllStdSearchPath();
245 }
246 
247 
250  const string& driver_name,
251  const TPluginManagerParamTree* const attr)
252 {
253  I_DriverContext* drv = NULL;
254 
255  try {
257 
258  drv = m_ContextManager->CreateInstance(
259  driver_name,
261  attr
262  );
263  }
264  catch( const CPluginManagerException& ) {
265  throw;
266  }
267  catch ( const exception& e ) {
268  DATABASE_DRIVER_ERROR( driver_name + " is not available :: " + e.what(), 300 );
269  }
270  catch ( ... ) {
271  DATABASE_DRIVER_ERROR( driver_name + " was unable to load due an unknown error", 300 );
272  }
273 
274  return drv;
275 }
276 
279  const string& driver_name,
280  const map<string, string>* attr)
281 {
282  unique_ptr<TPluginManagerParamTree> pt;
283  const TPluginManagerParamTree* nd = NULL;
284 
285  if ( attr != NULL ) {
286  pt.reset( MakePluginManagerParamTree(driver_name, attr) );
287  _ASSERT(pt.get());
288  nd = pt->FindNode( driver_name );
289  }
290 
291  return GetDriverContext(driver_name, nd);
292 }
293 
294 ////////////////////////////////////////////////////////////////////////////////
296 
297 
298 ////////////////////////////////////////////////////////////////////////////////
299 C_DriverMgr::C_DriverMgr(unsigned int /* nof_drivers */)
300 {
301 }
302 
303 
305 {
306 }
307 
309  string* /* err_msg */,
310  const map<string,string>* attr)
311 {
312  return s_DrvMgr->GetDriverContext( driver_name, attr );
313 }
314 
315 
316 void
317 C_DriverMgr::AddDllSearchPath(const string& path)
318 {
319  s_DrvMgr->AddDllSearchPath( path );
320 }
321 
322 
323 void
324 C_DriverMgr::ResetDllSearchPath(vector<string>* previous_paths)
325 {
326  s_DrvMgr->ResetDllSearchPath( previous_paths );
327 }
328 
329 
332 {
333  return s_DrvMgr->SetDllStdSearchPath( standard_paths );
334 }
335 
336 
339 {
340  return s_DrvMgr->GetDllStdSearchPath();
341 }
342 
343 
346  const string& driver_name,
347  const TPluginManagerParamTree* const attr)
348 {
349  return s_DrvMgr->GetDriverContext( driver_name, attr );
350 }
351 
352 
355  const string& driver_name,
356  const map<string, string>* attr)
357 {
358  return s_DrvMgr->GetDriverContext( driver_name, attr );
359 }
360 
361 
362 ///////////////////////////////////////////////////////////////////////////////
364 Get_I_DriverContext(const string& driver_name, const map<string, string>* attr)
365 {
366  typedef CPluginManager<I_DriverContext> TReaderManager;
367  typedef CPluginManagerGetter<I_DriverContext> TReaderManagerStore;
368  I_DriverContext* drv = NULL;
369  const TPluginManagerParamTree* nd = NULL;
370 
372  _ASSERT(ReaderManager);
373 
374  try {
375  unique_ptr<TPluginManagerParamTree> pt;
376 
377  if ( attr != NULL ) {
378  pt.reset( MakePluginManagerParamTree(driver_name, attr) );
379 
380  _ASSERT( pt.get() );
381 
382  nd = pt->FindNode( driver_name );
383  }
384  drv = ReaderManager->CreateInstance(
385  driver_name,
387  nd
388  );
389  }
390  catch( const CPluginManagerException& ) {
391  throw;
392  }
393  catch ( const exception& e ) {
394  DATABASE_DRIVER_ERROR( driver_name + " is not available :: " + e.what(), 300 );
395  }
396  catch ( ... ) {
397  DATABASE_DRIVER_ERROR( driver_name + " was unable to load due an unknown error", 300 );
398  }
399 
400  return drv;
401 }
402 
403 
404 ///////////////////////////////////////////////////////////////////////////////
406 {
407  typedef CPluginManager<I_DriverContext> TReaderManager;
408  typedef CPluginManagerGetter<I_DriverContext> TReaderManagerStore;
409  I_DriverContext* drv = NULL;
410 
412  _ASSERT(ReaderManager);
413 
414  try {
415  unique_ptr<TPluginManagerParamTree> pt;
416 
417  pt.reset(MakePluginManagerParamTree(params));
418  _ASSERT( pt.get() );
419 
420  drv = ReaderManager->CreateInstance(
421  params.GetDriverName(),
423  pt.get()
424  );
425  }
426  catch( const CPluginManagerException& ) {
427  throw;
428  }
429  catch ( const exception& e ) {
430  DATABASE_DRIVER_ERROR( params.GetDriverName() + " is not available :: " + e.what(), 300 );
431  }
432  catch ( ... ) {
433  DATABASE_DRIVER_ERROR( params.GetDriverName() + " was unable to load due an unknown error", 300 );
434  }
435 
436  return drv;
437 }
438 
439 
441 
442 
definition of a Culling tree
Definition: ncbi_tree.hpp:88
bool Set(const string &section, const string &name, const string &value, TFlags flags=0, const string &comment=kEmptyStr)
Set the configuration parameter value.
Definition: ncbireg.cpp:826
CPluginManager_DllResolver * operator()(void)
CRef< TContextManager > m_ContextManager
Definition: driver_mgr.cpp:193
I_DriverContext * GetDriverContext(const string &driver_name, string *err_msg=0, const map< string, string > *attr=0)
Definition: driver_mgr.cpp:308
CSafeStatic<>::
CPluginManager<> –.
Helper classes and templates to implement plugins.
static TPluginManager * Get(void)
CDllResolver::TExtraDllPath SetDllStdSearchPath(CDllResolver::TExtraDllPath standard_paths)
Specify which standard locations should be used for the DLL lookup (for all resolvers).
Definition: driver_mgr.cpp:331
virtual ~C_xDriverMgr(void)
Definition: driver_mgr.cpp:207
virtual Uint4 GetProtocolVersion(void) const =0
static TParamTree * ConvertRegToTree(const IRegistry &reg)
Reconstruct param tree from the application registry.
void ResetDllSearchPath(vector< string > *previous_paths=NULL)
Delete all user-installed paths for the DLL lookup (for all resolvers)
Definition: driver_mgr.cpp:324
Plugin manager (using class factory paradigm).
void ResetDllSearchPath(vector< string > *previous_paths=NULL)
Delete all user-installed paths for the DLL lookup (for all resolvers)
Definition: driver_mgr.cpp:222
I_DriverContext * GetDriverContext(const string &driver_name, const TPluginManagerParamTree *const attr=NULL)
Definition: driver_mgr.cpp:249
CFastMutex –.
Definition: ncbimtx.hpp:651
#define NULL
Definition: ncbistd.hpp:225
virtual EEncoding GetEncoding(void) const =0
#define kEmptyStr
Definition: ncbistr.hpp:120
Static variables safety - create on demand, destroy on application termination.
I_DriverContext *(* FDBAPI_CreateContext)(const map< string, string > *attr)
Definition: driver_mgr.cpp:174
void AddDllSearchPath(const string &path)
Add path for the DLL lookup.
Definition: driver_mgr.cpp:213
Define class Dll and for Portable DLL handling.
#define DATABASE_DRIVER_ERROR(message, err_code)
Definition: exception.hpp:713
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
Definition: ncbistr.hpp:5079
static const unsigned char pt[6][64]
Definition: gcm.c:574
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:101
FDBAPI_CreateContext drv_func
Definition: driver_mgr.cpp:183
CInterfaceVersion<> –.
CMemoryRegistry –.
Definition: ncbireg.hpp:575
const_iterator end() const
Definition: map.hpp:152
vector< SDrivers > m_Drivers
Definition: driver_mgr.cpp:185
C_xDriverMgr(void)
Definition: driver_mgr.cpp:196
CDBConnParams::
Definition: interfaces.hpp:250
Node data template for id-value trees.
Definition: ncbi_tree.hpp:407
I_DriverContext * Get_I_DriverContext(const string &driver_name, const map< string, string > *attr)
Definition: driver_mgr.cpp:364
CFastMutex m_Mutex
Definition: driver_mgr.cpp:187
const TTreeType * FindNode(const TKeyType &key, TNodeSearchMode sflag=eImmediateAndTop) const
Search for node.
Definition: ncbi_tree.hpp:936
static CSafeStatic< C_xDriverMgr > s_DrvMgr
Definition: driver_mgr.cpp:295
virtual string GetDriverName(void) const =0
virtual void SetDllNamePrefix(const string &prefix)
Set DLL file name prefix.
I_DriverContext * GetDriverContextFromMap(const string &driver_name, const map< string, string > *attr=NULL)
Definition: driver_mgr.cpp:354
C_DriverMgr(unsigned int nof_drivers=16)
Definition: driver_mgr.cpp:299
TPluginManagerParamTree * MakePluginManagerParamTree(const string &driver_name, const map< string, string > *attr)
Definition: driver_mgr.cpp:49
CDllResolver::TExtraDllPath SetDllStdSearchPath(CDllResolver::TExtraDllPath standard_paths)
Specify which standard locations should be used for the DLL lookup (for all resolvers).
Definition: driver_mgr.cpp:231
I_DriverContext * MakeDriverContext(const CDBConnParams &params)
Definition: driver_mgr.cpp:405
void AddDllSearchPath(const string &path)
Add path for the DLL lookup.
Definition: driver_mgr.cpp:317
Process information in the NCBI Registry, including working with configuration files.
Service class for DLLs resolution.
#define NCBI_INTERFACE_VERSION(iface)
Macro to construct CVersionInfo class using interface name (relies on CInterfaceVersion class) ...
CPluginManagerGetter< I_DriverContext > TContextManagerStore
Definition: driver_mgr.cpp:191
int TExtraDllPath
Definition: ncbidll.hpp:473
CRef –.
Definition: ncbiobj.hpp:616
const TYPE & Get(const CNamedParameterList *param)
SDrivers(const string &name, FDBAPI_CreateContext func)
Definition: driver_mgr.cpp:176
virtual ~C_DriverMgr()
Definition: driver_mgr.cpp:304
CPluginManager< I_DriverContext > TContextManager
Definition: driver_mgr.cpp:190
I_DriverContext * GetDriverContextFromTree(const string &driver_name, const TPluginManagerParamTree *const attr=NULL)
Definition: driver_mgr.cpp:345
CPluginManagerException –.
#define _ASSERT
virtual string GetParam(const string &key) const =0
Parameters, which are not listed above explicitly, should be retrieved via SetParam() method...
CDllResolver::TExtraDllPath GetDllStdSearchPath(void) const
Get standard locations which should be used for the DLL lookup.
Definition: driver_mgr.cpp:240
const_iterator begin() const
Definition: map.hpp:151
CDllResolver::TExtraDllPath GetDllStdSearchPath(void) const
Get standard locations which should be used for the DLL lookup.
Definition: driver_mgr.cpp:338
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:98
Modified on Sun Jul 23 20:17:20 2017 by modify_doxy.py rev. 533848