static void encodeKey(Vector<char>& data, const IDBKeyData& key) { SIDBKeyType type = serializedTypeForKeyType(key.type()); data.append(static_cast<char>(type)); switch (type) { case SIDBKeyType::Number: writeDouble(data, key.number()); break; case SIDBKeyType::Date: writeDouble(data, key.date()); break; case SIDBKeyType::String: { auto string = key.string(); uint32_t length = string.length(); writeLittleEndian(data, length); for (size_t i = 0; i < length; ++i) writeLittleEndian(data, string[i]); break; } case SIDBKeyType::Binary: { auto& buffer = key.binary(); uint64_t size = buffer.size(); writeLittleEndian(data, size); auto* bufferData = buffer.data(); ASSERT(bufferData || !size); if (bufferData) data.append(bufferData->data(), bufferData->size()); break; } case SIDBKeyType::Array: { auto& array = key.array(); uint64_t size = array.size(); writeLittleEndian(data, size); for (auto& key : array) encodeKey(data, key); break; } case SIDBKeyType::Min: case SIDBKeyType::Max: break; } }
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(); }