Listing 4

// Example creating a new environment
  class CAuthenticationDbEnvConfigPolicy : public IDbEnvConfigPolicy
  {
  public:
    typedef CThreadSafeCountedPtr< CAuthenticationDbEnvConfigPolicy >  
      tsrcp_t;

    // Singleton accessor
    static tsrcp_t  Instance();
    {
      static  tsrcp_t  s_tsrcpDbEnvConfigPolicy( 0 );
      if ( ! s_tsrcpDbEnvConfigPolicy.get() )
      {
        s_tsrcpDbEnvConfigPolicy.reset( new CAuthenticationDbEnvConfigPolicy() );
      }
      return s_tsrcpDbEnvConfigPolicy;
    }
  private:
    // Singleton so ctor is private.
    CAuthenticationDbEnvConfigPolicy()
      : IDbEnvConfigPolicy( "AuthenticationDbEnv", 1000000 )
    {
    }
  };
  // Actual database environment.
  typedef CDatabaseEnvironment< CAuthenticationDbEnvConfigPolicy > 
    CAuthenticationDbEnv;

// Example creating a new database in the above environment
  // Db ConfigPolicy uses monostate pattern - all static methods, 
  // so no base class.
  class CAccountDBConfigPolicy
  {
  public:
    // Specify the particular DbEnv that this database should be part of.
    typedef CAuthenticationDbEnv    DbEnv_t;

    static const char *             GetDbFilename();
    static DBTYPE                   GetDbType();
    static u_int32_t                GetDbOpenFlags();
    static void                     SetDbPageSize( size_t uDbPageSize );
    static void                     ConfigureDbBeforeOpen( Db * pDb );
  private:
    static DBTYPE    s_DbType;
    static u_int32_t s_DbOpenFlags;
    static size_t    s_uDbPageSize;
  };
  // The DB class
  typedef CDatabase< CAccountKey, CAccountRecord, CAccountDBConfigPolicy >  
    CAccountDB;
  // Cursor to use with this DB
  typedef CCursor< CAccountDB >  CAccount