移植案例与原理 - utils子系统之KV存储部件 (3)

news2024/12/24 20:55:35

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;
}

5.1.2 GetCurrentItem和SetCurrentItem获取设置键值对数量

函数GetCurrentItem用于获取键值对数量,⑴处可以看出,键值对数目保存在文件KV_FILE_SUM里。从文件里读取的键值对数量会放入⑵处的字符串里,字符串的长度为4,所以键值对的数量能是K级。然后执行UtilsFileRead读取文件内容,然后通过atoi函数转换为数值。函数SetCurrentItem用于更新键值对数量,保存到文件里。⑷处把整形的参数转换为字符串,然后打开文件KV_FILE_SUM,并写入。

#define KV_SUM_FILE        "KV_FILE_SUM"
#define KV_SUM_INDEX       4
......
static int GetCurrentItem(void)
{
⑴  int fd = UtilsFileOpen(KV_SUM_FILE, O_RDWR_FS, 0);
    if (fd < 0) {
        return 0;
    }
⑵  char value[KV_SUM_INDEX] = {0};
    int ret = UtilsFileRead(fd, value, KV_SUM_INDEX);
    UtilsFileClose(fd);
    fd = -1;
⑶  return (ret < 0) ? 0 : atoi(value);
}

static int SetCurrentItem(const int num)
{
    char value[KV_SUM_INDEX] = {0};
⑷  if (sprintf_s(value, KV_SUM_INDEX, "%d", num) < 0) {
        return EC_FAILURE;
    }
    int fd = UtilsFileOpen(KV_SUM_FILE, O_RDWR_FS | O_CREAT_FS, 0);
    if (fd < 0) {
        return EC_FAILURE;
    }
    int ret = UtilsFileWrite(fd, value, KV_SUM_INDEX);
    UtilsFileClose(fd);
    fd = -1;
    return (ret < 0) ? EC_FAILURE : EC_SUCCESS;
}

5.1.3 NewItem判断是否新键值对

函数NewItem用于判断给定的键名是否新的键值对,是否已经存在同样的键名。调用函数UtilsFileOpen,如果能打开,说明文件已经存在,否则不存在。

static boolean NewItem(const char* key)
{
    int fd = UtilsFileOpen(key, O_RDONLY_FS, 0);
    if (fd < 0) {
        return TRUE;
    }
    UtilsFileClose(fd);
    return FALSE;
}

5.2 获取键值UtilsGetValue

函数UtilsGetValue用于从文件中读取键值,传入键名key,读出的值保存在参数value,len设置读取的值的长度。如果支持键值对缓存,则执行⑴尝试从缓存中读取,否则执行⑵从文件中读取。读取成功后,会执行⑶把读取的键值加入缓存。

int UtilsGetValue(const char* key, char* value, unsigned int len)
{
    if (!IsValidKey(key) || (value == NULL) || (len > MAX_GET_VALUE_LEN)) {
        return EC_INVALID;
    }
#ifdef FEATURE_KV_CACHE
⑴  if (GetValueByCache(key, value, len) == EC_SUCCESS) {
        return EC_SUCCESS;
    }
#endif
⑵  int ret = GetValueByFile(key, value, len);
    if (ret < 0) {
        return EC_FAILURE;
    }
#ifdef FEATURE_KV_CACHE
⑶  AddKVCache(key, value, FALSE);
#endif
    return ret;
}

5.3 设置键值UtilsGetValue

函数UtilsGetValue用于设置键值对到文件。⑴处获取已有的键值对的数目,⑵处判断要设置的键值是否已经存在。⑶处如果键值对数量已经大于等于允许的最大值,并且要是新增的键值对,则然后EC_FAILURE。⑷处保存键值对到文件,如果支持缓存,则加入缓存。⑸处更新键值对数量。

int UtilsSetValue(const char* key, const char* value)
{
    if (!IsValidKey(key) || !IsValidValue(value, MAX_VALUE_LEN)) {
        return EC_INVALID;
    }
⑴  int currentNum = GetCurrentItem();
⑵  boolean newItem = NewItem(key);
⑶  if ((currentNum >= MAX_KV_SUM) && newItem) {
        return EC_FAILURE;
    }
⑷  int ret = SetValueToFile(key, value);
    if (ret == EC_SUCCESS) {
#ifdef FEATURE_KV_CACHE
        AddKVCache(key, value, TRUE);
#endif
        if (newItem) {
            currentNum++;
        }
    }

⑸  return SetCurrentItem(currentNum);
}

5.4 删除键值UtilsDeleteValue等

函数UtilsDeleteValue用于删除键值文件,如果支持缓存则先从缓存中删除。执行⑴删除文件,⑵处更新键值对数目。函数ClearKVCache用于清除缓存。对于使用UtilsFile接口时,不需要UtilsSetEnv函数。

int UtilsDeleteValue(const char* key)
{
    if (!IsValidKey(key)) {
        return EC_INVALID;
    }
#ifdef FEATURE_KV_CACHE
    DeleteKVCache(key);
#endif
⑴  int ret = UtilsFileDelete(key);
    if (ret == EC_SUCCESS) {
⑵      ret = SetCurrentItem(GetCurrentItem() - 1);
    }
    return ret;
}

#ifdef FEATURE_KV_CACHE
int ClearKVCache(void)
{
    return ClearKVCacheInner();
}
#endif

int UtilsSetEnv(const char* path)
{
    return EC_SUCCESS;
}

小结

本文介绍了utils子系统之KV存储部件的移植适配案例,分析了部件源代码。

如果大家想更加深入的学习 OpenHarmony 开发的内容,不妨可以参考以下相关学习文档进行学习,助你快速提升自己:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:https://qr21.cn/FV7h05

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1836015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3模拟国足18强赛抽签

Vue3国足18强赛抽签 国足遇到这个对阵&#xff0c;能顺利出现吗&#xff1f; 1、系统演示 Vue3模拟国足18强赛抽签 2、关键代码 开始抽签 <script setup> import FenDang from "/components/chouqian/FenDang.vue"; import {ref} from "vue";le…

如何将编译过的C++库迅速部署在Visual Studio新项目中

本文介绍在Visual Studio中&#xff0c;通过属性表&#xff0c;使得一个新建解决方案中的项目可以快速配置已有解决方案的项目中各类已编译好的C第三方库的方法。 例如&#xff0c;我们现有一个解决方案&#xff0c;其中的一个项目需要调用Armadillo、OpenCV等多个不同的C第三…

一文详解:什么是小程序SDK?

什么是小程序SDK&#xff1f; 首先来看看概念&#xff1a;小程序SDK&#xff08;Software Development Kit&#xff09;是用于开发和扩展小程序的工具集合。可以理解为一套工具箱&#xff0c;专门帮助开发者建立和定制小程序应用程序。这些工具包括了开发小程序所需的各种代码…

【Android面试八股文】谈一谈你对http和https的关系理解

文章目录 HTTPHTTPSSSL/TLS协议HTTPS加密、解密流程HTTP 和 HTTPS 的关系具体的差异实际应用总结扩展阅读HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)是用于在网络上进行通信的两种协议。 它们在很多方面是相似的,但关键的区别在于安全…

前端传进来的单选值是0,到了后端加了个逗号

如上图所示&#xff0c;标记的var的值org和id的值orgOrNot不能一样&#xff0c;如果一样&#xff0c;通过id获取&#xff08;#(“#orgOrNot”).find(“option:selected”).val()&#xff09;时候就会出现这种情况 改成如下情况&#xff0c;区别开id

ubuntu下同时安装和使用不同版本的库 librealsense

apt 安装的最新版本在/usr 源码安装的旧版本在/usr/local set(realsense2_DIR /usr/local/) find_package(realsense2 2.50.0 REQUIRED) message( "\n\n ${realsense2_INCLUDE_DIR} ${realsense2_VERSION} RealSense SDK 2.0 is FINDINGING, please install it from…

vivado PKGPIN_NIBBLE

描述 PKGPIN_NIBBLE是PKGPIN_BYTEGROUP的一部分。参见PKGPIN_BYTEGROUP&#xff0c; 第122页了解该对象的描述。 相关对象 PKGPIN_BYTEGROUP和PKGPIN_NIBBLE与IO_BANK、PACKAGE_PIN和 PORT&#xff0c;如前所述。此外&#xff0c;每个PKGPIN_NIBBLE都与 Xilinx设备。您可以使用…

The First项目报告:深度解读Layer 2生态zkSync

zkSync发币了&#xff0c;这个无数撸毛党心心念念数年之久的项目终于要来了&#xff0c;zkSync 是由Matter Labs 于2019 年推出的以太坊Layer 2 扩容解决方案&#xff0c;作为L2龙头项目之一&#xff0c;与其同属一个层次的L2四大天王之三Optimism、Arbitrum、zkSync、StarkNet…

RoaringBitMap处理海量数据内存diff

一、背景 假设mysql库中有一张近千万的客户信息表(未分表)&#xff0c;其中有客户性别&#xff0c;等级(10个等级)&#xff0c;参与某某活动等字段 1、如果要通过等级性别其他条件(离散度也低)筛选出客户&#xff0c;如何处理查询&#xff1f; 2、参与活动是记录活动ID&#…

科凡定制首倡轻高定突围的蓝海战术是明星代言?

4月19日&#xff0c;科凡家居再度重磅发声&#xff0c;正式宣布国际女星舒淇为全球代言人。 纵观定制家居几大一线品牌&#xff0c;欧派代言人胡歌&#xff0c;索菲亚代言人倪妮。尚品宅配代言人赵丽颖&#xff0c;维意定制代言人黄轩&#xff0c;志邦家居代言人周杰伦......大…

31.加载配置文件中的游戏到辅助列表

上一个内容&#xff1a;30.保存游戏配置到文件 以 30.保存游戏配置到文件 它的代码为基础进行修改 效果图&#xff1a; 加载配置文件到列表的函数&#xff1a; void CWndINJ::LoadGame() {int count GetPrivateProfileInt(L"main", L"count", 0, GameI…

sourceTree 解决remote: HTTP Basic: Access denied报错mac

解决sourceTree中remote: HTTP Basic: Access denied报错 mac sourcetree报错报错原因解决方案 mac sourcetree报错 warning: invalid credential line: xxx.com remote: HTTP Basic: Access denied fatal参考链接&#xff1a;https://developer.aliyun.com/article/1304149 …

经典文献阅读之--OrienterNet(自动驾驶中基于网格的交通场景感知)

dia 0. 简介 使用神经网络来匹配2D公开地图的做法是一个很有趣的方法&#xff0c;人们可以使用简单的2D地图在3D环境中指明自己所处的位置&#xff0c;而大部分视觉定位算法则依赖于昂贵的、难以构建和维护的3D点云地图。为了弥合这一差距《OrienterNet: Visual Localization…

全球首个开源类Sora模型大升级,16秒720p画质电影感爆棚!代码和权重全面开源!

目录 01 视频界开源战士 02 深度解码技术 03 打破闭环&#xff0c;开源赋能 潞晨Open-Sora团队刚刚在720p高清文生视频质量和生成时长上实现了突破性进展&#xff01; 全新升级的Open-Sora不仅支持无缝生成任意风格的高质量短片&#xff0c;更令人惊喜的是&#xff0c;团队选…

关于办公软件的使用

第一部分&#xff1a; 常用函数的使用 在使用的地方&#xff0c;输入SUM(B2:F2)回车 第二部分&#xff1a; 自定义函数的使用 1、打开 宏编辑 2、 自定义函数方法 3、自定义函数的使用和常用函数一样&#xff1a; 在使用的地方&#xff0c;输入计算面积(A3&#xff0c;B3)…

算法设计与分析期末复习题

一&#xff1a;程序阅读分析题&#xff08;共40分&#xff09; 1.&#xff08;8分&#xff09;阅读“算法1”&#xff0c;分析算法1的功能、时间复杂度。 答案&#xff1a;经典的汉诺塔问题&#xff0c;其目标是将 n 个不同大小的盘子从柱子 A 移动到柱子 C&#xff0c;借助柱…

PDM 测试

文章目录 硬件拓扑AP 生成 PDM输出数据路径AP 输入时域数据频域数据逻辑分析与抓包硬件拓扑 如果使用 AP 需要注意公地 AP 生成 PDM输出 AP 的 output 选择 PDM,MCU 提供 Bit clock,AP 生成 PDM 数据,AP 配置如下 数据路径 AP sin data -> PDM -> codec -> RA…

Git的下载安装及可视化工具小乌龟

一、 Git 的下载 第1步&#xff1a;下载Git&#xff0c;下载地址&#xff1a;Git for Windows 这个就需要去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com或者gitforwindows.org&#xff0c;或者阿里镜像&#xff08;感谢评论区的星悸迷航同学&#…

el-pagination分页组件导致发送两次请求

场景 有一个搜索框&#xff0c;搜索显示表格内容&#xff0c;下面有分页组件&#xff0c;大概长这样&#xff1a; 当分页组件选择到别的页数&#xff08;非第一页&#xff09;&#xff0c;再进行查询&#xff0c;查询的内容会显示在第一页&#xff0c;此时会发送两次网络请求。…

TIA Portal 博途 集成自动化软件下载安装,TIA Portal 轻松驾驭复杂工业设备

在博途TIA Portal的全方位赋能下&#xff0c;用户可以轻松驾驭复杂的工业设备&#xff0c;实现设备的精准配置、高效编程、便捷调试和实时监控。 在配置方面&#xff0c;博途TIA Portal以其强大的配置功能&#xff0c;帮助用户快速定义设备的各项参数&#xff0c;使设备能够快速…