| 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
|
| index 822dbc3d43668726047e2d67d07ea5172f5cd704..777bdfdb7144f83365ccc48538a8811033288237 100644
|
| --- a/webkit/dom_storage/session_storage_database.h
|
| +++ b/webkit/dom_storage/session_storage_database.h
|
| @@ -9,6 +9,7 @@
|
| #include <map>
|
| #include <string>
|
|
|
| +#include "base/callback.h"
|
| #include "base/file_path.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -28,11 +29,24 @@ namespace dom_storage {
|
| // SessionStorageDatabase holds the data from multiple namespaces and multiple
|
| // origins. All DomStorageAreas for session storage share the same
|
| // SessionStorageDatabase.
|
| +
|
| +// The namespace IDs used in the API (upper layer IDs) are different than the
|
| +// namespace IDs used in the database (real IDs). All public functions deal with
|
| +// upper layer IDs.
|
| +
|
| +// For private functions, the namespace IDs which are handled as int64 (named
|
| +// namespace_id) are upper layer IDs. The namespaces IDs which are handled
|
| +// as strings (named namesapce_id_str) are real IDs.
|
| class SessionStorageDatabase :
|
| public base::RefCountedThreadSafe<SessionStorageDatabase> {
|
| public:
|
| explicit SessionStorageDatabase(const FilePath& file_path);
|
|
|
| + typedef base::Callback<void(int64, int64)> SessionStorageAssociatedCallback;
|
| + SessionStorageDatabase(
|
| + const FilePath& file_path,
|
| + const SessionStorageAssociatedCallback& associated_callback);
|
| +
|
| // 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
|
| @@ -62,6 +76,14 @@ class SessionStorageDatabase :
|
| // Deletes the data for |namespace_id|.
|
| bool DeleteNamespace(int64 namespace_id);
|
|
|
| + // Reads all namespace ids from the database. The returned IDs will be upper
|
| + // level IDs. If there are some databases without an associated upper layer
|
| + // ID, this creates new, negative upper layer IDs for them.
|
| + bool ReadNamespaceIds(std::vector<int64>* namespace_ids);
|
| +
|
| + // Associates |namespace_id| with |real_id|. Used by session restore.
|
| + void AssociateNamespaceId(int64 namespace_id, int64 real_id);
|
| +
|
| private:
|
| friend class base::RefCountedThreadSafe<SessionStorageDatabase>;
|
| friend class SessionStorageDatabaseTest;
|
| @@ -119,12 +141,12 @@ class SessionStorageDatabase :
|
| 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);
|
| + bool DeleteAreaHelper(int64 namespace_id,
|
| + const std::string& origin,
|
| + leveldb::WriteBatch* batch);
|
| + bool DeleteAreaHelper(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.
|
| @@ -177,16 +199,18 @@ class SessionStorageDatabase :
|
| std::string* map_id,
|
| leveldb::WriteBatch* batch);
|
|
|
| + // Helper functions for ID conversions.
|
| + bool AllocateNamespaceId(int64* namespace_id);
|
| + bool GetRealId(int64 namespace_id, int64* real_id);
|
| +
|
| // 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);
|
| + std::string NamespaceStartKey(int64 namespace_id);
|
| 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);
|
| + std::string NamespaceKey(int64 namespace_id,
|
| + const GURL& origin);
|
| + std::string NamespaceIdStr(int64 namespace_id);
|
| static const char* NamespacePrefix();
|
| static std::string MapRefCountKey(const std::string& map_id);
|
| static std::string MapKey(const std::string& map_id, const std::string& key);
|
| @@ -205,13 +229,19 @@ class SessionStorageDatabase :
|
| // 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. The namespaces ids which are handled as strings (named
|
| - // namesapce_id_str) contain the offset.
|
| - int64 namespace_offset_;
|
| + // To track in-memory namespace id allocations (which don't necessarily end up
|
| + // in the db).
|
| + int64 next_namespace_id_;
|
| +
|
| + // To track created upper layer namespace IDs.
|
| + int64 next_negative_namespace_id_;
|
| +
|
| + // Track the correspondence between the upper layer IDs (used in the API) and
|
| + // the IDs in the database.
|
| + std::map<int64, int64> id_to_real_id_;
|
| + std::map<int64, int64> real_id_to_id_;
|
| +
|
| + SessionStorageAssociatedCallback associated_callback_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(SessionStorageDatabase);
|
| };
|
|
|