OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" | 5 #include "content/browser/indexed_db/leveldb/leveldb_transaction.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "content/browser/indexed_db/leveldb/leveldb_database.h" | 8 #include "content/browser/indexed_db/leveldb/leveldb_database.h" |
9 #include "content/browser/indexed_db/leveldb/leveldb_write_batch.h" | 9 #include "content/browser/indexed_db/leveldb/leveldb_write_batch.h" |
10 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 10 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
11 | 11 |
12 using base::StringPiece; | 12 using base::StringPiece; |
13 | 13 |
14 namespace content { | 14 namespace content { |
15 | 15 |
16 scoped_refptr<LevelDBTransaction> LevelDBTransaction::Create( | |
17 LevelDBDatabase* db) { | |
18 return make_scoped_refptr(new LevelDBTransaction(db)); | |
19 } | |
20 | |
21 LevelDBTransaction::LevelDBTransaction(LevelDBDatabase* db) | 16 LevelDBTransaction::LevelDBTransaction(LevelDBDatabase* db) |
22 : db_(db), snapshot_(db), comparator_(db->Comparator()), finished_(false) { | 17 : db_(db), snapshot_(db), comparator_(db->Comparator()), finished_(false) { |
23 tree_.abstractor().comparator_ = comparator_; | 18 tree_.abstractor().comparator_ = comparator_; |
24 } | 19 } |
25 | 20 |
26 LevelDBTransaction::AVLTreeNode::AVLTreeNode() {} | 21 LevelDBTransaction::AVLTreeNode::AVLTreeNode() {} |
27 LevelDBTransaction::AVLTreeNode::~AVLTreeNode() {} | 22 LevelDBTransaction::AVLTreeNode::~AVLTreeNode() {} |
28 | 23 |
29 void LevelDBTransaction::ClearTree() { | 24 void LevelDBTransaction::ClearTree() { |
30 TreeType::Iterator iterator; | 25 TreeType::Iterator iterator; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 } | 245 } |
251 | 246 |
252 void LevelDBTransaction::TransactionIterator::Next() { | 247 void LevelDBTransaction::TransactionIterator::Next() { |
253 DCHECK(IsValid()); | 248 DCHECK(IsValid()); |
254 if (tree_changed_) | 249 if (tree_changed_) |
255 RefreshTreeIterator(); | 250 RefreshTreeIterator(); |
256 | 251 |
257 if (direction_ != FORWARD) { | 252 if (direction_ != FORWARD) { |
258 // Ensure the non-current iterator is positioned after Key(). | 253 // Ensure the non-current iterator is positioned after Key(). |
259 | 254 |
260 LevelDBIterator* non_current = | 255 LevelDBIterator* non_current = (current_ == db_iterator_.get()) |
261 (current_ == db_iterator_.get()) ? tree_iterator_.get() | 256 ? tree_iterator_.get() |
262 : db_iterator_.get(); | 257 : db_iterator_.get(); |
263 | 258 |
264 non_current->Seek(Key()); | 259 non_current->Seek(Key()); |
265 if (non_current->IsValid() && | 260 if (non_current->IsValid() && |
266 !comparator_->Compare(non_current->Key(), Key())) | 261 !comparator_->Compare(non_current->Key(), Key())) |
267 non_current->Next(); // Take an extra step so the non-current key is | 262 non_current->Next(); // Take an extra step so the non-current key is |
268 // strictly greater than Key(). | 263 // strictly greater than Key(). |
269 | 264 |
270 DCHECK(!non_current->IsValid() || | 265 DCHECK(!non_current->IsValid() || |
271 comparator_->Compare(non_current->Key(), Key()) > 0); | 266 comparator_->Compare(non_current->Key(), Key()) > 0); |
272 | 267 |
273 direction_ = FORWARD; | 268 direction_ = FORWARD; |
274 } | 269 } |
275 | 270 |
276 current_->Next(); | 271 current_->Next(); |
277 HandleConflictsAndDeletes(); | 272 HandleConflictsAndDeletes(); |
278 SetCurrentIteratorToSmallestKey(); | 273 SetCurrentIteratorToSmallestKey(); |
279 } | 274 } |
280 | 275 |
281 void LevelDBTransaction::TransactionIterator::Prev() { | 276 void LevelDBTransaction::TransactionIterator::Prev() { |
282 DCHECK(IsValid()); | 277 DCHECK(IsValid()); |
283 if (tree_changed_) | 278 if (tree_changed_) |
284 RefreshTreeIterator(); | 279 RefreshTreeIterator(); |
285 | 280 |
286 if (direction_ != REVERSE) { | 281 if (direction_ != REVERSE) { |
287 // Ensure the non-current iterator is positioned before Key(). | 282 // Ensure the non-current iterator is positioned before Key(). |
288 | 283 |
289 LevelDBIterator* non_current = | 284 LevelDBIterator* non_current = (current_ == db_iterator_.get()) |
290 (current_ == db_iterator_.get()) ? tree_iterator_.get() | 285 ? tree_iterator_.get() |
291 : db_iterator_.get(); | 286 : db_iterator_.get(); |
292 | 287 |
293 non_current->Seek(Key()); | 288 non_current->Seek(Key()); |
294 if (non_current->IsValid()) { | 289 if (non_current->IsValid()) { |
295 // Iterator is at first entry >= Key(). | 290 // Iterator is at first entry >= Key(). |
296 // Step back once to entry < key. | 291 // Step back once to entry < key. |
297 // This is why we don't check for the keys being the same before | 292 // This is why we don't check for the keys being the same before |
298 // stepping, like we do in Next() above. | 293 // stepping, like we do in Next() above. |
299 non_current->Prev(); | 294 non_current->Prev(); |
300 } else { | 295 } else { |
301 non_current->SeekToLast(); // Iterator has no entries >= Key(). Position | 296 non_current->SeekToLast(); // Iterator has no entries >= Key(). Position |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 | 467 |
473 if (!db_->Write(*write_batch_)) | 468 if (!db_->Write(*write_batch_)) |
474 return false; | 469 return false; |
475 | 470 |
476 finished_ = true; | 471 finished_ = true; |
477 write_batch_->Clear(); | 472 write_batch_->Clear(); |
478 return true; | 473 return true; |
479 } | 474 } |
480 | 475 |
481 } // namespace content | 476 } // namespace content |
OLD | NEW |