数据集的构成与存储
首先,数据集是存在psram数据区中的,这个相当于数据集存储在一个bin文件中,各个元素参数存储在对应地址上,为了方便对数据集的了解,我们从数据的存储来讲述;
数据集的存储分为四个部分:
存储位置 | 存储区名称 | 说明 |
---|---|---|
0000-000F | 数据库基本信息 | 主要存储数据库的基本信息 |
0010-01EF | 字段存储信息 | 存储数据表对应的字段信息 |
0200-(pdataaddr) | 逻辑表索引区 | 按逻辑表的顺序存储pid的编号(2字节一个) |
(pdataaddr)- | 数据的实际存储 | 每条数据占kn字节 |
pdataaddr=0x200+maxcount*2;
数据库基本信息(0x0000-0x000F)
数据库基本信息就相当于文件头,存储该文件的基本信息,长度16字节,地址为0x0000-0x000F,具体内容如下:
0000-0003:mark 0x57218def 用于识别当前存储区是数据集
0004:nfield: 有几个字段,实际上是添加字段的计数器
0005-0006:kn:每条数据占用的字节数,必须大于12
0007-0008:max count 数据集允许的最大条数
09-0A:count 物理表的数据条目数量
0B: size; 整个数据块长度,单位4K(kn*max count 占多少个4K块+1个基础数据头块)
0C-0D: dblist_count; //逻辑表条目数量,数据删除时会删除dblist的数据,数据添加时,会在尾部自动添加dblist数据;
字段存储信息(0x0010-0x01EF)
数据集的字段分为两种:
- 一种是系统字段,用于标注本条数据的权限、状态等;详见:数据条目的存储;系统字段占数据存储的12字节,因此kn必须大于12
- 一种是用户字段,本区讲述的字段存储信息就是指用户字段;用户字段不得超过15个,使用0x0010-0x01EF来存储
这里存储数据集对应的字段名称,构建字段名称后可以象数据库一样使用字段来获取该字段对应的值;
目前的字段支持字符串字段和整数数字字段,未来考虑扩展支持浮点数字段、bin字段等;
每个字段需要32字节来描述,因此按存储空间来说,一个数据集最大可支持15个字段,存储结构如下:
0010-002f:32字节一个字段描述
00-03:hash //字段名的hash值,用于字段的快速比对;本值自动生成,无需手动赋值
04-05:pos //本字段在数据存储区每条数据的位置,详见数据条目的存储区的描述
06-07 字段类型和长度(16bit数据)
b15-b13 字段类型
其中:
000-int
001-str
010-bin(待开发)
011-float(待开发)
b12-b00 数据长度 0-8191字节
整数时,1,2,4分别对应byte/word/long int
08-1F: 24字节的字符串字段名称,由于C语言需要0来结束字符串,实际字段名称不要超过23字节;
0030-004f: 32字节一个字段描述
0050-006f: 32字节一个字段描述
......
01d0-01ef 第15个字段描述
数据区列表以及排序专区
本区结构比较简单,其中每2字节一个数字,共maxcount个数字,分别对应物理表数据区的每条数据的pid值;本区开始地址0x200; 长度maxcount*2;
数据条目的存储
从(0x200+maxcount*2)开始存储数据,其中每条数据的长度为kn,由于有系统字段,因此kn必须大于12,kn=12+用户字段对应的存储长度;
具体存储结构如下:
dataaddr:数据开始 00-(kn-1)第一条数据
00-01 id //本条数据对应的物理位置标号,即pid
02- flag;//(服务器上不存在该字段,本字段是由客户端修改的临时状态)
其中:
bit0:0-正常数据
1-数据被修改
bit1: 0-正常数据
1-数据已经被删除
bit7:0-正常数据
1-需要更新到服务器
03- power(权限字段,服务器端存储使用,客户端有限操作)
04-07 shmistamp://数据创建时的shmi时间戳(标准时间戳-946656000)
08-0B RND;//数据创建时的随机数
0c-xxxx :用户字段对应的开始存储位置
- 其中00-0B 存储的就是前面说的系统字段,而从0c开始存储用户字段的数据
- 服务器端存储的数据不是靠id编号对应的,而是靠:设备对应的用户编号+时间戳+随机数 这3个字段来做唯一对应的;这样方便客户端和服务器端数据的同步