read from last m_position
| 155 | |
| 156 | // read from last m_position |
| 157 | void MMKV::partialLoadFromFile() { |
| 158 | if (!m_file->isFileValid()) { |
| 159 | return; |
| 160 | } |
| 161 | m_metaInfo->read(m_metaFile->getMemory()); |
| 162 | |
| 163 | size_t oldActualSize = m_actualSize; |
| 164 | m_actualSize = readActualSize(); |
| 165 | auto fileSize = m_file->getFileSize(); |
| 166 | MMKVDebug("loading [%s] with file size %zu, oldActualSize %zu, newActualSize %zu", m_mmapID.c_str(), fileSize, |
| 167 | oldActualSize, m_actualSize); |
| 168 | |
| 169 | if (m_actualSize > 0) { |
| 170 | if (m_actualSize < fileSize && m_actualSize + Fixed32Size <= fileSize) { |
| 171 | if (m_actualSize > oldActualSize) { |
| 172 | auto position = oldActualSize; |
| 173 | size_t addedSize = m_actualSize - position; |
| 174 | auto basePtr = (uint8_t *) m_file->getMemory() + Fixed32Size; |
| 175 | // incremental update crc digest |
| 176 | m_crcDigest = (uint32_t) CRC32(m_crcDigest, basePtr + position, (z_size_t) addedSize); |
| 177 | if (m_crcDigest == m_metaInfo->m_crcDigest) { |
| 178 | MMBuffer inputBuffer(basePtr, m_actualSize, MMBufferNoCopy); |
| 179 | #ifndef MMKV_DISABLE_CRYPT |
| 180 | if (m_crypter) { |
| 181 | MiniPBCoder::greedyDecodeMap(*m_dicCrypt, inputBuffer, m_crypter, position); |
| 182 | } else |
| 183 | #endif |
| 184 | { |
| 185 | MiniPBCoder::greedyDecodeMap(*m_dic, inputBuffer, position); |
| 186 | } |
| 187 | m_output->seek(addedSize); |
| 188 | m_hasFullWriteback = false; |
| 189 | |
| 190 | [[maybe_unused]] auto count = m_crypter ? m_dicCrypt->size() : m_dic->size(); |
| 191 | MMKVDebug("partial loaded [%s] with %zu values", m_mmapID.c_str(), count); |
| 192 | return; |
| 193 | } else { |
| 194 | MMKVError("m_crcDigest[%u] != m_metaInfo->m_crcDigest[%u]", m_crcDigest, m_metaInfo->m_crcDigest); |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | // something is wrong, do a full load |
| 200 | clearMemoryCache(); |
| 201 | loadFromFile(); |
| 202 | } |
| 203 | |
| 204 | static bool deleteOrRenameFile(const MMKVPath_t &src) { |
| 205 | if (!deleteFile(src)) { |
nothing calls this directly
no test coverage detected