在嵌入式终端设备上,免不了要存储记录、上传记录、查看记录等操作。
我称之为储存模块。怎样的操作接口,最好用?最方便?
首先想到的是使用嵌入式数据库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序列化后的二进制数据存储到表里。这样,如果记录的字段变化,只更新序列化后的二进制数据。
不动表结构。
。。。。。。
未完,改天继续