OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | 5 #ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ |
6 #define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | 6 #define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 RecordIdentifier* record) WARN_UNUSED_RESULT; | 196 RecordIdentifier* record) WARN_UNUSED_RESULT; |
197 virtual leveldb::Status ClearObjectStore( | 197 virtual leveldb::Status ClearObjectStore( |
198 IndexedDBBackingStore::Transaction* transaction, | 198 IndexedDBBackingStore::Transaction* transaction, |
199 int64 database_id, | 199 int64 database_id, |
200 int64 object_store_id) WARN_UNUSED_RESULT; | 200 int64 object_store_id) WARN_UNUSED_RESULT; |
201 virtual leveldb::Status DeleteRecord( | 201 virtual leveldb::Status DeleteRecord( |
202 IndexedDBBackingStore::Transaction* transaction, | 202 IndexedDBBackingStore::Transaction* transaction, |
203 int64 database_id, | 203 int64 database_id, |
204 int64 object_store_id, | 204 int64 object_store_id, |
205 const RecordIdentifier& record) WARN_UNUSED_RESULT; | 205 const RecordIdentifier& record) WARN_UNUSED_RESULT; |
| 206 virtual leveldb::Status DeleteRange( |
| 207 IndexedDBBackingStore::Transaction* transaction, |
| 208 int64 database_id, |
| 209 int64 object_store_id, |
| 210 const IndexedDBKeyRange&) WARN_UNUSED_RESULT; |
206 virtual leveldb::Status GetKeyGeneratorCurrentNumber( | 211 virtual leveldb::Status GetKeyGeneratorCurrentNumber( |
207 IndexedDBBackingStore::Transaction* transaction, | 212 IndexedDBBackingStore::Transaction* transaction, |
208 int64 database_id, | 213 int64 database_id, |
209 int64 object_store_id, | 214 int64 object_store_id, |
210 int64* current_number) WARN_UNUSED_RESULT; | 215 int64* current_number) WARN_UNUSED_RESULT; |
211 virtual leveldb::Status MaybeUpdateKeyGeneratorCurrentNumber( | 216 virtual leveldb::Status MaybeUpdateKeyGeneratorCurrentNumber( |
212 IndexedDBBackingStore::Transaction* transaction, | 217 IndexedDBBackingStore::Transaction* transaction, |
213 int64 database_id, | 218 int64 database_id, |
214 int64 object_store_id, | 219 int64 object_store_id, |
215 int64 new_state, | 220 int64 new_state, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 int64 index_id, | 262 int64 index_id, |
258 const IndexedDBKey& key, | 263 const IndexedDBKey& key, |
259 scoped_ptr<IndexedDBKey>* found_primary_key, | 264 scoped_ptr<IndexedDBKey>* found_primary_key, |
260 bool* exists) WARN_UNUSED_RESULT; | 265 bool* exists) WARN_UNUSED_RESULT; |
261 | 266 |
262 // Public for IndexedDBActiveBlobRegistry::ReleaseBlobRef. | 267 // Public for IndexedDBActiveBlobRegistry::ReleaseBlobRef. |
263 virtual void ReportBlobUnused(int64 database_id, int64 blob_key); | 268 virtual void ReportBlobUnused(int64 database_id, int64 blob_key); |
264 | 269 |
265 base::FilePath GetBlobFileName(int64 database_id, int64 key); | 270 base::FilePath GetBlobFileName(int64 database_id, int64 key); |
266 | 271 |
| 272 class Transaction; |
| 273 |
267 class Cursor { | 274 class Cursor { |
268 public: | 275 public: |
269 virtual ~Cursor(); | 276 virtual ~Cursor(); |
270 | 277 |
271 enum IteratorState { | 278 enum IteratorState { |
272 READY = 0, | 279 READY = 0, |
273 SEEK | 280 SEEK |
274 }; | 281 }; |
275 | 282 |
276 struct CursorOptions { | 283 struct CursorOptions { |
(...skipping 24 matching lines...) Expand all Loading... |
301 bool Advance(uint32 count, leveldb::Status*); | 308 bool Advance(uint32 count, leveldb::Status*); |
302 bool FirstSeek(leveldb::Status*); | 309 bool FirstSeek(leveldb::Status*); |
303 | 310 |
304 virtual Cursor* Clone() = 0; | 311 virtual Cursor* Clone() = 0; |
305 virtual const IndexedDBKey& primary_key() const; | 312 virtual const IndexedDBKey& primary_key() const; |
306 virtual IndexedDBValue* value() = 0; | 313 virtual IndexedDBValue* value() = 0; |
307 virtual const RecordIdentifier& record_identifier() const; | 314 virtual const RecordIdentifier& record_identifier() const; |
308 virtual bool LoadCurrentRow() = 0; | 315 virtual bool LoadCurrentRow() = 0; |
309 | 316 |
310 protected: | 317 protected: |
311 Cursor(LevelDBTransaction* transaction, | 318 Cursor(scoped_refptr<IndexedDBBackingStore> backing_store, |
| 319 Transaction* transaction, |
| 320 int64 database_id, |
312 const CursorOptions& cursor_options); | 321 const CursorOptions& cursor_options); |
313 explicit Cursor(const IndexedDBBackingStore::Cursor* other); | 322 explicit Cursor(const IndexedDBBackingStore::Cursor* other); |
314 | 323 |
315 virtual std::string EncodeKey(const IndexedDBKey& key) = 0; | 324 virtual std::string EncodeKey(const IndexedDBKey& key) = 0; |
316 virtual std::string EncodeKey(const IndexedDBKey& key, | 325 virtual std::string EncodeKey(const IndexedDBKey& key, |
317 const IndexedDBKey& primary_key) = 0; | 326 const IndexedDBKey& primary_key) = 0; |
318 | 327 |
319 bool IsPastBounds() const; | 328 bool IsPastBounds() const; |
320 bool HaveEnteredRange() const; | 329 bool HaveEnteredRange() const; |
321 | 330 |
322 LevelDBTransaction* transaction_; | 331 IndexedDBBackingStore* backing_store_; |
| 332 Transaction* transaction_; |
| 333 int64 database_id_; |
323 const CursorOptions cursor_options_; | 334 const CursorOptions cursor_options_; |
324 scoped_ptr<LevelDBIterator> iterator_; | 335 scoped_ptr<LevelDBIterator> iterator_; |
325 scoped_ptr<IndexedDBKey> current_key_; | 336 scoped_ptr<IndexedDBKey> current_key_; |
326 IndexedDBBackingStore::RecordIdentifier record_identifier_; | 337 IndexedDBBackingStore::RecordIdentifier record_identifier_; |
327 }; | 338 }; |
328 | 339 |
329 virtual scoped_ptr<Cursor> OpenObjectStoreKeyCursor( | 340 virtual scoped_ptr<Cursor> OpenObjectStoreKeyCursor( |
330 IndexedDBBackingStore::Transaction* transaction, | 341 IndexedDBBackingStore::Transaction* transaction, |
331 int64 database_id, | 342 int64 database_id, |
332 int64 object_store_id, | 343 int64 object_store_id, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 ScopedVector<webkit_blob::BlobDataHandle> handles_; | 389 ScopedVector<webkit_blob::BlobDataHandle> handles_; |
379 DISALLOW_COPY_AND_ASSIGN(BlobChangeRecord); | 390 DISALLOW_COPY_AND_ASSIGN(BlobChangeRecord); |
380 }; | 391 }; |
381 typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; | 392 typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; |
382 | 393 |
383 class Transaction { | 394 class Transaction { |
384 public: | 395 public: |
385 explicit Transaction(IndexedDBBackingStore* backing_store); | 396 explicit Transaction(IndexedDBBackingStore* backing_store); |
386 virtual ~Transaction(); | 397 virtual ~Transaction(); |
387 virtual void Begin(); | 398 virtual void Begin(); |
388 virtual leveldb::Status Commit(); | 399 // The callback will be called eventually on success or failure, or |
| 400 // immediately if phase one is complete due to lack of any blobs to write. |
| 401 virtual leveldb::Status CommitPhaseOne(scoped_refptr<BlobWriteCallback>); |
| 402 virtual leveldb::Status CommitPhaseTwo(); |
389 virtual void Rollback(); | 403 virtual void Rollback(); |
390 void Reset() { | 404 void Reset() { |
391 backing_store_ = NULL; | 405 backing_store_ = NULL; |
392 transaction_ = NULL; | 406 transaction_ = NULL; |
393 } | 407 } |
394 void PutBlobInfo(int64 database_id, | 408 void PutBlobInfo(int64 database_id, |
395 int64 object_store_id, | 409 int64 object_store_id, |
396 const std::string& object_store_data_key, | 410 const std::string& object_store_data_key, |
397 std::vector<IndexedDBBlobInfo>*, | 411 std::vector<IndexedDBBlobInfo>*, |
398 ScopedVector<webkit_blob::BlobDataHandle>* handles); | 412 ScopedVector<webkit_blob::BlobDataHandle>* handles); |
399 | 413 |
400 LevelDBTransaction* transaction() { return transaction_; } | 414 LevelDBTransaction* transaction() { return transaction_; } |
401 | 415 |
| 416 leveldb::Status GetBlobInfoForRecord( |
| 417 int64 database_id, |
| 418 const std::string& object_store_data_key, |
| 419 IndexedDBValue* value); |
| 420 |
402 // This holds a BlobEntryKey and the encoded IndexedDBBlobInfo vector stored | 421 // This holds a BlobEntryKey and the encoded IndexedDBBlobInfo vector stored |
403 // under that key. | 422 // under that key. |
404 typedef std::vector<std::pair<BlobEntryKey, std::string> > | 423 typedef std::vector<std::pair<BlobEntryKey, std::string> > |
405 BlobEntryKeyValuePairVec; | 424 BlobEntryKeyValuePairVec; |
406 | 425 |
407 class WriteDescriptor { | 426 class WriteDescriptor { |
408 public: | 427 public: |
409 WriteDescriptor(const GURL& url, int64_t key); | 428 WriteDescriptor(const GURL& url, int64_t key); |
410 WriteDescriptor(const base::FilePath& path, int64_t key); | 429 WriteDescriptor(const base::FilePath& path, int64_t key); |
411 | 430 |
(...skipping 30 matching lines...) Expand all Loading... |
442 virtual ~ChainedBlobWriter() {} | 461 virtual ~ChainedBlobWriter() {} |
443 friend class base::RefCounted<ChainedBlobWriter>; | 462 friend class base::RefCounted<ChainedBlobWriter>; |
444 }; | 463 }; |
445 class ChainedBlobWriterImpl; | 464 class ChainedBlobWriterImpl; |
446 | 465 |
447 typedef std::vector<WriteDescriptor> WriteDescriptorVec; | 466 typedef std::vector<WriteDescriptor> WriteDescriptorVec; |
448 | 467 |
449 private: | 468 private: |
450 class BlobWriteCallbackWrapper; | 469 class BlobWriteCallbackWrapper; |
451 | 470 |
| 471 // These return true on success, false on failure. |
| 472 leveldb::Status HandleBlobPreTransaction( |
| 473 BlobEntryKeyValuePairVec* new_blob_entries, |
| 474 WriteDescriptorVec* new_files_to_write); |
| 475 bool CollectBlobFilesToRemove(); |
452 // The callback will be called eventually on success or failure. | 476 // The callback will be called eventually on success or failure. |
453 void WriteNewBlobs(BlobEntryKeyValuePairVec& new_blob_entries, | 477 void WriteNewBlobs(BlobEntryKeyValuePairVec& new_blob_entries, |
454 WriteDescriptorVec& new_files_to_write, | 478 WriteDescriptorVec& new_files_to_write, |
455 scoped_refptr<BlobWriteCallback> callback); | 479 scoped_refptr<BlobWriteCallback> callback); |
| 480 leveldb::Status SortBlobsToRemove(); |
456 | 481 |
457 IndexedDBBackingStore* backing_store_; | 482 IndexedDBBackingStore* backing_store_; |
458 scoped_refptr<LevelDBTransaction> transaction_; | 483 scoped_refptr<LevelDBTransaction> transaction_; |
459 BlobChangeMap blob_change_map_; | 484 BlobChangeMap blob_change_map_; |
460 BlobChangeMap incognito_blob_map_; | 485 BlobChangeMap incognito_blob_map_; |
461 int64 database_id_; | 486 int64 database_id_; |
| 487 BlobJournalType blobs_to_remove_; |
462 scoped_refptr<ChainedBlobWriter> chained_blob_writer_; | 488 scoped_refptr<ChainedBlobWriter> chained_blob_writer_; |
463 }; | 489 }; |
464 | 490 |
465 protected: | 491 protected: |
466 IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, | 492 IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, |
467 const GURL& origin_url, | 493 const GURL& origin_url, |
468 const base::FilePath& blob_path, | 494 const base::FilePath& blob_path, |
469 net::URLRequestContext* request_context, | 495 net::URLRequestContext* request_context, |
470 scoped_ptr<LevelDBDatabase> db, | 496 scoped_ptr<LevelDBDatabase> db, |
471 scoped_ptr<LevelDBComparator> comparator, | 497 scoped_ptr<LevelDBComparator> comparator, |
472 base::TaskRunner* task_runner); | 498 base::TaskRunner* task_runner); |
473 virtual ~IndexedDBBackingStore(); | 499 virtual ~IndexedDBBackingStore(); |
474 friend class base::RefCounted<IndexedDBBackingStore>; | 500 friend class base::RefCounted<IndexedDBBackingStore>; |
475 | 501 |
476 bool is_incognito() const { return !indexed_db_factory_; } | 502 bool is_incognito() const { return !indexed_db_factory_; } |
477 | 503 |
| 504 bool SetUpMetadata(); |
| 505 |
478 virtual bool WriteBlobFile( | 506 virtual bool WriteBlobFile( |
479 int64 database_id, | 507 int64 database_id, |
480 const Transaction::WriteDescriptor& descriptor, | 508 const Transaction::WriteDescriptor& descriptor, |
481 Transaction::ChainedBlobWriter* chained_blob_writer); | 509 Transaction::ChainedBlobWriter* chained_blob_writer); |
482 virtual bool RemoveBlobFile(int64 database_id, int64 key); | 510 virtual bool RemoveBlobFile(int64 database_id, int64 key); |
483 virtual void StartJournalCleaningTimer(); | 511 virtual void StartJournalCleaningTimer(); |
484 void CleanPrimaryJournalIgnoreReturn(); | 512 void CleanPrimaryJournalIgnoreReturn(); |
485 | 513 |
486 private: | 514 private: |
487 static scoped_refptr<IndexedDBBackingStore> Create( | 515 static scoped_refptr<IndexedDBBackingStore> Create( |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 scoped_ptr<LevelDBComparator> comparator_; | 562 scoped_ptr<LevelDBComparator> comparator_; |
535 // Whenever blobs are registered in active_blob_registry_, indexed_db_factory_ | 563 // Whenever blobs are registered in active_blob_registry_, indexed_db_factory_ |
536 // will hold a reference to this backing store. | 564 // will hold a reference to this backing store. |
537 IndexedDBActiveBlobRegistry active_blob_registry_; | 565 IndexedDBActiveBlobRegistry active_blob_registry_; |
538 base::OneShotTimer<IndexedDBBackingStore> close_timer_; | 566 base::OneShotTimer<IndexedDBBackingStore> close_timer_; |
539 }; | 567 }; |
540 | 568 |
541 } // namespace content | 569 } // namespace content |
542 | 570 |
543 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | 571 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ |
OLD | NEW |