// limitations under the License.
#include "nvs_storage.hpp"
+#ifndef ESP_PLATFORM
+#include <map>
+#include <sstream>
+#endif
+
namespace nvs
{
mNamespaceUsage.set(0, true);
mNamespaceUsage.set(255, true);
mState = StorageState::ACTIVE;
+#ifndef ESP_PLATFORM
+ debugCheck();
+#endif
return ESP_OK;
}
Page& page = getCurrentPage();
err = page.writeItem(nsIndex, datatype, key, data, dataSize);
if (err == ESP_ERR_NVS_PAGE_FULL) {
- page.markFull();
+ if (page.state() != Page::PageState::FULL) {
+ err = page.markFull();
+ if (err != ESP_OK) {
+ return err;
+ }
+ }
err = mPageManager.requestNewPage();
if (err != ESP_OK) {
return err;
}
err = getCurrentPage().writeItem(nsIndex, datatype, key, data, dataSize);
+ if (err == ESP_ERR_NVS_PAGE_FULL) {
+ return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
+ }
if (err != ESP_OK) {
return err;
}
}
+ else if (err != ESP_OK) {
+ return err;
+ }
if (findPage) {
- if (findPage->state() == Page::PageState::UNINITIALIZED) {
+ if (findPage->state() == Page::PageState::UNINITIALIZED ||
+ findPage->state() == Page::PageState::INVALID) {
auto err = findItem(nsIndex, datatype, key, findPage, item);
assert(err == ESP_OK);
}
err = findPage->eraseItem(nsIndex, datatype, key);
+ if (err == ESP_ERR_FLASH_OP_FAIL) {
+ return ESP_ERR_NVS_REMOVE_FAILED;
+ }
if (err != ESP_OK) {
return err;
}
}
-
+#ifndef ESP_PLATFORM
+ debugCheck();
+#endif
return ESP_OK;
}
return ESP_OK;
}
+void Storage::debugDump()
+{
+ for (auto p = mPageManager.begin(); p != mPageManager.end(); ++p) {
+ p->debugDump();
+ }
+}
+
+#ifndef ESP_PLATFORM
+void Storage::debugCheck()
+{
+ std::map<std::string, Page*> keys;
+
+ for (auto p = mPageManager.begin(); p != mPageManager.end(); ++p) {
+ size_t itemIndex = 0;
+ Item item;
+ while (p->findItem(Page::NS_ANY, ItemType::ANY, nullptr, itemIndex, item) == ESP_OK) {
+ std::stringstream keyrepr;
+ keyrepr << static_cast<unsigned>(item.nsIndex) << "_" << static_cast<unsigned>(item.datatype) << "_" << item.key;
+ std::string keystr = keyrepr.str();
+ if (keys.find(keystr) != std::end(keys)) {
+ printf("Duplicate key: %s\n", keystr.c_str());
+ debugDump();
+ assert(0);
+ }
+ keys.insert(std::make_pair(keystr, static_cast<Page*>(p)));
+ itemIndex += item.span;
+ }
+ }
+}
+#endif //ESP_PLATFORM
+
}
\ No newline at end of file