Index: content/browser/indexed_db/indexed_db_backing_store.h |
diff --git a/content/browser/indexed_db/indexed_db_backing_store.h b/content/browser/indexed_db/indexed_db_backing_store.h |
index ffa6f3a29e9ee936f052cf1b662194eeedcd2bd3..b5789693d80f0e17368aa0a6337077b0ccc16138 100644 |
--- a/content/browser/indexed_db/indexed_db_backing_store.h |
+++ b/content/browser/indexed_db/indexed_db_backing_store.h |
@@ -56,8 +56,6 @@ struct IndexedDBValue; |
class CONTENT_EXPORT IndexedDBBackingStore |
: public base::RefCounted<IndexedDBBackingStore> { |
public: |
- class CONTENT_EXPORT Transaction; |
- |
class CONTENT_EXPORT Comparator : public LevelDBComparator { |
public: |
virtual int Compare(const base::StringPiece& a, |
@@ -65,6 +63,239 @@ class CONTENT_EXPORT IndexedDBBackingStore |
virtual const char* Name() const OVERRIDE; |
}; |
+ class CONTENT_EXPORT RecordIdentifier { |
+ public: |
+ RecordIdentifier(const std::string& primary_key, int64 version); |
+ RecordIdentifier(); |
+ ~RecordIdentifier(); |
+ |
+ const std::string& primary_key() const { return primary_key_; } |
+ int64 version() const { return version_; } |
+ void Reset(const std::string& primary_key, int64 version) { |
+ primary_key_ = primary_key; |
+ version_ = version; |
+ } |
+ |
+ private: |
+ // TODO(jsbell): Make it more clear that this is the *encoded* version of |
+ // the key. |
+ std::string primary_key_; |
+ int64 version_; |
+ DISALLOW_COPY_AND_ASSIGN(RecordIdentifier); |
+ }; |
+ |
+ class BlobWriteCallback : public base::RefCounted<BlobWriteCallback> { |
+ public: |
+ virtual void Run(bool succeeded) = 0; |
+ |
+ protected: |
+ friend class base::RefCounted<BlobWriteCallback>; |
+ virtual ~BlobWriteCallback() {} |
+ }; |
+ |
+ class BlobChangeRecord { |
+ public: |
+ BlobChangeRecord(const std::string& key, int64 object_store_id); |
+ ~BlobChangeRecord(); |
+ |
+ const std::string& key() const { return key_; } |
+ int64 object_store_id() const { return object_store_id_; } |
+ void SetBlobInfo(std::vector<IndexedDBBlobInfo>* blob_info); |
+ std::vector<IndexedDBBlobInfo>& mutable_blob_info() { return blob_info_; } |
+ const std::vector<IndexedDBBlobInfo>& blob_info() const { |
+ return blob_info_; |
+ } |
+ void SetHandles(ScopedVector<webkit_blob::BlobDataHandle>* handles); |
+ scoped_ptr<BlobChangeRecord> Clone() const; |
+ |
+ private: |
+ std::string key_; |
+ int64 object_store_id_; |
+ std::vector<IndexedDBBlobInfo> blob_info_; |
+ ScopedVector<webkit_blob::BlobDataHandle> handles_; |
+ DISALLOW_COPY_AND_ASSIGN(BlobChangeRecord); |
+ }; |
+ typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; |
+ |
+ class CONTENT_EXPORT Transaction { |
+ public: |
+ explicit Transaction(IndexedDBBackingStore* backing_store); |
+ virtual ~Transaction(); |
+ |
+ virtual void Begin(); |
+ // The callback will be called eventually on success or failure, or |
+ // immediately if phase one is complete due to lack of any blobs to write. |
+ virtual leveldb::Status CommitPhaseOne(scoped_refptr<BlobWriteCallback>); |
+ virtual leveldb::Status CommitPhaseTwo(); |
+ virtual void Rollback(); |
+ void Reset() { |
+ backing_store_ = NULL; |
+ transaction_ = NULL; |
+ } |
+ leveldb::Status PutBlobInfoIfNeeded( |
+ int64 database_id, |
+ int64 object_store_id, |
+ const std::string& object_store_data_key, |
+ std::vector<IndexedDBBlobInfo>*, |
+ ScopedVector<webkit_blob::BlobDataHandle>* handles); |
+ void PutBlobInfo(int64 database_id, |
+ int64 object_store_id, |
+ const std::string& object_store_data_key, |
+ std::vector<IndexedDBBlobInfo>*, |
+ ScopedVector<webkit_blob::BlobDataHandle>* handles); |
+ |
+ LevelDBTransaction* transaction() { return transaction_; } |
+ |
+ leveldb::Status GetBlobInfoForRecord( |
+ int64 database_id, |
+ const std::string& object_store_data_key, |
+ IndexedDBValue* value); |
+ |
+ // This holds a BlobEntryKey and the encoded IndexedDBBlobInfo vector stored |
+ // under that key. |
+ typedef std::vector<std::pair<BlobEntryKey, std::string> > |
+ BlobEntryKeyValuePairVec; |
+ |
+ class WriteDescriptor { |
+ public: |
+ WriteDescriptor(const GURL& url, int64_t key, int64_t size); |
+ WriteDescriptor(const base::FilePath& path, |
+ int64_t key, |
+ int64_t size, |
+ base::Time last_modified); |
+ |
+ bool is_file() const { return is_file_; } |
+ const GURL& url() const { |
+ DCHECK(!is_file_); |
+ return url_; |
+ } |
+ const base::FilePath& file_path() const { |
+ DCHECK(is_file_); |
+ return file_path_; |
+ } |
+ int64_t key() const { return key_; } |
+ int64_t size() const { return size_; } |
+ base::Time last_modified() const { return last_modified_; } |
+ |
+ private: |
+ bool is_file_; |
+ GURL url_; |
+ base::FilePath file_path_; |
+ int64_t key_; |
+ int64_t size_; |
+ base::Time last_modified_; |
+ }; |
+ |
+ class ChainedBlobWriter |
+ : public base::RefCountedThreadSafe<ChainedBlobWriter> { |
+ public: |
+ virtual void set_delegate( |
+ scoped_ptr<fileapi::FileWriterDelegate> delegate) = 0; |
+ |
+ // TODO(ericu): Add a reason in the event of failure. |
+ virtual void ReportWriteCompletion(bool succeeded, |
+ int64 bytes_written) = 0; |
+ |
+ virtual void Abort() = 0; |
+ |
+ protected: |
+ friend class base::RefCountedThreadSafe<ChainedBlobWriter>; |
+ virtual ~ChainedBlobWriter() {} |
+ }; |
+ |
+ class ChainedBlobWriterImpl; |
+ |
+ typedef std::vector<WriteDescriptor> WriteDescriptorVec; |
+ |
+ private: |
+ class BlobWriteCallbackWrapper; |
+ |
+ leveldb::Status HandleBlobPreTransaction( |
+ BlobEntryKeyValuePairVec* new_blob_entries, |
+ WriteDescriptorVec* new_files_to_write); |
+ // Returns true on success, false on failure. |
+ bool CollectBlobFilesToRemove(); |
+ // The callback will be called eventually on success or failure. |
+ void WriteNewBlobs(BlobEntryKeyValuePairVec* new_blob_entries, |
+ WriteDescriptorVec* new_files_to_write, |
+ scoped_refptr<BlobWriteCallback> callback); |
+ leveldb::Status SortBlobsToRemove(); |
+ |
+ IndexedDBBackingStore* backing_store_; |
+ scoped_refptr<LevelDBTransaction> transaction_; |
+ BlobChangeMap blob_change_map_; |
+ BlobChangeMap incognito_blob_map_; |
+ int64 database_id_; |
+ BlobJournalType blobs_to_remove_; |
+ scoped_refptr<ChainedBlobWriter> chained_blob_writer_; |
+ }; |
+ |
+ class Cursor { |
+ public: |
+ enum IteratorState { READY = 0, SEEK }; |
+ |
+ virtual ~Cursor(); |
+ |
+ struct CursorOptions { |
+ CursorOptions(); |
+ ~CursorOptions(); |
+ int64 database_id; |
+ int64 object_store_id; |
+ int64 index_id; |
+ std::string low_key; |
+ bool low_open; |
+ std::string high_key; |
+ bool high_open; |
+ bool forward; |
+ bool unique; |
+ }; |
+ |
+ const IndexedDBKey& key() const { return *current_key_; } |
+ bool Continue(leveldb::Status* s) { return Continue(NULL, NULL, SEEK, s); } |
+ bool Continue(const IndexedDBKey* key, |
+ IteratorState state, |
+ leveldb::Status* s) { |
+ return Continue(key, NULL, state, s); |
+ } |
+ bool Continue(const IndexedDBKey* key, |
+ const IndexedDBKey* primary_key, |
+ IteratorState state, |
+ leveldb::Status*); |
+ bool Advance(uint32 count, leveldb::Status*); |
+ bool FirstSeek(leveldb::Status*); |
+ |
+ virtual Cursor* Clone() = 0; |
+ virtual const IndexedDBKey& primary_key() const; |
+ virtual IndexedDBValue* value() = 0; |
+ virtual const RecordIdentifier& record_identifier() const; |
+ virtual bool LoadCurrentRow() = 0; |
+ |
+ protected: |
+ Cursor(scoped_refptr<IndexedDBBackingStore> backing_store, |
+ Transaction* transaction, |
+ int64 database_id, |
+ const CursorOptions& cursor_options); |
+ explicit Cursor(const IndexedDBBackingStore::Cursor* other); |
+ |
+ virtual std::string EncodeKey(const IndexedDBKey& key) = 0; |
+ virtual std::string EncodeKey(const IndexedDBKey& key, |
+ const IndexedDBKey& primary_key) = 0; |
+ |
+ bool IsPastBounds() const; |
+ bool HaveEnteredRange() const; |
+ |
+ IndexedDBBackingStore* backing_store_; |
+ Transaction* transaction_; |
+ int64 database_id_; |
+ const CursorOptions cursor_options_; |
+ scoped_ptr<LevelDBIterator> iterator_; |
+ scoped_ptr<IndexedDBKey> current_key_; |
+ IndexedDBBackingStore::RecordIdentifier record_identifier_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(Cursor); |
+ }; |
+ |
const GURL& origin_url() const { return origin_url_; } |
IndexedDBFactory* factory() const { return indexed_db_factory_; } |
base::SequencedTaskRunner* task_runner() const { return task_runner_.get(); } |
@@ -149,36 +380,6 @@ class CONTENT_EXPORT IndexedDBBackingStore |
int64 database_id, |
int64 object_store_id) WARN_UNUSED_RESULT; |
- class CONTENT_EXPORT RecordIdentifier { |
- public: |
- RecordIdentifier(const std::string& primary_key, int64 version); |
- RecordIdentifier(); |
- ~RecordIdentifier(); |
- |
- const std::string& primary_key() const { return primary_key_; } |
- int64 version() const { return version_; } |
- void Reset(const std::string& primary_key, int64 version) { |
- primary_key_ = primary_key; |
- version_ = version; |
- } |
- |
- private: |
- // TODO(jsbell): Make it more clear that this is the *encoded* version of |
- // the key. |
- std::string primary_key_; |
- int64 version_; |
- DISALLOW_COPY_AND_ASSIGN(RecordIdentifier); |
- }; |
- |
- class BlobWriteCallback : public base::RefCounted<BlobWriteCallback> { |
- public: |
- virtual void Run(bool succeeded) = 0; |
- |
- protected: |
- friend class base::RefCounted<BlobWriteCallback>; |
- virtual ~BlobWriteCallback() {} |
- }; |
- |
virtual leveldb::Status GetRecord( |
IndexedDBBackingStore::Transaction* transaction, |
int64 database_id, |
@@ -268,75 +469,6 @@ class CONTENT_EXPORT IndexedDBBackingStore |
base::FilePath GetBlobFileName(int64 database_id, int64 key); |
- class Cursor { |
- public: |
- virtual ~Cursor(); |
- |
- enum IteratorState { |
- READY = 0, |
- SEEK |
- }; |
- |
- struct CursorOptions { |
- CursorOptions(); |
- ~CursorOptions(); |
- int64 database_id; |
- int64 object_store_id; |
- int64 index_id; |
- std::string low_key; |
- bool low_open; |
- std::string high_key; |
- bool high_open; |
- bool forward; |
- bool unique; |
- }; |
- |
- const IndexedDBKey& key() const { return *current_key_; } |
- bool Continue(leveldb::Status* s) { return Continue(NULL, NULL, SEEK, s); } |
- bool Continue(const IndexedDBKey* key, |
- IteratorState state, |
- leveldb::Status* s) { |
- return Continue(key, NULL, state, s); |
- } |
- bool Continue(const IndexedDBKey* key, |
- const IndexedDBKey* primary_key, |
- IteratorState state, |
- leveldb::Status*); |
- bool Advance(uint32 count, leveldb::Status*); |
- bool FirstSeek(leveldb::Status*); |
- |
- virtual Cursor* Clone() = 0; |
- virtual const IndexedDBKey& primary_key() const; |
- virtual IndexedDBValue* value() = 0; |
- virtual const RecordIdentifier& record_identifier() const; |
- virtual bool LoadCurrentRow() = 0; |
- |
- protected: |
- Cursor(scoped_refptr<IndexedDBBackingStore> backing_store, |
- Transaction* transaction, |
- int64 database_id, |
- const CursorOptions& cursor_options); |
- explicit Cursor(const IndexedDBBackingStore::Cursor* other); |
- |
- virtual std::string EncodeKey(const IndexedDBKey& key) = 0; |
- virtual std::string EncodeKey(const IndexedDBKey& key, |
- const IndexedDBKey& primary_key) = 0; |
- |
- bool IsPastBounds() const; |
- bool HaveEnteredRange() const; |
- |
- IndexedDBBackingStore* backing_store_; |
- Transaction* transaction_; |
- int64 database_id_; |
- const CursorOptions cursor_options_; |
- scoped_ptr<LevelDBIterator> iterator_; |
- scoped_ptr<IndexedDBKey> current_key_; |
- IndexedDBBackingStore::RecordIdentifier record_identifier_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(Cursor); |
- }; |
- |
virtual scoped_ptr<Cursor> OpenObjectStoreKeyCursor( |
IndexedDBBackingStore::Transaction* transaction, |
int64 database_id, |
@@ -368,143 +500,9 @@ class CONTENT_EXPORT IndexedDBBackingStore |
blink::WebIDBCursorDirection, |
leveldb::Status*); |
- class BlobChangeRecord { |
- public: |
- BlobChangeRecord(const std::string& key, int64 object_store_id); |
- ~BlobChangeRecord(); |
- const std::string& key() const { return key_; } |
- int64 object_store_id() const { return object_store_id_; } |
- void SetBlobInfo(std::vector<IndexedDBBlobInfo>* blob_info); |
- std::vector<IndexedDBBlobInfo>& mutable_blob_info() { return blob_info_; } |
- const std::vector<IndexedDBBlobInfo>& blob_info() const { |
- return blob_info_; |
- } |
- void SetHandles(ScopedVector<webkit_blob::BlobDataHandle>* handles); |
- scoped_ptr<BlobChangeRecord> Clone() const; |
- |
- private: |
- std::string key_; |
- int64 object_store_id_; |
- std::vector<IndexedDBBlobInfo> blob_info_; |
- ScopedVector<webkit_blob::BlobDataHandle> handles_; |
- DISALLOW_COPY_AND_ASSIGN(BlobChangeRecord); |
- }; |
- typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; |
- |
- class Transaction { |
- public: |
- explicit Transaction(IndexedDBBackingStore* backing_store); |
- virtual ~Transaction(); |
- virtual void Begin(); |
- // The callback will be called eventually on success or failure, or |
- // immediately if phase one is complete due to lack of any blobs to write. |
- virtual leveldb::Status CommitPhaseOne(scoped_refptr<BlobWriteCallback>); |
- virtual leveldb::Status CommitPhaseTwo(); |
- virtual void Rollback(); |
- void Reset() { |
- backing_store_ = NULL; |
- transaction_ = NULL; |
- } |
- leveldb::Status PutBlobInfoIfNeeded( |
- int64 database_id, |
- int64 object_store_id, |
- const std::string& object_store_data_key, |
- std::vector<IndexedDBBlobInfo>*, |
- ScopedVector<webkit_blob::BlobDataHandle>* handles); |
- void PutBlobInfo(int64 database_id, |
- int64 object_store_id, |
- const std::string& object_store_data_key, |
- std::vector<IndexedDBBlobInfo>*, |
- ScopedVector<webkit_blob::BlobDataHandle>* handles); |
- |
- LevelDBTransaction* transaction() { return transaction_; } |
- |
- leveldb::Status GetBlobInfoForRecord( |
- int64 database_id, |
- const std::string& object_store_data_key, |
- IndexedDBValue* value); |
- |
- // This holds a BlobEntryKey and the encoded IndexedDBBlobInfo vector stored |
- // under that key. |
- typedef std::vector<std::pair<BlobEntryKey, std::string> > |
- BlobEntryKeyValuePairVec; |
- |
- class WriteDescriptor { |
- public: |
- WriteDescriptor(const GURL& url, int64_t key, int64_t size); |
- WriteDescriptor(const base::FilePath& path, |
- int64_t key, |
- int64_t size, |
- base::Time last_modified); |
- |
- bool is_file() const { return is_file_; } |
- const GURL& url() const { |
- DCHECK(!is_file_); |
- return url_; |
- } |
- const base::FilePath& file_path() const { |
- DCHECK(is_file_); |
- return file_path_; |
- } |
- int64_t key() const { return key_; } |
- int64_t size() const { return size_; } |
- base::Time last_modified() const { return last_modified_; } |
- |
- private: |
- bool is_file_; |
- GURL url_; |
- base::FilePath file_path_; |
- int64_t key_; |
- int64_t size_; |
- base::Time last_modified_; |
- }; |
- |
- class ChainedBlobWriter |
- : public base::RefCountedThreadSafe<ChainedBlobWriter> { |
- public: |
- virtual void set_delegate( |
- scoped_ptr<fileapi::FileWriterDelegate> delegate) = 0; |
- |
- // TODO(ericu): Add a reason in the event of failure. |
- virtual void ReportWriteCompletion(bool succeeded, |
- int64 bytes_written) = 0; |
- |
- virtual void Abort() = 0; |
- |
- protected: |
- friend class base::RefCountedThreadSafe<ChainedBlobWriter>; |
- virtual ~ChainedBlobWriter() {} |
- }; |
- |
- class ChainedBlobWriterImpl; |
- |
- typedef std::vector<WriteDescriptor> WriteDescriptorVec; |
- |
- private: |
- class BlobWriteCallbackWrapper; |
- |
- leveldb::Status HandleBlobPreTransaction( |
- BlobEntryKeyValuePairVec* new_blob_entries, |
- WriteDescriptorVec* new_files_to_write); |
- // Returns true on success, false on failure. |
- bool CollectBlobFilesToRemove(); |
- // The callback will be called eventually on success or failure. |
- void WriteNewBlobs(BlobEntryKeyValuePairVec* new_blob_entries, |
- WriteDescriptorVec* new_files_to_write, |
- scoped_refptr<BlobWriteCallback> callback); |
- leveldb::Status SortBlobsToRemove(); |
- |
- IndexedDBBackingStore* backing_store_; |
- scoped_refptr<LevelDBTransaction> transaction_; |
- BlobChangeMap blob_change_map_; |
- BlobChangeMap incognito_blob_map_; |
- int64 database_id_; |
- BlobJournalType blobs_to_remove_; |
- scoped_refptr<ChainedBlobWriter> chained_blob_writer_; |
- }; |
- |
protected: |
friend class base::RefCounted<IndexedDBBackingStore>; |
+ |
IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, |
const GURL& origin_url, |
const base::FilePath& blob_path, |