1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/content_export.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/common/dom_storage/dom_storage_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/status.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace leveldb {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DB;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ReadOptions;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteBatch;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace leveldb
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace content {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SessionStorageDatabase holds the data from multiple namespaces and multiple
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// origins. All DOMStorageAreas for session storage share the same
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SessionStorageDatabase.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Only one thread is allowed to call the public functions other than
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ReadAreaValues and ReadNamespacesAndOrigins. Other threads are allowed to
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call ReadAreaValues and ReadNamespacesAndOrigins.
36bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass CONTENT_EXPORT SessionStorageDatabase :
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public base::RefCountedThreadSafe<SessionStorageDatabase> {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SessionStorageDatabase(const base::FilePath& file_path);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the (key, value) pairs for |namespace_id| and |origin|. |result| is
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // assumed to be empty and any duplicate keys will be overwritten. If the
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database exists on disk then it will be opened. If it does not exist then
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it will not be created and |result| will be unmodified.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadAreaValues(const std::string& namespace_id,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const GURL& origin,
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                      DOMStorageValuesMap* result);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the data for |namespace_id| and |origin|. Will remove all keys
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before updating the database if |clear_all_first| is set. Then all entries
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in |changes| will be examined - keys mapped to a null NullableString16 will
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be removed and all others will be inserted/updated as appropriate. It is
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed to write data into a shallow copy created by CloneNamespace, and in
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that case the copy will be made deep before writing the values.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CommitAreaChanges(const std::string& namespace_id,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& origin,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool clear_all_first,
58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                         const DOMStorageValuesMap& changes);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates shallow copies of the areas for |namespace_id| and associates them
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with |new_namespace_id|.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CloneNamespace(const std::string& namespace_id,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& new_namespace_id);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes the data for |namespace_id| and |origin|.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteArea(const std::string& namespace_id, const GURL& origin);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes the data for |namespace_id|.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteNamespace(const std::string& namespace_id);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the namespace IDs and origins present in the database.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadNamespacesAndOrigins(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::map<std::string, std::vector<GURL> >* namespaces_and_origins);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<SessionStorageDatabase>;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class DBOperation;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class SessionStorageDatabase::DBOperation;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class SessionStorageDatabaseTest;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SessionStorageDatabase();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the database at file_path_ if it exists already and creates it if
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |create_if_needed| is true. Returns true if the database was opened, false
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the opening failed or was not necessary (the database doesn't exist and
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |create_if_needed| is false). The possible failures are:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - leveldb cannot open the database.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - The database is in an inconsistent or errored state.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool LazyOpen(bool create_if_needed);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to open the database at file_path_, assigns |db| to point to the
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened leveldb::DB instance.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  leveldb::Status TryToOpen(leveldb::DB** db);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the database is already open, false otherwise.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOpen() const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers for checking caller erros, invariants and database errors. All
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these return |ok|, for chaining.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CallerErrorCheck(bool ok) const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ConsistencyCheck(bool ok);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DatabaseErrorCheck(bool ok);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functions. All return true if the operation succeeded, and false if
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it failed (a database error or a consistency error). If the return type is
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // void, the operation cannot fail. If they return false, ConsistencyCheck or
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DatabaseErrorCheck have already been called.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a namespace for |namespace_id| and updates the next namespace id if
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed. If |ok_if_exists| is false, checks that the namespace didn't exist
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateNamespace(const std::string& namespace_id,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       bool ok_if_exists,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       leveldb::WriteBatch* batch);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the areas assoiated with |namespace_id| and puts the (origin, map_id)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pairs into |areas|.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAreasInNamespace(const std::string& namespace_id,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           std::map<std::string, std::string>* areas);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds an association between |origin| and |map_id| into the namespace
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |namespace_id|.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAreaToNamespace(const std::string& namespace_id,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& origin,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& map_id,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          leveldb::WriteBatch* batch);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers for deleting data for |namespace_id| and |origin|.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteAreaHelper(const std::string& namespace_id,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& origin,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        leveldb::WriteBatch* batch);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the map id for |namespace_id| and |origin|. It's not an error if
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the map doesn't exist.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetMapForArea(const std::string& namespace_id,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& origin,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const leveldb::ReadOptions& options,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool* exists,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     std::string* map_id);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new map for |namespace_id| and |origin|. |map_id| will hold the
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // id of the created map. If there is a map for |namespace_id| and |origin|,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this just overwrites the map id. The caller is responsible for decreasing
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the ref count.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateMapForArea(const std::string& namespace_id,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const GURL& origin,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        std::string* map_id,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        leveldb::WriteBatch* batch);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the contents of the map |map_id| into |result|. If |only_keys| is
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true, only keys are aread from the database and the values in |result| will
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be empty.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadMap(const std::string& map_id,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const leveldb::ReadOptions& options,
154bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch               DOMStorageValuesMap* result,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool only_keys);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writes |values| into the map |map_id|.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteValuesToMap(const std::string& map_id,
158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                        const DOMStorageValuesMap& values,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        leveldb::WriteBatch* batch);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetMapRefCount(const std::string& map_id, int64* ref_count);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IncreaseMapRefCount(const std::string& map_id,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           leveldb::WriteBatch* batch);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decreases the ref count of a map by |decrease|. If the ref count goes to 0,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deletes the map.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DecreaseMapRefCount(const std::string& map_id,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int decrease,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           leveldb::WriteBatch* batch);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes all values in |map_id|.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ClearMap(const std::string& map_id, leveldb::WriteBatch* batch);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Breaks the association between (|namespace_id|, |origin|) and |map_id| and
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // creates a new map for (|namespace_id|, |origin|). Copies the data from the
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // old map if |copy_data| is true.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeepCopyArea(const std::string& namespace_id,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const GURL& origin,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    bool copy_data,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    std::string* map_id,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    leveldb::WriteBatch* batch);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functions for creating the keys needed for the schema.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string NamespaceStartKey(const std::string& namespace_id);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string NamespaceKey(const std::string& namespace_id,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& origin);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* NamespacePrefix();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string MapRefCountKey(const std::string& map_id);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string MapKey(const std::string& map_id, const std::string& key);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* NextMapIdKey();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<leveldb::DB> db_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_path_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // For protecting the database opening code. Also guards the variables below.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock db_lock_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if a database error has occurred (e.g., cannot read data).
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool db_error_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the database is in an inconsistent state.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_inconsistent_;
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the database is in a failed or inconsistent state, and we have
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // already deleted it (as an attempt to recover later).
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool invalid_db_deleted_;
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The number of database operations in progress. We need this so that we can
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // delete an inconsistent database at the right moment.
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int operation_count_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabase);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace content
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // CONTENT_BROWSER_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_
215