Skip to content

Commit 048b54b

Browse files
committed
[nrf toup] simplify Key/Value Get function and add
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 internal KeyValueExist function that returns whether a Key exist in the persistent storage or not and returns the size of its value. Simplify as well the Delete function by using KeyValueExist function. Signed-off-by: Riadh Ghaddab <rghaddab@baylibre.com>
1 parent 0f5af64 commit 048b54b

File tree

1 file changed

+76
-51
lines changed

1 file changed

+76
-51
lines changed

src/platform/Zephyr/KeyValueStoreManagerImpl.cpp

+76-51
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
{
@@ -143,6 +98,7 @@ int DeleteSubtreeCallback(const char * name, size_t /* entrySize */, settings_re
14398
return 0;
14499
}
145100

101+
146102
} // namespace
147103

148104
KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance;
@@ -152,26 +108,79 @@ void KeyValueStoreManagerImpl::Init()
152108
VerifyOrDie(settings_subsys_init() == 0);
153109
}
154110

111+
void LoadOneAndVerifyResult(const char * fullkey, void * dest_buf, size_t dest_size, size_t * readSize,
112+
CHIP_ERROR * result)
113+
{
114+
const ssize_t bytesRead = settings_load_one(fullKey, dest_buf, dest_size);
115+
// If the return code is -ENOENT the key is not found
116+
if (bytesRead == -ENOENT)
117+
{
118+
*result = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
119+
*readSize = 0;
120+
return;
121+
}
122+
if ((bytesRead == kEmptyValueSize) && !memcmp(dest_buf, kEmptyValue, kEmptyValueSize))
123+
{
124+
*result = CHIP_NO_ERROR;
125+
*readSize = 0;
126+
return;
127+
}
128+
if (bytesRead > dest_size)
129+
{
130+
*result = CHIP_ERROR_BUFFER_TOO_SMALL;
131+
}
132+
else if (bytesRead >= 0)
133+
{
134+
*result = CHIP_NO_ERROR;
135+
}
136+
else
137+
{
138+
*result = CHIP_ERROR_PERSISTED_STORAGE_FAILED;
139+
}
140+
141+
*readSize = (bytesRead > 0) ? bytesRead : 0;
142+
143+
return;
144+
}
145+
155146
CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t value_size, size_t * read_bytes_size,
156147
size_t offset_bytes) const
157148
{
149+
CHIP_ERROR result;
150+
size_t readSize = 0;
151+
uint8_t emptyValue[kEmptyValueSize];
158152
// Offset and partial reads are not supported, for now just return NOT_IMPLEMENTED.
159153
// Support can be added in the future if this is needed.
160154
VerifyOrReturnError(offset_bytes == 0, CHIP_ERROR_NOT_IMPLEMENTED);
161155

162156
char fullKey[SETTINGS_MAX_NAME_LEN + 1];
163157
ReturnErrorOnFailure(MakeFullKey(fullKey, key));
164158

165-
ReadEntry entry{ value, value_size, 0, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND };
166-
settings_load_subtree_direct(fullKey, LoadEntryCallback, &entry);
159+
// Found requested key.
160+
if (value_size < kEmptyValueSize)
161+
{
162+
LoadOneAndVerifyResult(fullKey, emptyValue, kEmptyValueSize, &readSize, &result);
163+
if (readSize)
164+
{
165+
memcpy(value, emptyValue, value_size);
166+
}
167+
if (readSize > value_size)
168+
{
169+
result = CHIP_ERROR_BUFFER_TOO_SMALL;
170+
}
171+
}
172+
else
173+
{
174+
LoadOneAndVerifyResult(fullKey, value, value_size, &readSize, &result);
175+
}
167176

168177
// Assign readSize only in case read_bytes_size is not nullptr, as it is optional argument
169178
if (read_bytes_size)
170179
{
171-
*read_bytes_size = entry.readSize;
180+
*read_bytes_size = readSize;
172181
}
173182

174-
return entry.result;
183+
return result;
175184
}
176185

177186
CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value, size_t value_size)
@@ -190,13 +199,29 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value,
190199
return CHIP_NO_ERROR;
191200
}
192201

202+
bool KeyValueExist(const char * fullkey, size_t * val_len)
203+
{
204+
ssize_t len;
205+
206+
len = settings_get_val_len(fullKey);
207+
208+
if (len > 0)
209+
{
210+
*val_len = len;
211+
return true;;
212+
}
213+
214+
return false;
215+
}
216+
193217
CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key)
194218
{
195219
char fullKey[SETTINGS_MAX_NAME_LEN + 1];
220+
size_t val_len;
221+
196222
ReturnErrorOnFailure(MakeFullKey(fullKey, key));
197223

198-
ReturnErrorCodeIf(Get(key, nullptr, 0) == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND,
199-
CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND);
224+
ReturnErrorCodeIf(!KeyValueExist(fullkey, &val_len), CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND);
200225
ReturnErrorCodeIf(settings_delete(fullKey) != 0, CHIP_ERROR_PERSISTED_STORAGE_FAILED);
201226

202227
return CHIP_NO_ERROR;

0 commit comments

Comments
 (0)