1// Copyright 2014 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#include "base/logging.h"
6#include "base/memory/scoped_ptr.h"
7#include "content/browser/indexed_db/leveldb/leveldb_iterator_impl.h"
8
9static leveldb::Slice MakeSlice(const base::StringPiece& s) {
10  return leveldb::Slice(s.begin(), s.size());
11}
12
13static base::StringPiece MakeStringPiece(const leveldb::Slice& s) {
14  return base::StringPiece(s.data(), s.size());
15}
16
17namespace content {
18
19LevelDBIteratorImpl::~LevelDBIteratorImpl() {
20}
21
22LevelDBIteratorImpl::LevelDBIteratorImpl(scoped_ptr<leveldb::Iterator> it)
23    : iterator_(it.Pass()) {
24}
25
26void LevelDBIteratorImpl::CheckStatus() {
27  const leveldb::Status& s = iterator_->status();
28  if (!s.ok())
29    LOG(ERROR) << "LevelDB iterator error: " << s.ToString();
30}
31
32bool LevelDBIteratorImpl::IsValid() const {
33  return iterator_->Valid();
34}
35
36leveldb::Status LevelDBIteratorImpl::SeekToLast() {
37  iterator_->SeekToLast();
38  CheckStatus();
39  return iterator_->status();
40}
41
42leveldb::Status LevelDBIteratorImpl::Seek(const base::StringPiece& target) {
43  iterator_->Seek(MakeSlice(target));
44  CheckStatus();
45  return iterator_->status();
46}
47
48leveldb::Status LevelDBIteratorImpl::Next() {
49  DCHECK(IsValid());
50  iterator_->Next();
51  CheckStatus();
52  return iterator_->status();
53}
54
55leveldb::Status LevelDBIteratorImpl::Prev() {
56  DCHECK(IsValid());
57  iterator_->Prev();
58  CheckStatus();
59  return iterator_->status();
60}
61
62base::StringPiece LevelDBIteratorImpl::Key() const {
63  DCHECK(IsValid());
64  return MakeStringPiece(iterator_->key());
65}
66
67base::StringPiece LevelDBIteratorImpl::Value() const {
68  DCHECK(IsValid());
69  return MakeStringPiece(iterator_->value());
70}
71
72}  // namespace content
73