Chromium Code Reviews| Index: webkit/dom_storage/session_storage_database.h |
| diff --git a/webkit/dom_storage/session_storage_database.h b/webkit/dom_storage/session_storage_database.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9a802cad3671b9d0d0f6f5d2424abf2f14e76fd1 |
| --- /dev/null |
| +++ b/webkit/dom_storage/session_storage_database.h |
| @@ -0,0 +1,200 @@ |
| +// Copyright (c) 2012 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 WEBKIT_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_ |
| +#define WEBKIT_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_ |
| +#pragma once |
| + |
| +#include <map> |
| +#include <set> |
|
michaeln
2012/04/26 05:07:43
is <set> needed here or maybe just in the .cc file
marja
2012/04/27 07:34:47
Done. (Needed nowhere.)
|
| +#include <string> |
| + |
| +#include "base/file_path.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "third_party/leveldatabase/src/include/leveldb/status.h" |
| +#include "webkit/dom_storage/dom_storage_types.h" |
| + |
| +class GURL; |
| + |
| +namespace leveldb { |
| +class DB; |
| +class WriteBatch; |
| +} // namespace leveldb |
| + |
| +namespace dom_storage { |
| + |
| +// SessionStorageDatabase holds the data from multiple namespaces and multiple |
| +// origins. All DomStorageAreas for session storage share the same |
| +// SessionStorageDatabase. |
| +class SessionStorageDatabase : |
| + public base::RefCountedThreadSafe<SessionStorageDatabase> { |
| + public: |
| + explicit SessionStorageDatabase(const FilePath& file_path); |
| + |
| + // Reads the (key, value) pairs for |namespace_id| and |origin|. |result| is |
| + // assumed to be empty and any duplicate keys will be overwritten. If the |
| + // database exists on disk then it will be opened. If it does not exist then |
| + // it will not be created and |result| will be unmodified. |
| + void ReadAreaValues(int64 namespace_id, |
| + const GURL& origin, |
| + ValuesMap* result); |
| + |
| + // Updates the data for |namespace_id| and |origin|. Will remove all keys |
| + // before updating the database if |clear_all_first| is set. Then all entries |
| + // in |changes| will be examined - keys mapped to a null NullableString16 will |
| + // be removed and all others will be inserted/updated as appropriate. |
| + bool CommitAreaChanges(int64 namespace_id, |
| + const GURL& origin, |
| + bool clear_all_first, |
| + const ValuesMap& changes); |
| + |
| + // Creates shallow copies of the areas for |namespace_id| and associates them |
| + // with |new_namespace_id|. |
| + bool CloneNamespace(int64 namespace_id, int64 new_namespace_id); |
| + |
| + // Creates a deep copy of the area for |namespace_id| and |origin|. |
| + bool DeepCopyArea(int64 namespace_id, const GURL& origin); |
| + |
| + // Deletes the data for |namespace_id| and |origin|. |
| + bool DeleteArea(int64 namespace_id, const GURL& origin); |
| + |
| + // Deletes the data for |namespace_id|. |
| + bool DeleteNamespace(int64 namespace_id); |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<SessionStorageDatabase>; |
| + friend class SessionStorageDatabaseTest; |
| + |
| + ~SessionStorageDatabase(); |
| + |
| + bool LazyOpen(bool create_if_needed); |
| + leveldb::Status TryToOpen(const FilePath& file_path, leveldb::DB** db); |
| + bool IsOpen() const; |
| + |
| + // For checking consistency invariants. Returns |ok|, for chaining. |
| + bool ConsistencyCheck(bool ok); |
| + // For checking database errors. If a database error occurs, the data is |
| + // deleted and the database is not accessed during this run. Returns |ok|, for |
| + // chaining. |
| + bool DatabaseErrorCheck(bool ok); |
| + |
| + // Helper functions. All return true if the operation succeeded, and false if |
| + // it failed (a database error or a consistency error). If the return type is |
| + // void, the operation cannot fail. If they return false, ConsistencyCheck or |
| + // DatabaseErrorCheck have already been called. |
| + |
| + // Creates a namespace for |namespace_id| and updates the next namespace id if |
| + // needed. If |ok_if_exists| is false, checks that the namespace didn't exist |
| + // before. |
| + bool CreateNamespace(int64 namespace_id, |
| + bool ok_if_exists, |
| + leveldb::WriteBatch* batch); |
| + // Reads the next namespace id. |
| + bool GetNextNamespaceId(int64* next_namespace_id); |
| + bool UpdateNextNamespaceId(int64 namespace_id, |
| + leveldb::WriteBatch* batch); |
| + // Reads the areas assoiated with |namespace_id| and puts the (origin, map_id) |
| + // pairs into |areas|. |
| + bool GetAreasInNamespace(int64 namespace_id, |
| + std::map<std::string, std::string>* areas); |
| + bool GetAreasInNamespace(const std::string& namespace_id_str, |
| + std::map<std::string, std::string>* areas); |
| + |
| + // Adds an association between |origin| and |map_id| into the namespace |
| + // |namespace_id|. |
| + void AddAreaToNamespace(int64 namespace_id, |
| + const std::string& origin, |
| + const std::string& map_id, |
| + leveldb::WriteBatch* batch); |
| + |
| + // Helpers for deleting data for |namespace_id| and |origin|. |
| + bool DeleteArea(int64 namespace_id, |
| + const std::string& origin, |
| + leveldb::WriteBatch* batch); |
| + bool DeleteArea(const std::string& namespace_id_str, |
| + const std::string& origin, |
| + leveldb::WriteBatch* batch); |
| + |
| + // Retrieves the map id for |namespace_id| and |origin|. It's not an error if |
| + // the map doesn't exist. |
| + bool GetMapForArea(int64 namespace_id, |
| + const GURL& origin, |
| + bool* exists, |
| + std::string* map_id); |
| + bool GetMapForArea(const std::string& namespace_id_str, |
| + const std::string& origin, |
| + bool* exists, |
| + std::string* map_id); |
| + |
| + // Creates a new map for |namespace_id| and |origin|. |map_id| will hold the |
| + // id of the created map. If there is a map for |namespace_id| and |origin|, |
| + // this just overwrites the map id. The caller is responsible for decreasing |
| + // the ref count. |
| + bool CreateMapForArea(int64 namespace_id, |
| + const GURL& origin, |
| + std::string* map_id, |
| + leveldb::WriteBatch* batch); |
| + // Reads the contents of the map |map_id| into |result|. If |only_keys| is |
| + // true, only keys are aread from the database and the values in |result| will |
| + // be empty. |
| + bool ReadMap(const std::string& map_id, |
| + ValuesMap* result, |
| + bool only_keys); |
| + // Writes |values| into the map |map_id|. |
| + void WriteValuesToMap(const std::string& map_id, |
| + const ValuesMap& values, |
| + leveldb::WriteBatch* batch); |
| + |
| + bool GetMapRefCount(const std::string& map_id, int64* ref_count); |
| + bool IncreaseMapRefCount(const std::string& map_id, |
| + leveldb::WriteBatch* batch); |
| + // Decreases the ref count of a map by |decrease|. If the ref count goes to 0, |
| + // deletes the map. |
| + bool DecreaseMapRefCount(const std::string& map_id, |
| + int decrease, |
| + leveldb::WriteBatch* batch); |
| + |
| + // Deletes all values in |map_id|. |
| + bool ClearMap(const std::string& map_id, leveldb::WriteBatch* batch); |
| + |
| + // Helper functions for creating the keys needed for the schema. |
| + static std::string NamespaceStartKey(const std::string& namespace_id_str); |
| + static std::string NamespaceStartKey(int64 namespace_id, |
| + int64 namespace_offset); |
| + static std::string NamespaceKey(const std::string& namespace_id_str, |
| + const std::string& origin); |
| + static std::string NamespaceKey(int64 namespace_id, |
| + int64 namespace_offset, |
| + const GURL& origin); |
| + static std::string NamespaceIdStr(int64 namespace_id, int64 namespace_offset); |
| + static std::string NamespacePrefix(); |
| + static std::string MapRefCountKey(const std::string& map_id); |
| + static std::string MapKey(const std::string& map_id, const std::string& key); |
| + static std::string MapPrefix(); |
| + static std::string NextNamespaceIdKey(); |
| + static std::string NextMapIdKey(); |
| + |
| + scoped_ptr<leveldb::DB> db_; |
| + FilePath file_path_; |
| + |
| + // True if a database error has occurred (e.g., cannot read data). |
| + bool db_error_; |
| + // True if the database is in an inconsistent state. |
| + bool is_inconsistent_; |
| + |
| + // On startup, we read the next ununsed namespace id from the database. It |
| + // will be the offset for namespace ids. The actual id of a namespace in the |
| + // database will be: id passed to the API function + namespace_offset_. The |
| + // namespace ids which are handled as int64 (named namespace_id) don't contain |
| + // the offset yet. Tthe namespaces ids which are handled as strings (named |
|
michaeln
2012/04/26 05:07:43
type: Tthe
marja
2012/04/27 07:34:47
Done.
|
| + // namesapce_id_str) contain the offset. |
| + int64 namespace_offset_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabase); |
| +}; |
| + |
| +} // namespace dom_storage |
| + |
| +#endif // WEBKIT_DOM_STORAGE_SESSION_STORAGE_DATABASE_H_ |