IDBBackingStoreCursorLevelDB.h [plain text]
#ifndef IDBBackingStoreCursorLevelDB_h
#define IDBBackingStoreCursorLevelDB_h
#include "IDBKey.h"
#include "IDBRecordIdentifier.h"
#include "LevelDBIterator.h"
#include <memory>
#if ENABLE(INDEXED_DATABASE)
#if USE(LEVELDB)
namespace WebCore {
class LevelDBTransaction;
class SharedBuffer;
class IDBBackingStoreCursorLevelDB : public RefCounted<IDBBackingStoreCursorLevelDB> {
public:
enum IteratorState {
Ready = 0,
Seek
};
struct CursorOptions {
int64_t databaseId;
int64_t objectStoreId;
int64_t indexId;
Vector<char> lowKey;
bool lowOpen;
Vector<char> highKey;
bool highOpen;
bool forward;
bool unique;
};
virtual PassRefPtr<IDBKey> key() const { return m_currentKey; }
virtual bool continueFunction(const IDBKey* = 0, IteratorState = Seek);
virtual bool advance(unsigned long);
bool firstSeek();
virtual PassRefPtr<IDBBackingStoreCursorLevelDB> clone() = 0;
virtual PassRefPtr<IDBKey> primaryKey() const { return m_currentKey; }
virtual PassRefPtr<SharedBuffer> value() const = 0;
virtual const IDBRecordIdentifier& recordIdentifier() const { return *m_recordIdentifier; }
virtual ~IDBBackingStoreCursorLevelDB() { }
virtual bool loadCurrentRow() = 0;
protected:
IDBBackingStoreCursorLevelDB(int64_t cursorID, LevelDBTransaction* transaction, const CursorOptions& cursorOptions)
: m_cursorID(cursorID)
, m_transaction(transaction)
, m_cursorOptions(cursorOptions)
, m_recordIdentifier(IDBRecordIdentifier::create())
{
}
explicit IDBBackingStoreCursorLevelDB(const IDBBackingStoreCursorLevelDB* other);
virtual Vector<char> encodeKey(const IDBKey&) = 0;
bool isPastBounds() const;
bool haveEnteredRange() const;
int64_t m_cursorID;
LevelDBTransaction* m_transaction;
const CursorOptions m_cursorOptions;
std::unique_ptr<LevelDBIterator> m_iterator;
RefPtr<IDBKey> m_currentKey;
RefPtr<IDBRecordIdentifier> m_recordIdentifier;
};
}
#endif // USE(LEVELDB)
#endif // ENABLE(INDEXED_DATABASE)
#endif // IDBBackingStoreCursorLevelDB_h