// Copyright (c) 2011 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.

#ifndef STORAGE_BROWSER_DATABASE_DATABASE_CONNECTIONS_H_
#define STORAGE_BROWSER_DATABASE_DATABASE_CONNECTIONS_H_

#include <stdint.h>

#include <map>
#include <string>
#include <vector>

#include "base/component_export.h"

namespace storage {

class COMPONENT_EXPORT(STORAGE_BROWSER) DatabaseConnections {
 public:
  DatabaseConnections();
  ~DatabaseConnections();

  bool IsEmpty() const;
  bool IsDatabaseOpened(const std::string& origin_identifier,
                        const std::u16string& database_name) const;
  bool IsOriginUsed(const std::string& origin_identifier) const;

  // Returns true if this is the first connection.
  bool AddConnection(const std::string& origin_identifier,
                     const std::u16string& database_name);

  // Returns true if the last connection was removed.
  bool RemoveConnection(const std::string& origin_identifier,
                        const std::u16string& database_name);

  void RemoveAllConnections();
  std::vector<std::pair<std::string, std::u16string>> RemoveConnections(
      const DatabaseConnections& connections);

  // Can be called only if IsDatabaseOpened would have returned true.
  int64_t GetOpenDatabaseSize(const std::string& origin_identifier,
                              const std::u16string& database_name) const;
  void SetOpenDatabaseSize(const std::string& origin_identifier,
                           const std::u16string& database_name,
                           int64_t size);

  // Returns a list of the connections, <origin_id, name>.
  std::vector<std::pair<std::string, std::u16string>> ListConnections() const;

 private:
  // Maps database names to (open count, database size).
  using DBConnections = std::map<std::u16string, std::pair<int, int64_t>>;
  // Maps origin identifiers to DBConnections.
  std::map<std::string, DBConnections> connections_;

  // Returns true if the last connection was removed.
  bool RemoveConnectionsHelper(const std::string& origin_identifier,
                               const std::u16string& database_name,
                               int num_connections);
};

}  // namespace storage

#endif  // STORAGE_BROWSER_DATABASE_DATABASE_CONNECTIONS_H_
