IndexValueStore::Iterator IndexValueStore::reverseFind(const IDBKeyData& key, CursorDuplicity duplicity, bool open) { IDBKeyRangeData range; if (!key.isNull()) range.upperKey = key; else range.upperKey = IDBKeyData::maximum(); range.upperOpen = open; auto iterator = highestReverseIteratorInRange(range); if (iterator == m_orderedKeys.rend()) return { }; auto record = m_records.get(*iterator); ASSERT(record); auto primaryIterator = record->reverseBegin(duplicity); ASSERT(primaryIterator.isValid()); return { *this, duplicity, iterator, primaryIterator }; }
IndexValueStore::Iterator IndexValueStore::find(const IDBKeyData& key, bool open) { IDBKeyRangeData range; if (!key.isNull()) range.lowerKey = key; else range.lowerKey = IDBKeyData::minimum(); range.lowerOpen = open; auto iterator = lowestIteratorInRange(range); if (iterator == m_orderedKeys.end()) return { }; auto record = m_records.get(*iterator); ASSERT(record); auto primaryIterator = record->begin(); ASSERT(primaryIterator.isValid()); return { *this, iterator, primaryIterator }; }
IDBGetResult MemoryIndex::getResultForKeyRange(IndexedDB::IndexRecordType type, const IDBKeyRangeData& range) const { LOG(IndexedDB, "MemoryIndex::getResultForKeyRange"); if (!m_records) return { }; IDBKeyData keyToLookFor; if (range.isExactlyOneKey()) keyToLookFor = range.lowerKey; else keyToLookFor = m_records->lowestKeyWithRecordInRange(range); if (keyToLookFor.isNull()) return { }; const IDBKeyData* keyValue = m_records->lowestValueForKey(keyToLookFor); if (!keyValue) return { }; return type == IndexedDB::IndexRecordType::Key ? IDBGetResult(*keyValue) : IDBGetResult(m_objectStore.valueForKeyRange(*keyValue)); }
JSValue idbKeyDataToJSValue(JSC::ExecState& exec, const IDBKeyData& keyData) { if (keyData.isNull()) return jsUndefined(); Locker<JSLock> locker(exec.vm().apiLock()); switch (keyData.type()) { case KeyType::Array: { const Vector<IDBKeyData>& inArray = keyData.array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(&exec, 0, exec.lexicalGlobalObject(), size); for (size_t i = 0; i < size; ++i) { auto& arrayKey = inArray.at(i); outArray->putDirectIndex(&exec, i, idbKeyDataToJSValue(exec, arrayKey)); } return JSValue(outArray); } case KeyType::String: return jsStringWithCache(&exec, keyData.string()); case KeyType::Date: return jsDateOrNull(&exec, keyData.date()); case KeyType::Number: return jsNumber(keyData.number()); case KeyType::Min: case KeyType::Max: case KeyType::Invalid: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }