1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <map> 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <set> 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <utility> 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <vector> 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_path.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/ref_counted.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/string_piece.h" 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/time/time.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/timer/timer.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db.h" 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/indexed_db/indexed_db_active_blob_registry.h" 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/indexed_db/indexed_db_blob_info.h" 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/indexed_db/indexed_db_leveldb_coding.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_metadata.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_iterator.h" 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_transaction.h" 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/content_export.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key.h" 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key_path.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key_range.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/blob_data_handle.h" 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/status.h" 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "url/gurl.h" 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace base { 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SequencedTaskRunner; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass FileWriterDelegate; 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace net { 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass URLRequestContext; 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass IndexedDBFactory; 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LevelDBComparator; 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class LevelDBDatabase; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass LevelDBFactory; 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct IndexedDBValue; 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CONTENT_EXPORT IndexedDBBackingStore 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : public base::RefCounted<IndexedDBBackingStore> { 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class CONTENT_EXPORT Comparator : public LevelDBComparator { 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual int Compare(const base::StringPiece& a, 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::StringPiece& b) const OVERRIDE; 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual const char* Name() const OVERRIDE; 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CONTENT_EXPORT RecordIdentifier { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RecordIdentifier(const std::string& primary_key, int64 version); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RecordIdentifier(); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~RecordIdentifier(); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& primary_key() const { return primary_key_; } 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 version() const { return version_; } 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Reset(const std::string& primary_key, int64 version) { 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci primary_key_ = primary_key; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version_ = version; 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(jsbell): Make it more clear that this is the *encoded* version of 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the key. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string primary_key_; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 version_; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(RecordIdentifier); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class BlobWriteCallback : public base::RefCounted<BlobWriteCallback> { 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Run(bool succeeded) = 0; 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class base::RefCounted<BlobWriteCallback>; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BlobWriteCallback() {} 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class BlobChangeRecord { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobChangeRecord(const std::string& key, int64 object_store_id); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~BlobChangeRecord(); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& key() const { return key_; } 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 object_store_id() const { return object_store_id_; } 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetBlobInfo(std::vector<IndexedDBBlobInfo>* blob_info); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<IndexedDBBlobInfo>& mutable_blob_info() { return blob_info_; } 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<IndexedDBBlobInfo>& blob_info() const { 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return blob_info_; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetHandles(ScopedVector<storage::BlobDataHandle>* handles); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BlobChangeRecord> Clone() const; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string key_; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 object_store_id_; 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<IndexedDBBlobInfo> blob_info_; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<storage::BlobDataHandle> handles_; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BlobChangeRecord); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<std::string, BlobChangeRecord*> BlobChangeMap; 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class CONTENT_EXPORT Transaction { 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit Transaction(IndexedDBBackingStore* backing_store); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~Transaction(); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Begin(); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The callback will be called eventually on success or failure, or 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // immediately if phase one is complete due to lack of any blobs to write. 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual leveldb::Status CommitPhaseOne(scoped_refptr<BlobWriteCallback>); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual leveldb::Status CommitPhaseTwo(); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Rollback(); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Reset() { 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backing_store_ = NULL; 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci transaction_ = NULL; 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status PutBlobInfoIfNeeded( 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 object_store_id, 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& object_store_data_key, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<IndexedDBBlobInfo>*, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<storage::BlobDataHandle>* handles); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void PutBlobInfo(int64 database_id, 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 object_store_id, 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& object_store_data_key, 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<IndexedDBBlobInfo>*, 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<storage::BlobDataHandle>* handles); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LevelDBTransaction* transaction() { return transaction_.get(); } 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status GetBlobInfoForRecord( 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id, 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& object_store_data_key, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IndexedDBValue* value); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This holds a BlobEntryKey and the encoded IndexedDBBlobInfo vector stored 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // under that key. 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::vector<std::pair<BlobEntryKey, std::string> > 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobEntryKeyValuePairVec; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class WriteDescriptor { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WriteDescriptor(const GURL& url, int64_t key, int64_t size); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WriteDescriptor(const base::FilePath& path, 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t key, 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t size, 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time last_modified); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_file() const { return is_file_; } 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url() const { 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!is_file_); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return url_; 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath& file_path() const { 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(is_file_); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return file_path_; 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t key() const { return key_; } 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t size() const { return size_; } 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time last_modified() const { return last_modified_; } 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_file_; 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL url_; 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath file_path_; 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t key_; 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64_t size_; 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time last_modified_; 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class ChainedBlobWriter 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : public base::RefCountedThreadSafe<ChainedBlobWriter> { 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void set_delegate( 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<storage::FileWriterDelegate> delegate) = 0; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(ericu): Add a reason in the event of failure. 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ReportWriteCompletion(bool succeeded, 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 bytes_written) = 0; 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Abort() = 0; 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci friend class base::RefCountedThreadSafe<ChainedBlobWriter>; 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~ChainedBlobWriter() {} 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class ChainedBlobWriterImpl; 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::vector<WriteDescriptor> WriteDescriptorVec; 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class BlobWriteCallbackWrapper; 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status HandleBlobPreTransaction( 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobEntryKeyValuePairVec* new_blob_entries, 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WriteDescriptorVec* new_files_to_write); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true on success, false on failure. 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool CollectBlobFilesToRemove(); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The callback will be called eventually on success or failure. 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void WriteNewBlobs(BlobEntryKeyValuePairVec* new_blob_entries, 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WriteDescriptorVec* new_files_to_write, 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<BlobWriteCallback> callback); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status SortBlobsToRemove(); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IndexedDBBackingStore* backing_store_; 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<LevelDBTransaction> transaction_; 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobChangeMap blob_change_map_; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobChangeMap incognito_blob_map_; 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id_; 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlobJournalType blobs_to_remove_; 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<ChainedBlobWriter> chained_blob_writer_; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class Cursor { 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum IteratorState { READY = 0, SEEK }; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~Cursor(); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct CursorOptions { 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CursorOptions(); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ~CursorOptions(); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id; 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 object_store_id; 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 index_id; 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string low_key; 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool low_open; 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string high_key; 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool high_open; 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool forward; 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool unique; 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const IndexedDBKey& key() const { return *current_key_; } 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Continue(leveldb::Status* s) { return Continue(NULL, NULL, SEEK, s); } 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Continue(const IndexedDBKey* key, 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IteratorState state, 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status* s) { 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Continue(key, NULL, state, s); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Continue(const IndexedDBKey* key, 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const IndexedDBKey* primary_key, 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IteratorState state, 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Status*); 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool Advance(uint32 count, leveldb::Status*); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool FirstSeek(leveldb::Status*); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual Cursor* Clone() = 0; 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual const IndexedDBKey& primary_key() const; 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual IndexedDBValue* value() = 0; 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual const RecordIdentifier& record_identifier() const; 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool LoadCurrentRow() = 0; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Cursor(scoped_refptr<IndexedDBBackingStore> backing_store, 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Transaction* transaction, 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id, 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CursorOptions& cursor_options); 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit Cursor(const IndexedDBBackingStore::Cursor* other); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual std::string EncodeKey(const IndexedDBKey& key) = 0; 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual std::string EncodeKey(const IndexedDBKey& key, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const IndexedDBKey& primary_key) = 0; 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsPastBounds() const; 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool HaveEnteredRange() const; 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IndexedDBBackingStore* backing_store_; 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Transaction* transaction_; 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 database_id_; 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CursorOptions cursor_options_; 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<LevelDBIterator> iterator_; 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<IndexedDBKey> current_key_; 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IndexedDBBackingStore::RecordIdentifier record_identifier_; 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(Cursor); 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url() const { return origin_url_; } 300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBFactory* factory() const { return indexed_db_factory_; } 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner() const { return task_runner_.get(); } 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::OneShotTimer<IndexedDBBackingStore>* close_timer() { 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return &close_timer_; 30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBActiveBlobRegistry* active_blob_registry() { 306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return &active_blob_registry_; 307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<IndexedDBBackingStore> Open( 310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBFactory* indexed_db_factory, 3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& path_base, 3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context, 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDataLoss* data_loss, 3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::string* data_loss_message, 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool* disk_full, 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool clean_journal, 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<IndexedDBBackingStore> Open( 321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBFactory* indexed_db_factory, 3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& path_base, 3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context, 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebIDBDataLoss* data_loss, 3260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) std::string* data_loss_message, 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool* disk_full, 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LevelDBFactory* leveldb_factory, 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool clean_journal, 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<IndexedDBBackingStore> OpenInMemory( 333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& origin_url, 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<IndexedDBBackingStore> OpenInMemory( 3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LevelDBFactory* leveldb_factory, 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void GrantChildProcessPermissions(int child_process_id); 3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 344e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Compact is public for testing. 345e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void Compact(); 3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual std::vector<base::string16> GetDatabaseNames(leveldb::Status*); 347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status GetIDBDatabaseMetaData( 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata* metadata, 350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* success) WARN_UNUSED_RESULT; 351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status CreateIDBDatabaseMetaData( 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& version, 354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 int_version, 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64* row_id); 356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual bool UpdateIDBDatabaseIntVersion( 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 row_id, 359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 int_version); 360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status DeleteDatabase(const base::string16& name); 361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Assumes caller has already closed the backing store. 363e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static leveldb::Status DestroyBackingStore(const base::FilePath& path_base, 364e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& origin_url); 365e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static bool RecordCorruptionInfo(const base::FilePath& path_base, 366e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& origin_url, 367e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string& message); 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status GetObjectStores( 369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBDatabaseMetadata::ObjectStoreMap* map) WARN_UNUSED_RESULT; 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status CreateObjectStore( 372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& name, 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyPath& key_path, 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool auto_increment); 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status DeleteObjectStore( 379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id) WARN_UNUSED_RESULT; 382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status GetRecord( 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKey& key, 38823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) IndexedDBValue* record) WARN_UNUSED_RESULT; 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status PutRecord( 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKey& key, 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IndexedDBValue* value, 39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ScopedVector<storage::BlobDataHandle>* handles, 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RecordIdentifier* record) WARN_UNUSED_RESULT; 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status ClearObjectStore( 398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id) WARN_UNUSED_RESULT; 401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status DeleteRecord( 402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const RecordIdentifier& record) WARN_UNUSED_RESULT; 40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual leveldb::Status DeleteRange( 40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int64 database_id, 40946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int64 object_store_id, 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const IndexedDBKeyRange&) WARN_UNUSED_RESULT; 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status GetKeyGeneratorCurrentNumber( 412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64* current_number) WARN_UNUSED_RESULT; 416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status MaybeUpdateKeyGeneratorCurrentNumber( 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 new_state, 421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool check_current) WARN_UNUSED_RESULT; 422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status KeyExistsInObjectStore( 423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKey& key, 427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RecordIdentifier* found_record_identifier, 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool* found) WARN_UNUSED_RESULT; 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status CreateIndex( 431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 index_id, 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::string16& name, 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKeyPath& key_path, 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_unique, 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_multi_entry) WARN_UNUSED_RESULT; 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status DeleteIndex( 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 index_id) WARN_UNUSED_RESULT; 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status PutIndexDataForRecord( 445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKey& key, 450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const RecordIdentifier& record) WARN_UNUSED_RESULT; 451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status GetPrimaryKeyViaIndex( 452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKey& key, 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<IndexedDBKey>* primary_key) WARN_UNUSED_RESULT; 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual leveldb::Status KeyExistsInIndex( 459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 index_id, 463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKey& key, 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<IndexedDBKey>* found_primary_key, 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* exists) WARN_UNUSED_RESULT; 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Public for IndexedDBActiveBlobRegistry::ReleaseBlobRef. 468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void ReportBlobUnused(int64 database_id, int64 blob_key); 469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::FilePath GetBlobFileName(int64 database_id, int64 key); 4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_ptr<Cursor> OpenObjectStoreKeyCursor( 473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyRange& key_range, 477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBCursorDirection, 4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status*); 479868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_ptr<Cursor> OpenObjectStoreCursor( 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 482868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 483868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyRange& key_range, 484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBCursorDirection, 4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status*); 486868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_ptr<Cursor> OpenIndexKeyCursor( 487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 488868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyRange& key_range, 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBCursorDirection, 4930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status*); 494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_ptr<Cursor> OpenIndexCursor( 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 database_id, 497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 object_store_id, 498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 index_id, 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IndexedDBKeyRange& key_range, 500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebIDBCursorDirection, 5010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch leveldb::Status*); 502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) friend class base::RefCounted<IndexedDBBackingStore>; 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBBackingStore(IndexedDBFactory* indexed_db_factory, 507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const GURL& origin_url, 5080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::FilePath& blob_path, 5095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context, 510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<LevelDBDatabase> db, 511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<LevelDBComparator> comparator, 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner); 513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~IndexedDBBackingStore(); 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_incognito() const { return !indexed_db_factory_; } 516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status SetUpMetadata(); 518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool WriteBlobFile( 5205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int64 database_id, 5215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Transaction::WriteDescriptor& descriptor, 5225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Transaction::ChainedBlobWriter* chained_blob_writer); 5235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual bool RemoveBlobFile(int64 database_id, int64 key); 524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void StartJournalCleaningTimer(); 525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void CleanPrimaryJournalIgnoreReturn(); 5265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 528868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<IndexedDBBackingStore> Create( 529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBFactory* indexed_db_factory, 5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL& origin_url, 5310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::FilePath& blob_path, 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context, 533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<LevelDBDatabase> db, 534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<LevelDBComparator> comparator, 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch leveldb::Status* status); 537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 538e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static bool ReadCorruptionInfo(const base::FilePath& path_base, 539e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& origin_url, 5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string* message); 541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status FindKeyInIndex( 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBBackingStore::Transaction* transaction, 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 database_id, 545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 index_id, 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const IndexedDBKey& key, 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string* found_encoded_primary_key, 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* found); 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status GetIndexes(int64 database_id, 551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 object_store_id, 552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IndexedDBObjectStoreMetadata::IndexMap* map) 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WARN_UNUSED_RESULT; 5545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool RemoveBlobDirectory(int64 database_id); 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) leveldb::Status CleanUpBlobJournal(const std::string& level_db_key); 556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBFactory* indexed_db_factory_; 5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const GURL origin_url_; 5590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::FilePath blob_path_; 5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // The origin identifier is a key prefix unique to the origin used in the 5621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // leveldb backing store to partition data by origin. It is a normalized 5631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // version of the origin URL with a versioning suffix appended, e.g. 5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // "http_localhost_81@1" Since only one origin is stored per backing store 5651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // this is redundant but necessary for backwards compatibility; the suffix 5661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // provides for future flexibility. 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string origin_identifier_; 5685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu net::URLRequestContext* request_context_; 5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner_; 5710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::set<int> child_process_ids_granted_; 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BlobChangeMap incognito_blob_map_; 573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::OneShotTimer<IndexedDBBackingStore> journal_cleaning_timer_; 574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<LevelDBDatabase> db_; 576868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<LevelDBComparator> comparator_; 577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Whenever blobs are registered in active_blob_registry_, indexed_db_factory_ 578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // will hold a reference to this backing store. 579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch IndexedDBActiveBlobRegistry active_blob_registry_; 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::OneShotTimer<IndexedDBBackingStore> close_timer_; 581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IndexedDBBackingStore); 583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 587868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_BACKING_STORE_H_ 588