| 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 <string> | 9 #include <string> |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 12 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 13 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 14 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/strings/string_piece.h" | 16 #include "base/strings/string_piece.h" |
| 16 #include "base/timer/timer.h" | 17 #include "base/timer/timer.h" |
| 17 #include "content/browser/indexed_db/indexed_db.h" | 18 #include "content/browser/indexed_db/indexed_db.h" |
| 18 #include "content/browser/indexed_db/indexed_db_active_blob_registry.h" | 19 #include "content/browser/indexed_db/indexed_db_active_blob_registry.h" |
| 20 #include "content/browser/indexed_db/indexed_db_blob_info.h" |
| 19 #include "content/browser/indexed_db/indexed_db_metadata.h" | 21 #include "content/browser/indexed_db/indexed_db_metadata.h" |
| 20 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h" | 22 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h" |
| 21 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" | 23 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" |
| 22 #include "content/common/content_export.h" | 24 #include "content/common/content_export.h" |
| 23 #include "content/common/indexed_db/indexed_db_key.h" | 25 #include "content/common/indexed_db/indexed_db_key.h" |
| 24 #include "content/common/indexed_db/indexed_db_key_path.h" | 26 #include "content/common/indexed_db/indexed_db_key_path.h" |
| 25 #include "content/common/indexed_db/indexed_db_key_range.h" | 27 #include "content/common/indexed_db/indexed_db_key_range.h" |
| 26 #include "third_party/leveldatabase/src/include/leveldb/status.h" | 28 #include "third_party/leveldatabase/src/include/leveldb/status.h" |
| 27 #include "url/gurl.h" | 29 #include "url/gurl.h" |
| 30 #include "webkit/browser/blob/blob_data_handle.h" |
| 28 | 31 |
| 29 namespace base { | 32 namespace base { |
| 30 class TaskRunner; | 33 class TaskRunner; |
| 31 } | 34 } |
| 32 | 35 |
| 33 namespace content { | 36 namespace content { |
| 34 | 37 |
| 35 class IndexedDBFactory; | 38 class IndexedDBFactory; |
| 36 class LevelDBComparator; | 39 class LevelDBComparator; |
| 37 class LevelDBDatabase; | 40 class LevelDBDatabase; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 LevelDBFactory* leveldb_factory, | 91 LevelDBFactory* leveldb_factory, |
| 89 base::TaskRunner* task_runner); | 92 base::TaskRunner* task_runner); |
| 90 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( | 93 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( |
| 91 const GURL& origin_url, | 94 const GURL& origin_url, |
| 92 base::TaskRunner* task_runner); | 95 base::TaskRunner* task_runner); |
| 93 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( | 96 static scoped_refptr<IndexedDBBackingStore> OpenInMemory( |
| 94 const GURL& origin_url, | 97 const GURL& origin_url, |
| 95 LevelDBFactory* level_db_factory, | 98 LevelDBFactory* level_db_factory, |
| 96 base::TaskRunner* task_runner); | 99 base::TaskRunner* task_runner); |
| 97 | 100 |
| 101 void GrantChildProcessPermissions(int child_process_id); |
| 102 |
| 98 // Compact is public for testing. | 103 // Compact is public for testing. |
| 99 virtual void Compact(); | 104 virtual void Compact(); |
| 100 virtual std::vector<base::string16> GetDatabaseNames(leveldb::Status*); | 105 virtual std::vector<base::string16> GetDatabaseNames(leveldb::Status*); |
| 101 virtual leveldb::Status GetIDBDatabaseMetaData( | 106 virtual leveldb::Status GetIDBDatabaseMetaData( |
| 102 const base::string16& name, | 107 const base::string16& name, |
| 103 IndexedDBDatabaseMetadata* metadata, | 108 IndexedDBDatabaseMetadata* metadata, |
| 104 bool* success) WARN_UNUSED_RESULT; | 109 bool* success) WARN_UNUSED_RESULT; |
| 105 virtual leveldb::Status CreateIDBDatabaseMetaData( | 110 virtual leveldb::Status CreateIDBDatabaseMetaData( |
| 106 const base::string16& name, | 111 const base::string16& name, |
| 107 const base::string16& version, | 112 const base::string16& version, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 IndexedDBBackingStore::Transaction* transaction, | 164 IndexedDBBackingStore::Transaction* transaction, |
| 160 int64 database_id, | 165 int64 database_id, |
| 161 int64 object_store_id, | 166 int64 object_store_id, |
| 162 const IndexedDBKey& key, | 167 const IndexedDBKey& key, |
| 163 IndexedDBValue* record) WARN_UNUSED_RESULT; | 168 IndexedDBValue* record) WARN_UNUSED_RESULT; |
| 164 virtual leveldb::Status PutRecord( | 169 virtual leveldb::Status PutRecord( |
| 165 IndexedDBBackingStore::Transaction* transaction, | 170 IndexedDBBackingStore::Transaction* transaction, |
| 166 int64 database_id, | 171 int64 database_id, |
| 167 int64 object_store_id, | 172 int64 object_store_id, |
| 168 const IndexedDBKey& key, | 173 const IndexedDBKey& key, |
| 169 const IndexedDBValue& value, | 174 IndexedDBValue& value, |
| 175 ScopedVector<webkit_blob::BlobDataHandle>* handles, |
| 170 RecordIdentifier* record) WARN_UNUSED_RESULT; | 176 RecordIdentifier* record) WARN_UNUSED_RESULT; |
| 171 virtual leveldb::Status ClearObjectStore( | 177 virtual leveldb::Status ClearObjectStore( |
| 172 IndexedDBBackingStore::Transaction* transaction, | 178 IndexedDBBackingStore::Transaction* transaction, |
| 173 int64 database_id, | 179 int64 database_id, |
| 174 int64 object_store_id) WARN_UNUSED_RESULT; | 180 int64 object_store_id) WARN_UNUSED_RESULT; |
| 175 virtual leveldb::Status DeleteRecord( | 181 virtual leveldb::Status DeleteRecord( |
| 176 IndexedDBBackingStore::Transaction* transaction, | 182 IndexedDBBackingStore::Transaction* transaction, |
| 177 int64 database_id, | 183 int64 database_id, |
| 178 int64 object_store_id, | 184 int64 object_store_id, |
| 179 const RecordIdentifier& record) WARN_UNUSED_RESULT; | 185 const RecordIdentifier& record) WARN_UNUSED_RESULT; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 public: | 339 public: |
| 334 explicit Transaction(IndexedDBBackingStore* backing_store); | 340 explicit Transaction(IndexedDBBackingStore* backing_store); |
| 335 virtual ~Transaction(); | 341 virtual ~Transaction(); |
| 336 virtual void Begin(); | 342 virtual void Begin(); |
| 337 virtual leveldb::Status Commit(); | 343 virtual leveldb::Status Commit(); |
| 338 virtual void Rollback(); | 344 virtual void Rollback(); |
| 339 void Reset() { | 345 void Reset() { |
| 340 backing_store_ = NULL; | 346 backing_store_ = NULL; |
| 341 transaction_ = NULL; | 347 transaction_ = NULL; |
| 342 } | 348 } |
| 349 void PutBlobInfo(int64 database_id, |
| 350 int64 object_store_id, |
| 351 const std::string& key, |
| 352 std::vector<IndexedDBBlobInfo>*, |
| 353 ScopedVector<webkit_blob::BlobDataHandle>* handles); |
| 343 | 354 |
| 344 LevelDBTransaction* transaction() { return transaction_; } | 355 LevelDBTransaction* transaction() { return transaction_; } |
| 345 | 356 |
| 346 private: | 357 private: |
| 358 class BlobChangeRecord { |
| 359 public: |
| 360 BlobChangeRecord(const std::string& key, int64 object_store_id); |
| 361 ~BlobChangeRecord(); |
| 362 const std::string& key() const { return key_; } |
| 363 int64 object_store_id() const { return object_store_id_; } |
| 364 void SetBlobInfo(std::vector<IndexedDBBlobInfo>* blob_info); |
| 365 std::vector<IndexedDBBlobInfo>& mutable_blob_info() { return blob_info_; } |
| 366 void SetHandles(ScopedVector<webkit_blob::BlobDataHandle>* handles); |
| 367 |
| 368 private: |
| 369 std::string key_; |
| 370 int64 object_store_id_; |
| 371 std::vector<IndexedDBBlobInfo> blob_info_; |
| 372 ScopedVector<webkit_blob::BlobDataHandle> handles_; |
| 373 }; |
| 374 typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; |
| 375 |
| 347 IndexedDBBackingStore* backing_store_; | 376 IndexedDBBackingStore* backing_store_; |
| 348 scoped_refptr<LevelDBTransaction> transaction_; | 377 scoped_refptr<LevelDBTransaction> transaction_; |
| 378 BlobChangeMap blob_change_map_; |
| 379 int64 database_id_; |
| 349 }; | 380 }; |
| 350 | 381 |
| 351 protected: | 382 protected: |
| 352 IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, | 383 IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, |
| 353 const GURL& origin_url, | 384 const GURL& origin_url, |
| 385 const base::FilePath& blob_path, |
| 354 scoped_ptr<LevelDBDatabase> db, | 386 scoped_ptr<LevelDBDatabase> db, |
| 355 scoped_ptr<LevelDBComparator> comparator, | 387 scoped_ptr<LevelDBComparator> comparator, |
| 356 base::TaskRunner* task_runner); | 388 base::TaskRunner* task_runner); |
| 357 virtual ~IndexedDBBackingStore(); | 389 virtual ~IndexedDBBackingStore(); |
| 358 friend class base::RefCounted<IndexedDBBackingStore>; | 390 friend class base::RefCounted<IndexedDBBackingStore>; |
| 359 | 391 |
| 360 private: | 392 private: |
| 361 static scoped_refptr<IndexedDBBackingStore> Create( | 393 static scoped_refptr<IndexedDBBackingStore> Create( |
| 362 IndexedDBFactory* indexed_db_factory, | 394 IndexedDBFactory* indexed_db_factory, |
| 363 const GURL& origin_url, | 395 const GURL& origin_url, |
| 396 const base::FilePath& blob_path, |
| 364 scoped_ptr<LevelDBDatabase> db, | 397 scoped_ptr<LevelDBDatabase> db, |
| 365 scoped_ptr<LevelDBComparator> comparator, | 398 scoped_ptr<LevelDBComparator> comparator, |
| 366 base::TaskRunner* task_runner); | 399 base::TaskRunner* task_runner); |
| 367 | 400 |
| 368 static bool ReadCorruptionInfo(const base::FilePath& path_base, | 401 static bool ReadCorruptionInfo(const base::FilePath& path_base, |
| 369 const GURL& origin_url, | 402 const GURL& origin_url, |
| 370 std::string& message); | 403 std::string& message); |
| 371 | 404 |
| 372 leveldb::Status FindKeyInIndex( | 405 leveldb::Status FindKeyInIndex( |
| 373 IndexedDBBackingStore::Transaction* transaction, | 406 IndexedDBBackingStore::Transaction* transaction, |
| 374 int64 database_id, | 407 int64 database_id, |
| 375 int64 object_store_id, | 408 int64 object_store_id, |
| 376 int64 index_id, | 409 int64 index_id, |
| 377 const IndexedDBKey& key, | 410 const IndexedDBKey& key, |
| 378 std::string* found_encoded_primary_key, | 411 std::string* found_encoded_primary_key, |
| 379 bool* found); | 412 bool* found); |
| 380 leveldb::Status GetIndexes(int64 database_id, | 413 leveldb::Status GetIndexes(int64 database_id, |
| 381 int64 object_store_id, | 414 int64 object_store_id, |
| 382 IndexedDBObjectStoreMetadata::IndexMap* map) | 415 IndexedDBObjectStoreMetadata::IndexMap* map) |
| 383 WARN_UNUSED_RESULT; | 416 WARN_UNUSED_RESULT; |
| 384 | 417 |
| 385 IndexedDBFactory* indexed_db_factory_; | 418 IndexedDBFactory* indexed_db_factory_; |
| 386 const GURL origin_url_; | 419 const GURL origin_url_; |
| 420 base::FilePath blob_path_; |
| 387 | 421 |
| 388 // The origin identifier is a key prefix unique to the origin used in the | 422 // The origin identifier is a key prefix unique to the origin used in the |
| 389 // leveldb backing store to partition data by origin. It is a normalized | 423 // leveldb backing store to partition data by origin. It is a normalized |
| 390 // version of the origin URL with a versioning suffix appended, e.g. | 424 // version of the origin URL with a versioning suffix appended, e.g. |
| 391 // "http_localhost_81@1" Since only one origin is stored per backing store | 425 // "http_localhost_81@1" Since only one origin is stored per backing store |
| 392 // this is redundant but necessary for backwards compatibility; the suffix | 426 // this is redundant but necessary for backwards compatibility; the suffix |
| 393 // provides for future flexibility. | 427 // provides for future flexibility. |
| 394 const std::string origin_identifier_; | 428 const std::string origin_identifier_; |
| 395 base::TaskRunner* task_runner_; | 429 base::TaskRunner* task_runner_; |
| 430 std::set<int> child_process_ids_granted_; |
| 396 | 431 |
| 397 scoped_ptr<LevelDBDatabase> db_; | 432 scoped_ptr<LevelDBDatabase> db_; |
| 398 scoped_ptr<LevelDBComparator> comparator_; | 433 scoped_ptr<LevelDBComparator> comparator_; |
| 399 // Whenever blobs are registered in active_blob_registry_, indexed_db_factory_ | 434 // Whenever blobs are registered in active_blob_registry_, indexed_db_factory_ |
| 400 // will hold a reference to this backing store. | 435 // will hold a reference to this backing store. |
| 401 IndexedDBActiveBlobRegistry active_blob_registry_; | 436 IndexedDBActiveBlobRegistry active_blob_registry_; |
| 402 base::OneShotTimer<IndexedDBBackingStore> close_timer_; | 437 base::OneShotTimer<IndexedDBBackingStore> close_timer_; |
| 403 }; | 438 }; |
| 404 | 439 |
| 405 } // namespace content | 440 } // namespace content |
| 406 | 441 |
| 407 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ | 442 #endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ |
| OLD | NEW |