uint64_t MemoryObjectStore::countForKeyRange(uint64_t indexIdentifier, const IDBKeyRangeData& inRange) const { LOG(IndexedDB, "MemoryObjectStore::countForKeyRange"); if (indexIdentifier) { auto* index = m_indexesByIdentifier.get(indexIdentifier); ASSERT(index); return index->countForKeyRange(inRange); } if (!m_keyValueStore) return 0; uint64_t count = 0; IDBKeyRangeData range = inRange; while (true) { auto key = lowestKeyWithRecordInRange(range); if (key.isNull()) break; ++count; range.lowerKey = key; range.lowerOpen = true; } return count; }
void MemoryObjectStore::getAllRecords(const IDBKeyRangeData& keyRangeData, std::optional<uint32_t> count, IndexedDB::GetAllType type, IDBGetAllResult& result) const { result = { type }; uint32_t targetCount; if (count && count.value()) targetCount = count.value(); else targetCount = std::numeric_limits<uint32_t>::max(); IDBKeyRangeData range = keyRangeData; uint32_t currentCount = 0; while (currentCount < targetCount) { IDBKeyData key = lowestKeyWithRecordInRange(range); if (key.isNull()) return; range.lowerKey = key; range.lowerOpen = true; if (type == IndexedDB::GetAllType::Keys) result.addKey(WTFMove(key)); else result.addValue(valueForKey(key)); ++currentCount; } }
ThreadSafeDataBuffer MemoryObjectStore::valueForKeyRange(const IDBKeyRangeData& keyRangeData) const { LOG(IndexedDB, "MemoryObjectStore::valueForKey"); IDBKeyData key = lowestKeyWithRecordInRange(keyRangeData); if (key.isNull()) return ThreadSafeDataBuffer(); ASSERT(m_keyValueStore); return m_keyValueStore->get(key); }
void MemoryObjectStore::deleteRange(const IDBKeyRangeData& inputRange) { LOG(IndexedDB, "MemoryObjectStore::deleteRange"); ASSERT(m_writeTransaction); if (inputRange.isExactlyOneKey()) { deleteRecord(inputRange.lowerKey); return; } IDBKeyRangeData range = inputRange; while (true) { auto key = lowestKeyWithRecordInRange(range); if (key.isNull()) break; deleteRecord(key); range.lowerKey = key; range.lowerOpen = true; } }