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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user