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

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

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


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


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


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


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


这也还不够。


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


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


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


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


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


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


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


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


如下:


//===============================>> 记录文件操作
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序列化后的二进制数据存储到表里。这样,如果记录的字段变化,只更新序列化后的二进制数据。


不动表结构。


。。。。。。


未完,改天继续


相关文章
|
13天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
24 1
|
2天前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
10 3
|
12天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
2天前
|
Go
GO语言时间转换
GO语言时间转换
9 0
|
13天前
|
Go
Go 语言接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
|
1天前
|
设计模式 Unix Linux
Linux系统命令技巧
Linux系统命令技巧
11 3
|
3天前
|
Linux
Linux的cp命令如何使用?
Linux的cp命令如何使用?
11 5
|
7天前
|
Linux
Linux常用命令包括
Linux常用命令包括
16 5
|
7天前
|
Linux
Linux命令
Linux命令
19 5
|
3天前
|
安全 Linux Shell
常见的 Linux 命令大全(表格形式)
常见的 Linux 命令大全(表格形式)