libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
database.cpp
1#include "database.hpp"
2
3#include <cstddef>
4#include <cstdint>
5
6#include "libxr_def.hpp"
7
8using namespace LibXR;
9
17 : flash_(flash), max_buffer_size_(max_buffer_size)
18{
19 ASSERT(flash.min_erase_size_ * 2 <= flash.flash_area_.size_);
20 if (max_buffer_size * 2 > flash.flash_area_.size_)
21 {
22 max_buffer_size = flash.flash_area_.size_ / 2;
23 }
24 auto block_num = static_cast<size_t>(flash.flash_area_.size_ / flash.min_erase_size_);
25 block_size_ = block_num / 2 * flash.min_erase_size_;
27 flash_data_ = reinterpret_cast<FlashInfo*>(data_buffer_);
28 info_main_ = reinterpret_cast<FlashInfo*>(flash.flash_area_.addr_);
29 info_backup_ = reinterpret_cast<FlashInfo*>(
30 reinterpret_cast<uint8_t*>(flash.flash_area_.addr_) + block_size_);
31 Init();
32}
33
65
77
82
91
97{
98 flash_.Erase(reinterpret_cast<size_t>(block) -
99 reinterpret_cast<size_t>(flash_.flash_area_.addr_),
101 flash_.Write(reinterpret_cast<size_t>(block) -
102 reinterpret_cast<size_t>(flash_.flash_area_.addr_),
103 {data_buffer_, block_size_});
104}
105
116
123{
124 return block->key.nameLength == 0;
125}
126
133{
134 return reinterpret_cast<uint8_t*>(
136}
137
144{
145 return sizeof(KeyInfo) + key->nameLength + key->dataSize;
146}
147
153DatabaseRawSequential::KeyInfo* DatabaseRawSequential::GetNextKey(KeyInfo* key)
154{
155 return reinterpret_cast<KeyInfo*>(reinterpret_cast<uint8_t*>(key) + GetKeySize(key));
156}
157
164DatabaseRawSequential::KeyInfo* DatabaseRawSequential::GetLastKey(FlashInfo* block)
165{
166 if (IsBlockEmpty(block))
167 {
168 return nullptr;
169 }
170
171 KeyInfo* key = &block->key;
172 while (key->nextKey)
173 {
174 key = GetNextKey(key);
175 }
176 return key;
177}
178
186ErrorCode DatabaseRawSequential::AddKey(const char* name, const void* data, size_t size)
187{
188 if (auto ans = SearchKey(name))
189 {
190 return SetKey(ans, data, size);
191 }
192
193 const uint32_t NAME_LEN = strlen(name) + 1;
194 KeyInfo* last_key = GetLastKey(flash_data_);
196
197 const uint8_t* end_pos =
198 reinterpret_cast<uint8_t*>(key_buf) + sizeof(KeyInfo) + NAME_LEN + size;
200 {
201 return ErrorCode::FULL;
202 }
203
204 uint8_t* data_ptr = reinterpret_cast<uint8_t*>(key_buf) + sizeof(KeyInfo);
205 memcpy(data_ptr, name, NAME_LEN);
206 memcpy(data_ptr + NAME_LEN, data, size);
207
208 *key_buf = KeyInfo{0, NAME_LEN, size};
209 if (last_key)
210 {
211 last_key->nextKey = 1;
212 }
213
214 Save();
215 return ErrorCode::OK;
216}
217
225ErrorCode DatabaseRawSequential::SetKey(const char* name, const void* data, size_t size)
226{
227 if (KeyInfo* key = SearchKey(name))
228 {
229 return SetKey(key, data, size);
230 }
231 return ErrorCode::FAILED;
232}
233
248ErrorCode DatabaseRawSequential::SetKey(KeyInfo* key, const void* data, size_t size)
249{
250 ASSERT(key != nullptr);
251
252 if (key->dataSize == size)
253 {
254 if (memcmp(GetKeyData(key), data, size) != 0)
255 {
256 memcpy(GetKeyData(key), data, size);
257 Save();
258 }
259 return ErrorCode::OK;
260 }
261
262 return ErrorCode::FAILED;
263}
264
275{
276 return reinterpret_cast<uint8_t*>(key) + sizeof(KeyInfo) + key->nameLength;
277}
278
288const char* DatabaseRawSequential::GetKeyName(KeyInfo* key)
289{
290 return reinterpret_cast<const char*>(key) + sizeof(KeyInfo);
291}
292
299DatabaseRawSequential::KeyInfo* DatabaseRawSequential::SearchKey(const char* name)
300{
302 {
303 return nullptr;
304 }
305
306 KeyInfo* key = &flash_data_->key;
307 while (true)
308 {
309 if (strcmp(name, GetKeyName(key)) == 0)
310 {
311 return key;
312 }
313 if (!key->nextKey)
314 {
315 break;
316 }
317 key = GetNextKey(key);
318 }
319 return nullptr;
320}
void Save()
保存当前缓冲区内容到 Flash (Save the current buffer content to Flash).
Definition database.cpp:69
bool IsBlockInited(FlashInfo *block)
判断块是否已初始化 (Check if block is initialized).
Definition database.cpp:112
static constexpr uint8_t CHECKSUM_BYTE
校验字节 (Checksum byte).
Definition database.hpp:239
FlashInfo * info_backup_
备份存储区信息 (Backup storage block information).
Definition database.hpp:245
uint32_t max_buffer_size_
最大缓冲区大小 (Maximum buffer size).
Definition database.hpp:247
bool IsBlockError(FlashInfo *block)
判断块是否损坏 (Check if block has an error).
Definition database.cpp:132
void Init()
初始化数据库存储区,确保主备块正确 (Initialize database storage, ensuring main and backup blocks are valid).
Definition database.cpp:38
KeyInfo * SearchKey(const char *name)
查找键 (Search for key).
Definition database.cpp:299
size_t GetKeySize(KeyInfo *key)
计算键的总大小 (Calculate total size of a key).
Definition database.cpp:143
const char * GetKeyName(KeyInfo *key)
获取键的名称 (Retrieve the name of a key).
Definition database.cpp:288
static constexpr uint32_t FLASH_HEADER
Flash 头部标识 (Flash header identifier).
Definition database.hpp:237
bool IsBlockEmpty(FlashInfo *block)
判断块是否为空 (Check if block is empty).
Definition database.cpp:122
void Restore()
还原存储数据,清空 Flash 区域 (Restore storage data, clearing Flash memory area).
Definition database.cpp:86
uint8_t * GetKeyData(KeyInfo *key)
获取指定键的数据信息 (Retrieve the data associated with a key).
Definition database.cpp:274
uint32_t block_size_
Flash 块大小 (Flash block size).
Definition database.hpp:246
Flash & flash_
目标 Flash 存储设备 (Target Flash storage device).
Definition database.hpp:241
void Load()
从 Flash 加载数据到缓冲区 (Load data from Flash into the buffer).
Definition database.cpp:81
FlashInfo * info_main_
主存储区信息 (Main storage block information).
Definition database.hpp:244
DatabaseRawSequential(Flash &flash, size_t max_buffer_size=256)
构造函数,初始化 Flash 存储和缓冲区 (Constructor initializing Flash storage and buffer).
Definition database.cpp:16
ErrorCode SetKey(const char *name, const void *data, size_t size)
设置键值 (Set key value).
Definition database.cpp:225
KeyInfo * GetLastKey(FlashInfo *block)
获取块中的最后一个键 (Get last key in block).
Definition database.cpp:164
KeyInfo * GetNextKey(KeyInfo *key)
获取下一个键 (Get next key).
Definition database.cpp:153
uint8_t * data_buffer_
数据缓冲区 (Data buffer).
Definition database.hpp:242
void InitBlock(FlashInfo *block)
初始化块数据 (Initialize block data).
Definition database.cpp:96
ErrorCode AddKey(const char *name, const void *data, size_t size)
添加键值对到数据库 (Add key-value pair to database).
Definition database.cpp:186
FlashInfo * flash_data_
Flash 数据存储区 (Pointer to the Flash data storage).
Definition database.hpp:243
Abstract base class representing a flash memory interface. 抽象基类,表示闪存接口。
Definition flash.hpp:16
virtual ErrorCode Erase(size_t offset, size_t size)=0
Erases a section of the flash memory. 擦除闪存的指定区域。
virtual ErrorCode Write(size_t offset, ConstRawData data)=0
Writes data to the flash memory. 向闪存写入数据。
RawData flash_area_
Definition flash.hpp:38
void * addr_
数据存储地址。 The storage address of the data.
LibXR Color Control Library / LibXR终端颜色控制库
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值
Flash 存储的块信息结构 (Structure representing a Flash storage block).
Definition database.hpp:212
KeyInfo key
该块的键信息 (Key metadata in this block).
Definition database.hpp:214
uint32_t header
Flash 块头标识 (Flash block header identifier).
Definition database.hpp:213