refactor (nvs)!: New interface for iterator functions

Closes https://github.com/espressif/esp-idf/issues/7826

* nvs_entry_find(), nvs_entry_next() and nvs_entry_info()
  return error codes now
* nvs_entry_find() and nvs_entry_next() access/modify iterator via
  parameters, instead of returning an new iterator.

Added appropriate documentation in Chinese and English
This commit is contained in:
Jakob Hasse
2022-05-11 18:49:55 +08:00
parent 769bc9b2d2
commit ad184e979a
9 changed files with 322 additions and 131 deletions
+41 -17
View File
@@ -269,13 +269,13 @@ static esp_err_t nvs_find_ns_handle(nvs_handle_t c_handle, NVSHandleSimple** han
return ESP_OK;
}
extern "C" esp_err_t nvs_open_from_partition(const char *part_name, const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle)
extern "C" esp_err_t nvs_open_from_partition(const char *part_name, const char* namespace_name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle)
{
Lock lock;
ESP_LOGD(TAG, "%s %s %d", __func__, name, open_mode);
ESP_LOGD(TAG, "%s %s %d", __func__, namespace_name, open_mode);
NVSHandleSimple *handle;
esp_err_t result = NVSPartitionManager::get_instance()->open_handle(part_name, name, open_mode, &handle);
esp_err_t result = NVSPartitionManager::get_instance()->open_handle(part_name, namespace_name, open_mode, &handle);
if (result == ESP_OK) {
NVSHandleEntry *entry = new (std::nothrow) NVSHandleEntry(handle, part_name);
if (entry) {
@@ -290,9 +290,9 @@ extern "C" esp_err_t nvs_open_from_partition(const char *part_name, const char*
return result;
}
extern "C" esp_err_t nvs_open(const char* name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle)
extern "C" esp_err_t nvs_open(const char* namespace_name, nvs_open_mode_t open_mode, nvs_handle_t *out_handle)
{
return nvs_open_from_partition(NVS_DEFAULT_PART_NAME, name, open_mode, out_handle);
return nvs_open_from_partition(NVS_DEFAULT_PART_NAME, namespace_name, open_mode, out_handle);
}
extern "C" void nvs_close(nvs_handle_t handle)
@@ -718,47 +718,71 @@ static nvs_iterator_t create_iterator(nvs::Storage *storage, nvs_type_t type)
return it;
}
extern "C" nvs_iterator_t nvs_entry_find(const char *part_name, const char *namespace_name, nvs_type_t type)
// In case of errors except for parameter error, output_iterator is set to nullptr to make releasing iterators easier
extern "C" esp_err_t nvs_entry_find(const char *part_name, const char *namespace_name, nvs_type_t type, nvs_iterator_t *output_iterator)
{
if (part_name == nullptr || output_iterator == nullptr) {
return ESP_ERR_INVALID_ARG;
}
esp_err_t lock_result = Lock::init();
if (lock_result != ESP_OK) {
*output_iterator = nullptr;
return lock_result;
}
Lock lock;
nvs::Storage *pStorage;
pStorage = lookup_storage_from_name(part_name);
if (pStorage == nullptr) {
return nullptr;
*output_iterator = nullptr;
return ESP_ERR_NVS_NOT_FOUND;
}
nvs_iterator_t it = create_iterator(pStorage, type);
if (it == nullptr) {
return nullptr;
*output_iterator = nullptr;
return ESP_ERR_NO_MEM;
}
bool entryFound = pStorage->findEntry(it, namespace_name);
if (!entryFound) {
free(it);
return nullptr;
*output_iterator = nullptr;
return ESP_ERR_NVS_NOT_FOUND;
}
return it;
*output_iterator = it;
return ESP_OK;
}
extern "C" nvs_iterator_t nvs_entry_next(nvs_iterator_t it)
extern "C" esp_err_t nvs_entry_next(nvs_iterator_t *iterator)
{
if (iterator == nullptr) {
return ESP_ERR_INVALID_ARG;
}
Lock lock;
NVS_ASSERT_OR_RETURN(it, nullptr);
bool entryFound = it->storage->nextEntry(it);
bool entryFound = (*iterator)->storage->nextEntry(*iterator);
if (!entryFound) {
free(it);
return nullptr;
free(*iterator);
*iterator = nullptr;
return ESP_ERR_NVS_NOT_FOUND;
}
return it;
return ESP_OK;
}
extern "C" void nvs_entry_info(nvs_iterator_t it, nvs_entry_info_t *out_info)
extern "C" esp_err_t nvs_entry_info(const nvs_iterator_t it, nvs_entry_info_t *out_info)
{
if (it == nullptr || out_info == nullptr) {
return ESP_ERR_INVALID_ARG;
}
*out_info = it->entry_info;
return ESP_OK;
}
extern "C" void nvs_release_iterator(nvs_iterator_t it)