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_INDEXED_DB_CURSOR_H_
6#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_CURSOR_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "content/browser/indexed_db/indexed_db_backing_store.h"
14#include "content/browser/indexed_db/indexed_db_database.h"
15#include "content/common/indexed_db/indexed_db_key_range.h"
16#include "third_party/WebKit/public/platform/WebIDBTypes.h"
17
18namespace content {
19
20class IndexedDBTransaction;
21
22class CONTENT_EXPORT IndexedDBCursor
23    : NON_EXPORTED_BASE(public base::RefCounted<IndexedDBCursor>) {
24 public:
25  IndexedDBCursor(scoped_ptr<IndexedDBBackingStore::Cursor> cursor,
26                  indexed_db::CursorType cursor_type,
27                  blink::WebIDBTaskType task_type,
28                  IndexedDBTransaction* transaction);
29
30  void Advance(uint32 count, scoped_refptr<IndexedDBCallbacks> callbacks);
31  void Continue(scoped_ptr<IndexedDBKey> key,
32                scoped_ptr<IndexedDBKey> primary_key,
33                scoped_refptr<IndexedDBCallbacks> callbacks);
34  void PrefetchContinue(int number_to_fetch,
35                        scoped_refptr<IndexedDBCallbacks> callbacks);
36  leveldb::Status PrefetchReset(int used_prefetches, int unused_prefetches);
37
38  const IndexedDBKey& key() const { return cursor_->key(); }
39  const IndexedDBKey& primary_key() const { return cursor_->primary_key(); }
40  IndexedDBValue* Value() const {
41    return (cursor_type_ == indexed_db::CURSOR_KEY_ONLY) ? NULL
42                                                         : cursor_->value();
43  }
44  void Close();
45
46  void CursorIterationOperation(scoped_ptr<IndexedDBKey> key,
47                                scoped_ptr<IndexedDBKey> primary_key,
48                                scoped_refptr<IndexedDBCallbacks> callbacks,
49                                IndexedDBTransaction* transaction);
50  void CursorAdvanceOperation(uint32 count,
51                              scoped_refptr<IndexedDBCallbacks> callbacks,
52                              IndexedDBTransaction* transaction);
53  void CursorPrefetchIterationOperation(
54      int number_to_fetch,
55      scoped_refptr<IndexedDBCallbacks> callbacks,
56      IndexedDBTransaction* transaction);
57
58 private:
59  friend class base::RefCounted<IndexedDBCursor>;
60
61  ~IndexedDBCursor();
62
63  blink::WebIDBTaskType task_type_;
64  indexed_db::CursorType cursor_type_;
65  const scoped_refptr<IndexedDBTransaction> transaction_;
66
67  // Must be destroyed before transaction_.
68  scoped_ptr<IndexedDBBackingStore::Cursor> cursor_;
69  // Must be destroyed before transaction_.
70  scoped_ptr<IndexedDBBackingStore::Cursor> saved_cursor_;
71
72  bool closed_;
73
74  DISALLOW_COPY_AND_ASSIGN(IndexedDBCursor);
75};
76
77}  // namespace content
78
79#endif  // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_CURSOR_H_
80