数据集的构成与存储

首先,数据集是存在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;   整个数据块长度,单位4Kkn*max count 占多少个4K块+1个基础数据头块)
0C-0D: dblist_count;   //逻辑表条目数量,数据删除时会删除dblist的数据,数据添加时,会在尾部自动添加dblist数据;

字段存储信息(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;//(服务器上不存在该字段,本字段是由客户端修改的临时状态)
        其中:
        bit00-正常数据
              1-数据被修改
        bit1: 0-正常数据
              1-数据已经被删除
        bit70-正常数据
              1-需要更新到服务器
    03- power(权限字段,服务器端存储使用,客户端有限操作)
    04-07 shmistamp//数据创建时的shmi时间戳(标准时间戳-946656000)
    08-0B RND;//数据创建时的随机数
    0c-xxxx :用户字段对应的开始存储位置