// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

#ifndef THIRD_PARTY_LEVELDATABASE_LEVELDB_CHROME_H_
#define THIRD_PARTY_LEVELDATABASE_LEVELDB_CHROME_H_

#include <memory>
#include <string>

#include "base/files/file_path.h"
#include "leveldb/cache.h"
#include "leveldb/env.h"
#include "leveldb/export.h"
#include "leveldb/options.h"
#include "third_party/leveldatabase/src/db/filename.h"

namespace base {
namespace trace_event {
class MemoryAllocatorDump;
class ProcessMemoryDump;
}  // namespace trace_event
}  // namespace base

namespace leveldb_chrome {

// Return the shared leveldb block cache for web APIs. The caller *does not*
// own the returned instance.
LEVELDB_EXPORT leveldb::Cache* GetSharedWebBlockCache();

// Return the shared leveldb block cache for browser (non web) APIs. The caller
// *does not* own the returned instance.
LEVELDB_EXPORT leveldb::Cache* GetSharedBrowserBlockCache();

// Return the shared leveldb block cache for in-memory Envs. The caller *does
// not* own the returned instance.
LEVELDB_EXPORT leveldb::Cache* GetSharedInMemoryBlockCache();

// Determine if a leveldb::Env stores the file data in RAM.
LEVELDB_EXPORT bool IsMemEnv(const leveldb::Env* env);

// Creates an in-memory Env for which all files are stored in the heap.
// This wraps leveldb::NewMemEnv to add memory-infra logging.
// if |base_env| is null then leveldb::Env::Default() will be used.
LEVELDB_EXPORT std::unique_ptr<leveldb::Env> NewMemEnv(
    const std::string& name,
    leveldb::Env* base_env = nullptr);

// If filename is a leveldb file, store the type of the file in *type.
// The number encoded in the filename is stored in *number.
// Returns true if the filename was successfully parsed.
LEVELDB_EXPORT bool ParseFileName(const std::string& filename,
                                  uint64_t* number,
                                  leveldb::FileType* type);

// Report leveldb UMA values.
LEVELDB_EXPORT void UpdateHistograms();

// Corrupt a closed database for testing purposes. After calling this function
// leveldb::OpenDB(...) will return a status where IsCorruption() returns true.
// Returns true if the database was successfully corrupted, false if not.
// Note: This function will fail if |db_path| does not exist.
LEVELDB_EXPORT bool CorruptClosedDBForTesting(const base::FilePath& db_path);

// Check that the database path in |db_path| "appears" to be a valid leveldb
// database using the provided |env|. This function *does not* open or verify
// that the database referred to by |db_path| is a valid database, only that it
// appears to be one.
LEVELDB_EXPORT bool PossiblyValidDB(const base::FilePath& db_path,
                                    leveldb::Env* env);

// Fully delete the leveldb database specified by |db_path|. leveldb::DestroyDB
// will only delete files that it creates. Other files, if present, will be
// ignored and left behind after leveldb::DestroyDB returns. This function will
// delete the entire database directory.
//
// Note: Can be used with in-memory Env's.
LEVELDB_EXPORT leveldb::Status DeleteDB(const base::FilePath& db_path,
                                        const leveldb::Options& options);

// Returns the memory-infra dump for |tracked_memenv|.
// Do not call this function, instead call
// leveldb_env::DBTracker::GetOrCreateAllocatorDump().
// TODO(crbug.com/762598) Can be made private as part of leveldb cleanup.
base::trace_event::MemoryAllocatorDump* GetEnvAllocatorDump(
    base::trace_event::ProcessMemoryDump* pmd,
    leveldb::Env* tracked_memenv);

// Dump all tracked in-memory env's to the |pmd|. Do not call - this is a
// private function for leveldb_env::DBTracker.
// TODO(crbug.com/762598) Can be made private as part of leveldb cleanup.
void DumpAllTrackedEnvs(base::trace_event::ProcessMemoryDump* pmd);

}  // namespace leveldb_chrome

#endif  // THIRD_PARTY_LEVELDATABASE_LEVELDB_CHROME_H_
