libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
lifecycle.hpp
1
20ErrorCode Get(Database::KeyBase& key) override
21{
22 auto ans = SearchKey(key.name_);
23 if (!ans)
24 {
25 return ErrorCode::NOT_FOUND;
26 }
27
28 KeyInfo key_buffer;
29 ReadFlashOrExit(ans, key_buffer);
30
31 if (key.raw_data_.size_ != key_buffer.GetDataSize())
32 {
33 return ErrorCode::FAILED;
34 }
35
36 ReadFlashOrExit(GetKeyData(ans), key.raw_data_);
37
38 return ErrorCode::OK;
39}
40
48ErrorCode Set(KeyBase& key, RawData data) override
49{
50 return SetKey(key.name_, data.addr_, data.size_);
51}
52
58ErrorCode Add(KeyBase& key) override
59{
60 return AddKey(key.name_, key.raw_data_.addr_, key.raw_data_.size_);
61}
62
70explicit DatabaseRaw(Flash& flash, size_t recycle_threshold = 128)
71 : recycle_threshold_(recycle_threshold), flash_(flash)
72{
73 ASSERT(flash.MinEraseSize() * 2 <= flash_.Size());
74 ASSERT(flash_.MinWriteSize() <= MinWriteSize);
75 auto block_num = static_cast<size_t>(flash_.Size() / flash.MinEraseSize());
76 block_size_ = block_num / 2 * flash.MinEraseSize();
77 Init();
78}
79
96void Init()
97{
98 size_t used_size = 0;
99 if (IsBackupComplete(used_size) ||
100 (!IsBlockValid(BlockType::MAIN) && IsBackupRestorable(used_size)))
101 {
102 EraseFlashOrExit(0, block_size_);
103 CopyBlockPrefixAndChecksum(BlockType::MAIN, BlockType::BACKUP, used_size);
104 PrepareBackup();
105 }
106 else
107 {
108 if (!IsBlockValid(BlockType::MAIN))
109 {
110 InitBlock(BlockType::MAIN);
111 }
112 if (IsBlockValid(BlockType::BACKUP) && !IsBlockEmpty(BlockType::BACKUP))
113 {
114 PrepareBackup();
115 }
116 }
117
118 RepairMainChain();
119}
120
128void Restore()
129{
130 InitBlock(BlockType::MAIN);
131 PrepareBackup();
132}
133
158ErrorCode Recycle()
159{
160 size_t used_size = LibXR::OffsetOf(&FlashInfo::key) + AlignSize(sizeof(KeyInfo));
161 size_t key_offset = GetSentinelOffset(BlockType::MAIN);
162 KeyInfo key;
163 ReadFlashOrExit(key_offset, key);
164 while (NextChainKey(BlockType::MAIN, key_offset, key))
165 {
166 if (IsKeyLive(key) && IsKeyNameTerminated(key_offset, key))
167 {
168 used_size += GetKeySpan(key);
169 }
170 }
171 if (used_size + GetCrcSize() > GetChecksumOffset())
172 {
173 return ErrorCode::FULL;
174 }
175
176 if (!IsBackupPrepared())
177 {
178 PrepareBackup();
179 }
180
181 size_t backup_last_key = GetSentinelOffset(BlockType::BACKUP);
182 key_offset = GetSentinelOffset(BlockType::MAIN);
183 ReadFlashOrExit(key_offset, key);
184 while (NextChainKey(BlockType::MAIN, key_offset, key))
185 {
186 if (!IsKeyLive(key) || !IsKeyNameTerminated(key_offset, key))
187 {
188 continue;
189 }
190
191 const size_t new_key_offset = GetNextKey(backup_last_key);
192 WriteKeyHeader(new_key_offset, key.GetNameLength(), key.GetDataSize());
193 CopyFlashData(GetKeyName(new_key_offset), GetKeyName(key_offset),
194 key.GetNameLength());
195 CopyFlashData(GetKeyData(new_key_offset), GetKeyData(key_offset), key.GetDataSize());
196 ClearKeyFlag(new_key_offset, &KeyInfo::uninit);
197 LinkKey(BlockType::BACKUP, backup_last_key);
198 backup_last_key = new_key_offset;
199 }
200 DEV_ASSERT(GetNextKey(backup_last_key) - block_size_ == used_size);
201
202 const uint32_t crc = GetBackupCrc(used_size);
203 WriteFlashOrExit(GetBlockOffset(BlockType::BACKUP) + used_size, crc);
204 WriteBlockChecksum(BlockType::BACKUP);
205
206 EraseFlashOrExit(0, block_size_);
207 CopyBlockPrefixAndChecksum(BlockType::MAIN, BlockType::BACKUP, used_size);
208
209 PrepareBackup();
210
211 return ErrorCode::OK;
212}
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
size_t OffsetOf(MemberType OwnerType::*member) noexcept
计算成员在宿主对象中的偏移量 Computes the offset of a member within the owning object
Definition libxr_def.hpp:95
KeyInfo key
Definition layout.hpp:199
键信息结构,存储键的元数据 Structure containing key metadata.
Definition layout.hpp:119
BlockBoolData< MinWriteSize > uninit
该键是否未初始化
Definition layout.hpp:122
uint32_t GetDataSize() const
获取数据字节数 / Get the payload size in bytes.
Definition layout.hpp:167
uint8_t GetNameLength() const
获取键名长度 / Get the key name length.
Definition layout.hpp:152