TuyaOS
KV-DB

物联网平台碎片化严重,各种各样的芯片和操作系统,资源、能力差异非常大。但是物联网设备的存储需求又有非常高的安全性,因为涉及到用户的隐私问题;要有非常高的可靠性,因为客户的场景不可控,必须在各种极端的情况下保证用户设备的可用性;还要有性能的要求,保证用户的使用体验。涂鸦TuyaOS提供了KV DB支持在文件系统、Flash上实现一套基于Key-Value存储的加密数据库,屏蔽了底层介质、操作系统的差异,为开发者提供了安全、可靠、高效的数据存储服务。

接口描述

KV DB写入

向KV DB写入一组Key-Value数据,需要提供key、value以及value的长度。

OPERATE_RET wd_common_write(IN CONST CHAR_T *key, IN CONST BYTE_T *value, IN CONST UINT_T len);
OPERATE_RET wd_common_write(IN CONST CHAR_T *key, IN CONST BYTE_T *value, IN CONST UINT_T len)
tuya key-value database write entry

KV DB读取

从KV DB中读取一组Key-Value数据,需要提供key,并提供一个用于存储value的缓冲区和缓冲区的长度,读取成功之后获得value以及value的长度。

OPERATE_RET wd_common_read(IN CONST CHAR_T *key, OUT BYTE_T **value, OUT UINT_T *p_len);
OPERATE_RET wd_common_read(IN CONST CHAR_T *key, OUT BYTE_T **value, OUT UINT_T *p_len)
tuya key-value database read entry

KV DB删除数据

从KV DB中删除一组Key-Value数据,需要提供key。

OPERATE_RET wd_common_delete(IN CONST CHAR_T *key);
OPERATE_RET wd_common_delete(IN CONST CHAR_T *key)
delete the entry from key-value database

KV DB模糊读取

使用模糊匹配的方式,从KV DB中读取一组符合包含key的Key-Value数据,需要提供fuzzy key(key的子段),并提供一个用于存储value的缓冲区和缓冲区的长度,读取成功之后获得value以及value的长度,wd_common_fuzzy_read会按照查找的index逐个返回查找命中的Key-Value数据。

OPERATE_RET wd_common_fuzzy_read(IN CONST CHAR_T *fuzzy_name, INOUT UINT_T *index, OUT BYTE_T **data, OUT UINT_T *len);
OPERATE_RET wd_common_fuzzy_read(IN CONST CHAR_T *fuzzy_name, INOUT UINT_T *index, OUT BYTE_T **data, OUT UINT_T *len)
tuya key-value database fuzzy read entry

KV DB模糊删除数据

使用模糊匹配的方式,从KV DB中删除一组符合包含key的Key-Value数据,需要提供fuzzy key(key的子段)。

OPERATE_RET wd_common_fuzzy_delete(IN CONST CHAR_T *key);
OPERATE_RET wd_common_fuzzy_delete(IN CONST CHAR_T *key)
fuzzy delete the entry from key-value database

KV DB模糊读取数据释放

释放wd_common_read和wd_common_fuzzy_read时申请的资源,注意,在使用wd_common_read和wd_common_fuzzy_read成功之后,必须调用wd_common_free_data接口,否则会造成内存泄露。

OPERATE_RET wd_common_free_data(IN BYTE_T *data);
OPERATE_RET wd_common_free_data(IN BYTE_T *data)
free the buffer which allocated by wd_common_read or wd_common_fuzzy_read

KV DB写入用户自定义数据

专门用于key "user_param_key"写入的接口,"user_param_key"是一个专用于开发者自定义数据存储的key。因此不需要输入key。

OPERATE_RET wd_user_param_write(IN CONST BYTE_T *data, IN CONST UINT_T len);
OPERATE_RET wd_user_param_write(IN CONST BYTE_T *data, IN CONST UINT_T len)
write the user parameter to tuya key-value database

KV DB读取用户自定义数据

专门用于key "user_param_key"读取的接口,"user_param_key"是一个专用于开发者自定义数据存储的key。因此不需要输入key。

OPERATE_RET wd_user_param_read(OUT BYTE_T **buf, OUT UINT_T *len);
OPERATE_RET wd_user_param_read(OUT BYTE_T **buf, OUT UINT_T *len)
read the user parameter from tuya key-value database

示例代码

sample_kv_demo()
{
int rt = OPRT_OK;
// 写一个数据"ddi-xxx":"hello-world-x"
rt = wd_common_write("ddi-xxx", "hello-world-x", 13);
EXPECT_EQ(rt, OPRT_OK);
// 读取数据"ddi-xxx",需要wd_common_free_data
BYTE_T *value = NULL;
UINT_T len = 0;
rt = wd_common_read("ddi-xxx", &value, &len);
EXPECT_EQ(rt, OPRT_OK);
EXPECT_EQ(memcmp(value, "hello-world-x", 13), 0);
value = NULL;
len = 0;
// 写一个数据"ddi-xxx":"hello-world-y"
rt = wd_common_write("ddi-yyy", "hello-world-y", 13);
EXPECT_EQ(rt, OPRT_OK);
// 修改数据"ddi-xxx":"hello-world-z"
rt = wd_common_write("ddi-xxx", "hello-world-z", 13);
EXPECT_EQ(rt, OPRT_OK);
// 读取所有包含"ddi-"的数据,会自动迭代读取全部数据
UINT index = 0;
while(rt == OPRT_OK) {
rt = wd_common_fuzzy_read("ddi-", &index, &value, &len);
if(value) {
value = NULL;
}
}
// 删除数据"ddi-xxx"
rt = wd_common_delete("ddi-xxx");
EXPECT_EQ(rt, OPRT_OK);
// 删除所有包含"ddi-"的数据
rt = wd_common_fuzzy_delete("ddi-");
EXPECT_EQ(rt, OPRT_OK);
return OPRT_OK;
}