Skip to content

Commit 831b1e2

Browse files
committed
[nrf toup] simplify Key/Value Get function and add Exist function
Use settings_load_one function to load one key/value settings entry instead of settings_load_subtree_direct. This will avoid loading all the keys for some storage backends. Add as well _Exist function that returns whether a Key exist in the persistent storage or not and returns the size of ots value. Simplify as well the Delete function by using _Exist function instead of _Get. Signed-off-by: Riadh Ghaddab <rghaddab@baylibre.com>
1 parent 0f5af64 commit 831b1e2

File tree

2 files changed

+56
-50
lines changed

2 files changed

+56
-50
lines changed

src/platform/Zephyr/KeyValueStoreManagerImpl.cpp

+54-50
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,6 @@ namespace DeviceLayer {
3434
namespace PersistedStorage {
3535
namespace {
3636

37-
struct ReadEntry
38-
{
39-
void * destination; // destination address
40-
size_t destinationBufferSize; // size of destination buffer
41-
size_t readSize; // [out] size of read entry value
42-
CHIP_ERROR result; // [out] read result
43-
};
44-
4537
struct DeleteSubtreeEntry
4638
{
4739
int result;
@@ -87,43 +79,6 @@ CHIP_ERROR MakeFullKey(char (&fullKey)[SETTINGS_MAX_NAME_LEN + 1], const char *
8779
return CHIP_NO_ERROR;
8880
}
8981

90-
int LoadEntryCallback(const char * name, size_t entrySize, settings_read_cb readCb, void * cbArg, void * param)
91-
{
92-
ReadEntry & entry = *static_cast<ReadEntry *>(param);
93-
94-
// If requested key X, process just node X and ignore all its descendants: X/*
95-
if (name != nullptr && *name != '\0')
96-
return 0;
97-
98-
// Found requested key.
99-
uint8_t emptyValue[kEmptyValueSize];
100-
101-
if (entrySize == kEmptyValueSize && readCb(cbArg, emptyValue, kEmptyValueSize) == kEmptyValueSize &&
102-
memcmp(emptyValue, kEmptyValue, kEmptyValueSize) == 0)
103-
{
104-
// Special case - an empty value represented by known magic bytes.
105-
entry.result = CHIP_NO_ERROR;
106-
107-
// Return 1 to stop processing further keys
108-
return 1;
109-
}
110-
111-
const ssize_t bytesRead = readCb(cbArg, entry.destination, entry.destinationBufferSize);
112-
entry.readSize = bytesRead > 0 ? bytesRead : 0;
113-
114-
if (entrySize > entry.destinationBufferSize)
115-
{
116-
entry.result = CHIP_ERROR_BUFFER_TOO_SMALL;
117-
}
118-
else
119-
{
120-
entry.result = bytesRead > 0 ? CHIP_NO_ERROR : CHIP_ERROR_PERSISTED_STORAGE_FAILED;
121-
}
122-
123-
// Return 1 to stop processing further keys
124-
return 1;
125-
}
126-
12782
int DeleteSubtreeCallback(const char * name, size_t /* entrySize */, settings_read_cb /* readCb */, void * /* cbArg */,
12883
void * param)
12984
{
@@ -155,23 +110,48 @@ void KeyValueStoreManagerImpl::Init()
155110
CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t value_size, size_t * read_bytes_size,
156111
size_t offset_bytes) const
157112
{
113+
CHIP_ERROR result;
114+
size_t readSize;
158115
// Offset and partial reads are not supported, for now just return NOT_IMPLEMENTED.
159116
// Support can be added in the future if this is needed.
160117
VerifyOrReturnError(offset_bytes == 0, CHIP_ERROR_NOT_IMPLEMENTED);
161118

162119
char fullKey[SETTINGS_MAX_NAME_LEN + 1];
163120
ReturnErrorOnFailure(MakeFullKey(fullKey, key));
164121

165-
ReadEntry entry{ value, value_size, 0, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND };
166-
settings_load_subtree_direct(fullKey, LoadEntryCallback, &entry);
122+
// Found requested key.
123+
const ssize_t bytesRead = settings_load_one(fullKey, value, value_size);
124+
// If the return code is -ENOENT the key is not found
125+
VerifyOrReturnError(bytesRead != -ENOENT, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND);
126+
127+
if (bytesRead == kEmptyValueSize &&
128+
memcmp(value, kEmptyValue, kEmptyValueSize) == 0)
129+
{
130+
// Special case - an empty value represented by known magic bytes.
131+
result = CHIP_NO_ERROR;
132+
readSize = 0;
133+
}
134+
else
135+
{
136+
readSize = bytesRead > 0 ? bytesRead : 0;
137+
138+
if ((size_t)bytesRead > value_size)
139+
{
140+
result = CHIP_ERROR_BUFFER_TOO_SMALL;
141+
}
142+
else
143+
{
144+
result = bytesRead > 0 ? CHIP_NO_ERROR : CHIP_ERROR_PERSISTED_STORAGE_FAILED;
145+
}
146+
}
167147

168148
// Assign readSize only in case read_bytes_size is not nullptr, as it is optional argument
169149
if (read_bytes_size)
170150
{
171-
*read_bytes_size = entry.readSize;
151+
*read_bytes_size = readSize;
172152
}
173153

174-
return entry.result;
154+
return result;
175155
}
176156

177157
CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value, size_t value_size)
@@ -190,12 +170,36 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value,
190170
return CHIP_NO_ERROR;
191171
}
192172

173+
CHIP_ERROR KeyValueStoreManagerImpl::_Exist(const char * key, size_t * val_len)
174+
{
175+
char fullKey[SETTINGS_MAX_NAME_LEN + 1];
176+
ssize_t len;
177+
178+
ReturnErrorOnFailure(MakeFullKey(fullKey, key));
179+
180+
len = settings_exist(fullKey);
181+
182+
if (len > 0)
183+
{
184+
*val_len = len;
185+
return CHIP_NO_ERROR;;
186+
}
187+
if (len < 0)
188+
{
189+
return CHIP_ERROR_PERSISTED_STORAGE_FAILED;
190+
}
191+
192+
return CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
193+
}
194+
193195
CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key)
194196
{
195197
char fullKey[SETTINGS_MAX_NAME_LEN + 1];
198+
size_t val_len;
199+
196200
ReturnErrorOnFailure(MakeFullKey(fullKey, key));
197201

198-
ReturnErrorCodeIf(Get(key, nullptr, 0) == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND,
202+
ReturnErrorCodeIf(_Exist(key, &val_len) == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND,
199203
CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND);
200204
ReturnErrorCodeIf(settings_delete(fullKey) != 0, CHIP_ERROR_PERSISTED_STORAGE_FAILED);
201205

src/platform/Zephyr/KeyValueStoreManagerImpl.h

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class KeyValueStoreManagerImpl final : public KeyValueStoreManager
4343
// these will return CHIP_ERROR_NOT_IMPLEMENTED.
4444
CHIP_ERROR _Get(const char * key, void * value, size_t value_size, size_t * read_bytes_size = nullptr, size_t offset = 0) const;
4545

46+
CHIP_ERROR _Exist(const char * key, size_t * val_len);
47+
4648
CHIP_ERROR _Delete(const char * key);
4749

4850
CHIP_ERROR _Put(const char * key, const void * value, size_t value_size);

0 commit comments

Comments
 (0)