MCPcopy Create free account
hub / github.com/Tencent/MMKV / setDataForKey

Method setDataForKey

Core/MMKV_IO.cpp:662–820  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

660#endif // MMKV_DISABLE_CRYPT
661
662bool MMKV::setDataForKey(MMBuffer &&data, MMKVKey_t key, bool isDataHolder) {
663 if ((!isDataHolder && data.length() == 0) || isKeyEmpty(key)) {
664 return false;
665 }
666 SCOPED_LOCK(m_lock);
667 SCOPED_LOCK(m_exclusiveProcessLock);
668 checkLoadData();
669
670#ifndef MMKV_DISABLE_CRYPT
671 if (m_crypter) {
672 if (isDataHolder) {
673 auto sizeNeededForData = pbRawVarint32Size((uint32_t) data.length()) + data.length();
674 if (!KeyValueHolderCrypt::isValueStoredAsOffset(sizeNeededForData)) {
675 data = MiniPBCoder::encodeDataWithObject(data);
676 isDataHolder = false;
677 }
678 }
679 auto itr = m_dicCrypt->find(key);
680 if (itr != m_dicCrypt->end()) {
681 bool onlyOneKey = !isMultiProcess() && m_dicCrypt->size() == 1;
682# ifdef MMKV_APPLE
683 KVHolderRet_t ret;
684 if (onlyOneKey) {
685 ret = overrideDataWithKey(data, key, itr->second, isDataHolder);
686 } else {
687 ret = appendDataWithKey(data, key, itr->second, isDataHolder);
688 }
689# else
690 KVHolderRet_t ret;
691 if (onlyOneKey) {
692 ret = overrideDataWithKey(data, key, isDataHolder);
693 } else {
694 ret = appendDataWithKey(data, key, isDataHolder);
695 }
696# endif
697 if (!ret.first) {
698 return false;
699 }
700 KeyValueHolderCrypt kvHolder;
701 if (KeyValueHolderCrypt::isValueStoredAsOffset(ret.second.valueSize)) {
702 kvHolder = KeyValueHolderCrypt(ret.second.keySize, ret.second.valueSize, ret.second.offset);
703 memcpy(&kvHolder.cryptStatus, &t_status, sizeof(t_status));
704 } else {
705 kvHolder = KeyValueHolderCrypt(std::move(data));
706 }
707 if (mmkv_likely(!m_enableKeyExpire)) {
708 itr->second = std::move(kvHolder);
709 } else {
710 itr = m_dicCrypt->find(key);
711 if (itr != m_dicCrypt->end()) {
712 itr->second = std::move(kvHolder);
713 } else {
714 // in case filterExpiredKeys() is triggered
715 m_dicCrypt->emplace(key, std::move(kvHolder));
716 mmkv_retain_key(key);
717 }
718 }
719 } else {

Callers

nothing calls this directly

Calls 8

isKeyEmptyFunction · 0.85
encodeDataWithObjectFunction · 0.85
getMemoryMethod · 0.80
toMMBufferMethod · 0.80
pbRawVarint32SizeFunction · 0.70
isMultiProcessFunction · 0.70
KeyValueHolderCryptClass · 0.70

Tested by

no test coverage detected