void MemoryObjectStoreCursor::incrementReverseIterator(std::set<IDBKeyData>& set, const IDBKeyData& key, uint32_t count) { // We might need to re-grab the current iterator. // e.g. If the record it was pointed to had been deleted. bool didResetIterator = false; if (!m_iterator) { if (!m_currentPositionKey.isValid()) return; m_remainingRange.upperKey = m_currentPositionKey; m_remainingRange.upperOpen = false; setFirstInRemainingRange(set); didResetIterator = true; } if (*m_iterator == set.end()) return; if (key.isValid()) { // If iterating to a key, the count passed in must be zero, as there is no way to iterate by both a count and to a key. ASSERT(!count); if (!m_info.range().containsKey(key)) return; if ((*m_iterator)->compare(key) > 0) { m_remainingRange.upperKey = key; m_remainingRange.upperOpen = false; setFirstInRemainingRange(set); } return; } if (!count) count = 1; // If the reverseIterator was reset because it's previous record had been deleted, // we might have already advanced past the current position, eating one one of the iteration counts. if (didResetIterator && (*m_iterator)->compare(m_currentPositionKey) < 0) --count; while (count) { if (*m_iterator == set.begin()) { m_iterator = Nullopt; return; } --count; --*m_iterator; if (!m_info.range().containsKey(**m_iterator)) { m_iterator = Nullopt; return; } } }
MemoryObjectStoreCursor::MemoryObjectStoreCursor(MemoryObjectStore& objectStore, const IDBCursorInfo& info) : MemoryCursor(info) , m_objectStore(objectStore) { m_remainingRange = m_info.range(); auto* orderedKeys = objectStore.orderedKeys(); if (!orderedKeys) return; setFirstInRemainingRange(*orderedKeys); }
MemoryObjectStoreCursor::MemoryObjectStoreCursor(MemoryObjectStore& objectStore, const IDBCursorInfo& info) : MemoryCursor(info) , m_objectStore(objectStore) , m_remainingRange(info.range()) { LOG(IndexedDB, "MemoryObjectStoreCursor::MemoryObjectStoreCursor %s", info.range().loggingString().utf8().data()); auto* orderedKeys = objectStore.orderedKeys(); if (!orderedKeys) return; setFirstInRemainingRange(*orderedKeys); }