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