if (rc != ESP_OK) {
return rc;
}
- if (CachedFindInfo(nsIndex, datatype, key) == mFindInfo) {
- invalidateCache();
- }
return eraseEntryAndSpan(index);
}
return ESP_ERR_NVS_NOT_FOUND;
}
- if (mFindInfo.itemIndex() == mFirstUsedEntry) {
- invalidateCache();
- }
-
if (other.mState == PageState::UNINITIALIZED) {
auto err = other.initialize();
if (err != ESP_OK) {
mNextFreeEntry = 0;
std::fill_n(mEntryTable.data(), mEntryTable.byteSize() / sizeof(uint32_t), 0xffffffff);
- invalidateCache();
return ESP_OK;
}
return ESP_ERR_NVS_NOT_FOUND;
}
- CachedFindInfo findInfo(nsIndex, datatype, key);
- if (mFindInfo == findInfo) {
- findBeginIndex = mFindInfo.itemIndex();
- }
-
size_t start = mFirstUsedEntry;
if (findBeginIndex > mFirstUsedEntry && findBeginIndex < ENTRY_COUNT) {
start = findBeginIndex;
}
itemIndex = i;
- findInfo.setItemIndex(static_cast<uint32_t>(itemIndex));
- mFindInfo = findInfo;
return ESP_OK;
}
}
return alterPageState(PageState::FULL);
}
-
-
-void Page::invalidateCache()
-{
- mFindInfo = CachedFindInfo();
-}
const char* Page::pageStateToName(PageState ps)
{
namespace nvs
{
-class CachedFindInfo
-{
-public:
- CachedFindInfo() { }
- CachedFindInfo(uint8_t nsIndex, ItemType type, const char* key) :
- mKeyPtr(key),
- mNsIndex(nsIndex),
- mType(type)
- {
- }
-
- bool operator==(const CachedFindInfo& other) const
- {
- return mKeyPtr != nullptr && mKeyPtr == other.mKeyPtr && mType == other.mType && mNsIndex == other.mNsIndex;
- }
-
- void setItemIndex(uint32_t index)
- {
- mItemIndex = index;
- }
- uint32_t itemIndex() const
- {
- return mItemIndex;
- }
-
-protected:
- uint32_t mItemIndex = 0;
- const char* mKeyPtr = nullptr;
- uint8_t mNsIndex = 0;
- ItemType mType;
-
-};
class Page : public intrusive_list_node<Page>
{
esp_err_t erase();
- void invalidateCache();
-
void debugDump() const;
protected:
uint16_t mUsedEntryCount = 0;
uint16_t mErasedEntryCount = 0;
- CachedFindInfo mFindInfo;
HashList mHashList;
static const uint32_t HEADER_OFFSET = 0;
#include <sstream>
#include <iostream>
+#define TEST_ESP_ERR(rc, res) CHECK((rc) == (res))
+#define TEST_ESP_OK(rc) CHECK((rc) == ESP_OK)
+
using namespace std;
using namespace nvs;
CHECK(memcmp(buf, str, strlen(str)) == 0);
}
+TEST_CASE("different key names are distinguished even if the pointer is the same", "[nvs]")
+{
+ SpiFlashEmulator emu(1);
+ Page page;
+ TEST_ESP_OK(page.load(0));
+ TEST_ESP_OK(page.writeItem(1, "i1", 1));
+ TEST_ESP_OK(page.writeItem(1, "i2", 2));
+ int32_t value;
+ char keyname[10] = {0};
+ for (int i = 0; i < 2; ++i) {
+ strncpy(keyname, "i1", sizeof(keyname) - 1);
+ TEST_ESP_OK(page.readItem(1, keyname, value));
+ CHECK(value == 1);
+ strncpy(keyname, "i2", sizeof(keyname) - 1);
+ TEST_ESP_OK(page.readItem(1, keyname, value));
+ CHECK(value == 2);
+ }
+}
TEST_CASE("can init PageManager in empty flash", "[nvs]")
{
CHECK(storage.readItem(3, "key00222", val) == ESP_ERR_NVS_NOT_FOUND);
}
-#define TEST_ESP_ERR(rc, res) CHECK((rc) == (res))
-#define TEST_ESP_OK(rc) CHECK((rc) == ESP_OK)
-
TEST_CASE("nvs api tests", "[nvs]")
{
SpiFlashEmulator emu(10);