5、KV存储部件对应UtilsFile接口部分的代码
分析下KV存储部件对应UtilsFile接口部分的代码。我们知道对外接口有设置键值UtilsSetValue、获取键值UtilsGetValue、删除键值UtilsDeleteValue和清除缓存ClearKVCache。我们先看看内部接口,这些接口调用的全部是UtilsFile接口,没有使用POSIX的文件接口。
5.1 内部接口
5.1.1 GetValueByFile和SetValueToFile从文件中读写键值
函数GetValueByFile用于从文件中读取键值,⑴处获取键名对应的键值文件的大小,如果文件大于等于参数中指定的长度len,返回EC_FAILURE。等于也不行,末尾需要放置一个空字符。⑵处打开文件,然后读取文件,读取的内容放入变量value里。⑶处末尾添加null空字符,然后返回获取的字符的长度。函数SetValueToFile用于把键值保存到文件里,⑷处调用UtilsFile接口打开,然后写入到文件里。
static int GetValueByFile(const char* key, char* value, unsigned int len)
{
unsigned int valueLen = 0;
⑴ if (UtilsFileStat(key, &valueLen) != EC_SUCCESS) {
return EC_FAILURE;
}
if (valueLen >= len) {
return EC_FAILURE;
}
⑵ int fd = UtilsFileOpen(key, O_RDONLY_FS, 0);
if (fd < 0) {
return EC_FAILURE;
}
int ret = UtilsFileRead(fd, value, valueLen);
UtilsFileClose(fd);
fd = -1;
if (ret < 0) {
return EC_FAILURE;
}
⑶ value[valueLen] = '\0';
return valueLen;
}
static int SetValueToFile(const char* key, const char* value)
{
⑷ int fd = UtilsFileOpen(key, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
if (fd < 0) {
return EC_FAILURE;
}
int ret = UtilsFileWrite(fd, value, strlen(value));
UtilsFileClose(fd);
fd = -1;
return (ret < 0) ? EC_FAILURE : EC_SUCCESS;
}