libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
esp32_nvs_flash_database.hpp
1#pragma once
2
3#include <cstring>
4
5#include "esp_def.hpp"
6#include "libxr.hpp"
7#include "libxr_def.hpp"
8#include "libxr_type.hpp"
9#include "nvs.h"
10#include "nvs_flash.h"
11
12namespace LibXR
13{
14
19{
20 public:
25 explicit ESP32NvsFlashDatabase(const char* namespace_name = "storage")
26 : namespace_(namespace_name)
27 {
28 esp_err_t err = nvs_flash_init();
29 if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
30 {
31 nvs_flash_erase();
32 err = nvs_flash_init();
33 }
34 valid_ = (err == ESP_OK);
35 }
36
40 bool IsValid() const { return valid_; }
41
42 private:
43 const char* namespace_;
44 bool valid_{false};
45
46 ErrorCode Add(KeyBase& key) override { return Set(key, key.raw_data_); }
47
48 ErrorCode Get(KeyBase& key) override
49 {
50 if (!valid_) return ErrorCode::FAILED;
51
52 nvs_handle_t handle;
53 esp_err_t err = nvs_open(namespace_, NVS_READONLY, &handle);
54 if (err != ESP_OK) return ErrorCode::FAILED;
55
56 size_t required_size = 0;
57 err = nvs_get_blob(handle, key.name_, nullptr, &required_size);
58 if (err == ESP_ERR_NVS_NOT_FOUND)
59 {
60 nvs_close(handle);
62 }
63
64 if (required_size != key.raw_data_.size_)
65 {
66 nvs_close(handle);
67 return ErrorCode::FAILED;
68 }
69
70 err = nvs_get_blob(handle, key.name_, key.raw_data_.addr_, &required_size);
71 nvs_close(handle);
72 return (err == ESP_OK) ? ErrorCode::OK : ErrorCode::FAILED;
73 }
74
75 ErrorCode Set(KeyBase& key, RawData data) override
76 {
77 if (!valid_) return ErrorCode::FAILED;
78
79 nvs_handle_t handle;
80 esp_err_t err = nvs_open(namespace_, NVS_READWRITE, &handle);
81 if (err != ESP_OK) return ErrorCode::FAILED;
82
83 err = nvs_set_blob(handle, key.name_, data.addr_, data.size_);
84 if (err != ESP_OK)
85 {
86 nvs_close(handle);
87 return ErrorCode::FAILED;
88 }
89
90 err = nvs_commit(handle);
91 nvs_close(handle);
92 return (err == ESP_OK) ? ErrorCode::OK : ErrorCode::FAILED;
93 }
94};
95
96} // namespace LibXR
数据库接口,提供键值存储和管理功能 Database interface providing key-value storage and management.
Definition interface.hpp:24
ESP32 NVS 数据库存储实现 / ESP32 NVS-backed database implementation.
ESP32NvsFlashDatabase(const char *namespace_name="storage")
构造并初始化 NVS / Construct and initialize NVS storage
bool IsValid() const
查询初始化状态 / Check initialization state
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ NOT_FOUND
未找到 / Not found
@ FAILED
操作失败 / Operation failed
@ OK
操作成功 / Operation successful