text: // Copyright 2018 The Fuchsia Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef SRC_LEDGER_BIN_STORAGE_IMPL_LEVELDB_FACTORY_H_
  #define SRC_LEDGER_BIN_STORAGE_IMPL_LEVELDB_FACTORY_H_
  
  #include <lib/async_promise/executor.h>
  #include <lib/fit/bridge.h>
  #include <lib/fit/promise.h>
  
  #include <memory>
  
  #include "src/ledger/bin/environment/environment.h"
  #include "src/ledger/bin/filesystem/detached_path.h"
  #include "src/ledger/bin/storage/impl/leveldb.h"
  #include "src/ledger/bin/storage/public/db_factory.h"
  #include "src/lib/fxl/memory/weak_ptr.h"
  
  namespace storage {
  
  // A factory for LevelDb instances.
  //
  // This factory tries to always keep a new empty instance of LevelDb,
  // initialized and pre-cached, in order to immediately respond to requests for
  // new Db instances.
  //
  // When creating new LevelDb instances, using |GetOrCreateDb|, the caller should
  // make sure that there is no live LevelDb instance for the same path.
  class LevelDbFactory : public DbFactory {
   public:
    LevelDbFactory(ledger::Environment* environment,
                   ledger::DetachedPath cache_path);
  
    ~LevelDbFactory() override;
  
    // Initializes the LevelDbFactory by preparing the cached instance of LevelDb.
    void Init();
  
    // DbFactory:
    void GetOrCreateDb(
        ledger::DetachedPath db_path, DbFactory::OnDbNotFound on_db_not_found,
        fit::function<void(Status, std::unique_ptr<Db>)> callback) override;
  
   private:
    // IOLevelDbFactory holds all operations happening on the IO thread.
    class IOLevelDbFactory;
  
    std::unique_ptr<IOLevelDbFactory> io_level_db_factory_;
    async::Executor main_executor_;
  
    FXL_DISALLOW_COPY_AND_ASSIGN(LevelDbFactory);
  };
  
  }  // namespace storage
  
  #endif  // SRC_LEDGER_BIN_STORAGE_IMPL_LEVELDB_FACTORY_H_
  