Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: content/browser/indexed_db/leveldb/leveldb_transaction.h

Issue 15659013: Revert "Migrate the IndexedDB backend from Blink to Chromium" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_BROWSER_INDEXED_DB_LEVELDB_LEVELDB_TRANSACTION_H_
6 #define CONTENT_BROWSER_INDEXED_DB_LEVELDB_LEVELDB_TRANSACTION_H_
7
8 #include <set>
9 #include <vector>
10
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "content/browser/indexed_db/leveldb/avltree.h"
14 #include "content/browser/indexed_db/leveldb/leveldb_comparator.h"
15 #include "content/browser/indexed_db/leveldb/leveldb_database.h"
16 #include "content/browser/indexed_db/leveldb/leveldb_iterator.h"
17 #include "content/browser/indexed_db/leveldb/leveldb_slice.h"
18
19 namespace content {
20
21 class LevelDBWriteBatch;
22
23 class CONTENT_EXPORT LevelDBTransaction
24 : public base::RefCounted<LevelDBTransaction> {
25 public:
26 static scoped_refptr<LevelDBTransaction> Create(LevelDBDatabase* db);
27
28 void Put(const LevelDBSlice& key, const std::vector<char>& value);
29 void Remove(const LevelDBSlice& key);
30 bool Get(const LevelDBSlice& key, std::vector<char>& value, bool& found);
31 bool Commit();
32 void Rollback();
33
34 scoped_ptr<LevelDBIterator> CreateIterator();
35
36 private:
37 LevelDBTransaction(LevelDBDatabase* db);
38 virtual ~LevelDBTransaction();
39 friend class base::RefCounted<LevelDBTransaction>;
40
41 struct AVLTreeNode {
42 AVLTreeNode();
43 ~AVLTreeNode();
44 std::vector<char> key;
45 std::vector<char> value;
46 bool deleted;
47
48 AVLTreeNode* less;
49 AVLTreeNode* greater;
50 int balance_factor;
51 DISALLOW_COPY_AND_ASSIGN(AVLTreeNode);
52 };
53
54 struct AVLTreeAbstractor {
55 typedef AVLTreeNode* handle;
56 typedef size_t size;
57 typedef LevelDBSlice key;
58
59 handle get_less(handle h) { return h->less; }
60 void set_less(handle h, handle less) { h->less = less; }
61 handle get_greater(handle h) { return h->greater; }
62 void set_greater(handle h, handle greater) { h->greater = greater; }
63
64 int get_balance_factor(handle h) { return h->balance_factor; }
65 void set_balance_factor(handle h, int bf) { h->balance_factor = bf; }
66
67 int compare_key_key(const key& ka, const key& kb) {
68 return comparator_->Compare(ka, kb);
69 }
70 int compare_key_node(const key& k, handle h) {
71 return compare_key_key(k, key(h->key));
72 }
73 int compare_node_node(handle ha, handle hb) {
74 return compare_key_key(key(ha->key), key(hb->key));
75 }
76
77 static handle null() { return 0; }
78
79 const LevelDBComparator* comparator_;
80 };
81
82 typedef AVLTree<AVLTreeAbstractor> TreeType;
83
84 class TreeIterator : public LevelDBIterator {
85 public:
86 static scoped_ptr<TreeIterator> Create(LevelDBTransaction* transaction);
87 virtual ~TreeIterator();
88
89 virtual bool IsValid() const OVERRIDE;
90 virtual void SeekToLast() OVERRIDE;
91 virtual void Seek(const LevelDBSlice& slice) OVERRIDE;
92 virtual void Next() OVERRIDE;
93 virtual void Prev() OVERRIDE;
94 virtual LevelDBSlice Key() const OVERRIDE;
95 virtual LevelDBSlice Value() const OVERRIDE;
96 bool IsDeleted() const;
97 void Reset();
98
99 private:
100 TreeIterator(LevelDBTransaction* transaction);
101 mutable TreeType::Iterator iterator_; // Dereferencing this is non-const.
102 TreeType* tree_;
103 LevelDBTransaction* transaction_;
104 std::vector<char> key_;
105 };
106
107 class TransactionIterator : public LevelDBIterator {
108 public:
109 virtual ~TransactionIterator();
110 static scoped_ptr<TransactionIterator> Create(
111 scoped_refptr<LevelDBTransaction> transaction);
112
113 virtual bool IsValid() const OVERRIDE;
114 virtual void SeekToLast() OVERRIDE;
115 virtual void Seek(const LevelDBSlice& target) OVERRIDE;
116 virtual void Next() OVERRIDE;
117 virtual void Prev() OVERRIDE;
118 virtual LevelDBSlice Key() const OVERRIDE;
119 virtual LevelDBSlice Value() const OVERRIDE;
120 void TreeChanged();
121
122 private:
123 TransactionIterator(scoped_refptr<LevelDBTransaction> transaction);
124 void HandleConflictsAndDeletes();
125 void SetCurrentIteratorToSmallestKey();
126 void SetCurrentIteratorToLargestKey();
127 void RefreshTreeIterator() const;
128 bool TreeIteratorIsLower() const;
129 bool TreeIteratorIsHigher() const;
130
131 scoped_refptr<LevelDBTransaction> transaction_;
132 const LevelDBComparator* comparator_;
133 mutable scoped_ptr<TreeIterator> tree_iterator_;
134 scoped_ptr<LevelDBIterator> db_iterator_;
135 LevelDBIterator* current_;
136
137 enum Direction {
138 FORWARD,
139 REVERSE
140 };
141 Direction direction_;
142 mutable bool tree_changed_;
143 };
144
145 void Set(const LevelDBSlice& key,
146 const std::vector<char>& value,
147 bool deleted);
148 void ClearTree();
149 void RegisterIterator(TransactionIterator* iterator);
150 void UnregisterIterator(TransactionIterator* iterator);
151 void NotifyIteratorsOfTreeChange();
152
153 LevelDBDatabase* db_;
154 const LevelDBSnapshot snapshot_;
155 const LevelDBComparator* comparator_;
156 TreeType tree_;
157 bool finished_;
158 std::set<TransactionIterator*> iterators_;
159 };
160
161 class LevelDBWriteOnlyTransaction {
162 public:
163 static scoped_ptr<LevelDBWriteOnlyTransaction> Create(LevelDBDatabase* db);
164
165 ~LevelDBWriteOnlyTransaction();
166 void Remove(const LevelDBSlice& key);
167 bool Commit();
168
169 private:
170 LevelDBWriteOnlyTransaction(LevelDBDatabase* db);
171
172 LevelDBDatabase* db_;
173 scoped_ptr<LevelDBWriteBatch> write_batch_;
174 bool finished_;
175 };
176
177 } // namespace content
178
179 #endif // CONTENT_BROWSER_INDEXED_DB_LEVELDB_LEVELDB_TRANSACTION_H_
OLDNEW
« no previous file with comments | « content/browser/indexed_db/leveldb/leveldb_slice.h ('k') | content/browser/indexed_db/leveldb/leveldb_transaction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698