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