前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嵌入式linux之go语言开发(八)存储模块的封装(一)

嵌入式linux之go语言开发(八)存储模块的封装(一)

作者头像
杨永贞
发布2020-08-04 10:42:19
4230
发布2020-08-04 10:42:19
举报

在嵌入式终端设备上,免不了要存储记录、上传记录、查看记录等操作。

我称之为储存模块。怎样的操作接口,最好用?最方便?

首先想到的是使用嵌入式数据库sqllite,没错,选他作为存储媒介,用go调用也是很方便的。

但是,这还远远不够。原生的sql操作,若不做个封装,将会是很难用。

另外,已经有很多ORM框架,即对象关系映射,将面向对象语言程序中的对象自动持久化到关系数据库中,就满足要求了吗?

这也还不够。

我想要的接口,能满足这样的功能:

可以写入记录,删除记录,查询记录。

删除记录不是真正的删除,而是清除上传标记,即该记录还存在,只是表示一上传过,没用了,可以被覆盖。

记录数量达到一定条数时要从头循环覆盖。

记录可支持同时向不同的第三方平台上送。

操作记录接口要简单和灵活,比如添加记录中的字段不能再去动表结构。

这些,假如只用ORM框架,操作起来还是不够简单。

以往用c操作flash,完成记录的操作,我们有一整套好用的接口。确实很好用,很简单。

如下:

代码语言:javascript
复制
//===============================>> 记录文件操作
extern U32 APP_Create_RecFile( U32 id, U32 rp, U32 mode );		//创建记录文件
extern U32 APP_Open_RecFile( U32 id );							//打开记录文件

extern U32 APP_Read_RecFile_NotServer( U32 id, U32 rp, U32 sn, U08 *buf );
																//读取一条记录  顺序读取第SN条未上传的记录
extern U32 APP_Read_RecFile_WriteNot( U32 id, U32 sn, U08 *buf );
																//读取一条记录  倒数读取第SN条写入的记录
extern U32 APP_Read_RecFile_PHY( U32 id, U32 sn, U08 *buf );	//读取一条记录  读取第SN条记录,按编码位置读取

extern U32 APP_Write_RecFile( U32 id, U08 *buf );				//追加写入一条记录
extern U32 APP_Delete_RecFile( U32 id, U32 rp, U08 *buf, U32 recnum );
																//删除多条记录

extern U32 APP_Get_RecFileNum( U32 id, U32 rp, U32 *num );		//获取未上传的记录数						
extern U32 APP_Get_RecFileNO( U32 id, U32 *phyno, U32 *no );	//获取最后一条记录流水号
extern U32 APP_Get_RecFileStat( U32 id, U32 *sta );				//获取记录文件状态

extern U32 APP_Set_RecReadp( U32 id, U32 outrp, U32 inrp );		//记录多指针处理

这套接口有多好用?

比如,系统初始化时,去调用APP_Create_RecFile(记录区编号,重传指针,是否初始化内容为0)

去完成初始化的操作。假如有3个记录区,则分别是:

APP_Create_RecFile(1,1,0)

APP_Create_RecFile(2,1,0)

APP_Create_RecFile(3,1,0)

创建了三个记录区。相当于三个表。

写记录就调用APP_Create_RecFile(),至于记录的内容,只要为byte[]数组,想写什么就写什么。

读记录则调用APP_Read_RecFile_NotServer(),自动读取的就是未上传的记录,根据传的sn,可获取未上送的记录1,2...

上送一条就删除一条记录,则调用APP_Delete_RecFile(),并不是真正的删除,而是清除上传标记。实际记录还在。更安全。

写入记录也很简单,直接调用 APP_Write_RecFile( U32 id, U08 *buf )即可。需要写入的内容,组织好buf即可。写入哪个区(表),由ID这个参数指定。

那么计划把这一一列的接口,用go语言去实现。内部使用sqllite和protobuf。

暂时想到的是,封装一系列的操作记录的接口。使用sqllite,使用protobuf作为记录的结构定义。

把protobuf序列化后的二进制数据存储到表里。这样,如果记录的字段变化,只更新序列化后的二进制数据。

不动表结构。

。。。。。。

未完,改天继续

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档