CN113342908B - 一种面向对象的内核层数据库的构建方法 - Google Patents
一种面向对象的内核层数据库的构建方法 Download PDFInfo
- Publication number
- CN113342908B CN113342908B CN202110733656.4A CN202110733656A CN113342908B CN 113342908 B CN113342908 B CN 113342908B CN 202110733656 A CN202110733656 A CN 202110733656A CN 113342908 B CN113342908 B CN 113342908B
- Authority
- CN
- China
- Prior art keywords
- data
- attribute
- partition
- page
- database
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/289—Object oriented databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/211—Schema design and management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开涉及一种面向对象的内核层数据库的构建方法,其特征在于,数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,数据库的存取单元为对象和对象属性,数据库包括:接口层,用于接收并处理对象的存取请求和结构化查询请求;逻辑层,用于实现对象的存取;其中,对对象的操作是基于对象标识,对象标识可以计算转换为编程语言的对象指针;物理层,用于实现对象和对象属性的数据存取;物理层,还用于存储全局索引表,全局索引表用于建立特定类型对象的路径索引;物理层,还用于实现对象数据和对象属性数据的持久化存储。由此,满足内核场景下,对复杂对象的存储和查询需求,提高访问效率。
Description
技术领域
本公开涉及信息安全领域技术领域,尤其涉及一种面向对象的内核层数据库的构建方法。
背景技术
目前,绝大多数的操作系统在内核层都不会提供通用数据库的支持。但在一些产品核心功能实现在内核模式的情况下,典型的就有主机安全类的产品(例如文件防护、主机防火墙等产品,其核心功能都在内核层实现),对数据库可能是有需求的,例如存放文件信息、网址黑白名单。
相关技术中,程序内的简单数据结构例如,开发者使用链表、哈希表、数组等常用的数据结构存取数据,然而,在对数据库有较复杂需求时,这种硬编码的开发方式成本就会显著提高,例如需要维护对象与对象之间的关系时、需要支持多种方式的查询时、对象的结构经常变化时;或者是在应用层实现通用数据库,当内核层有数据存取需求时,将请求从内核层转发到应用层,成本高且回调还是受中断级别的限制,例如,在网络接收处理过程中,会发生在较高的中断级,此时同步对象不可用,灵活性较差,可用性较低。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开提供了一种面向对象的内核层数据库的构建方法。
本公开提供了一种面向对象的内核层数据库的构建方法,包括:
数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,所述数据库的存取单元为对象和对象属性,所述数据库包括:接口层、逻辑层和物理层;
所述接口层,用于接收并处理对象的存取请求和结构化查询请求;
所述逻辑层,用于实现对象的存取,包括新建对象、修改对象、删除对象及获取对象;其中,对对象的操作是基于对象标识,所述对象标识用于标识唯一对象且指明对象在所述物理层的存储位置,所述对象标识可以计算转换为编程语言的对象指针;
所述物理层,用于实现所述对象和所述对象属性的数据存取;其中,数据按分区、分页的形式分级存储,一个分区用于存储一类对象或对象属性,每个所述分区包括多个指定大小的分页,每个所述分页存储多个对象数据或属性数据;
所述物理层,还用于存储全局索引表,所述全局索引表用于建立特定类型对象的路径索引;
所述物理层,还用于实现所述对象数据和所述对象属性数据的持久化存储。
在本公开的一个可选实施例中,所述数据库是面向对象的,是由一个架构定义统一描述的,包括:
所述架构定义为一个数据结构,描述所述数据库所包含的全部对象类定义、属性定义以及对象之间的关系;
所述架构定义包括属性架构,定义所述数据库的全部属性,包括属性的数据类型、内存类型和数据转换方法;
所述架构定义包括类架构,定义所述数据库全部的对象类,包括对象类在所述物理层的分区号、内存类型以及类的特有属性;
其中,所述类架构,指定一个对象类的基类以描述对象之间的继承关系;
所述类架构,指定一个对象类的容器类以描述对象之间的包含关系;
所述类架构为对象类定义数据类型为对象标识的特有属性,指向其它对象以描述对象之间的引用关系。
在本公开的一个可选实施例中,所述数据库在运行时,全部数据存储于内核层分配的内存上:
所述物理层存储的数据包括对象数据、属性数据、索引数据;
所述物理层在存储不同数据时,使用特定的分区,所述分区是一个数据结构,至少包括但不限于分区号、内存类型、分页大小和分页集合;
其中,所述分区号为一个整数,用于标识一个分区;
所述内存类型,在操作系统内核层分为分页式的和非分页式的两类;其中,分页式的内存,用于存储仅低中断级访问的数据,非分页式的内存,用于存储可能在高中断级访问的对象;其中,所述低中断级是指操作系统中低于缺页中断的中断级别,在所述低中断级,允许进行内存换页操作,可以使用分页式的内存,所述高中断级是禁止换页操作的,所以仅可使用非分页式的常驻内存;
所述分页大小,是指为一个分页所分配的连续内存的长度;
所述分页集合,至少包含一个分页;
所述分页,是一个数据结构,包含一段按所述内存类型、所述分页大小分配的连续内存,还包括所述分页当前的页偏移;其中,所述页偏移,是一个整数,用于指定新数据在所述连续内存中的插入位置;
根据所述分区号、分页号、所述页偏移三个整数组成数据标识,用于定位和标识一个数据、以及通过对所述数据标识计算转换为数据在所述连续内存中的数据指针,所述数据指针在编程语言中使用;
其中,所述数据标识具有标识一个数据和数据寻址的双重含义,所述数据库在所述物理层上的存储为单调增长的;
其中,对于所述物理层存放的对象数据的数据标识为对象标识,所述对象数据的数据指针为对象指针、对于所述物理层存放的属性数据的数据标识为属性数据标识,所述属性数据的数据指针为属性数据指针、对于所述物理层存放的索引数据的数据标识为索引标识,所述索引数据的数据指针为索引指针。
在本公开的一个可选实施例中,所述逻辑层实现支持对象的存取:
所述对象包含一个固定的头部,用于存放所述对象的多个固有属性,所述固有属性包括但不限于对象标识、对象名称、对象标志、对象索引、容器对象标识、基类对象标识、派生对象标识中的一种或者多种;
所述对象的结构中,还包含一个由所述对象的类架构指定的固定大小的属性数组,用于存放所述对象的特有属性;
其中,所述对象标识为所述对象在所述物理层的数据标识,对所述对象标识计算转换成所述对象在所述物理层内存中的对象指针、所述对象名称的数据类型是一个变长的字符串、所述对象索引对于特定类别的对象,存放所述对象的路径索引,以便根据所述路径索引查找所述对象、所述容器对象标识用于指示所述对象的容器对象、所述基类对象标识和所述派生类对象标识,用于指示两个对象间的继承关系;
所述逻辑层支持所述对象的新建,包括在所述物理层的指定分区中插入一个新对象的数据,以及设置新对象的固有属性和特有属性;
所述逻辑层支持所述对象的修改,包括根据所述对象标识,获取所述对象指针,以及更新一个或多个对象的固有属性和特有属性;
所述逻辑层支持所述对象的删除,其中,根据所述数据库的单调增长特性,采用设置对象标志来实现所述对象的删除。
在本公开的一个可选实施例中,所述属性架构,定义所述数据库的全部属性:
所述属性架构至少包括但不限于属性的数据类型、属性标识、属性名称、内存类型、属性重用标记、属性转义数据和属性转义函数;
其中,所述属性的数据类型,按属性的存储方式分为直接存储类型和间接存储类型;
其中,所述直接存储类型的属性的数据占用的空间不超过预设数量字节,用于存储包括但不限于布尔值、整数值、枚举、掩码、对象标识、网际互连协议地址中的一种或者多种,在对象的结构中,直接访问;所述间接存储类型的属性的数据占用的空间可超过所述预设数量字节,在所述物理层使用特定的分区存放,在对象的结构中,使用属性数据标识存放存储,在访问时,由所述属性数据标识获取对应的数据指针在程序中使用;
所述属性重用标记,指明属性的数据是否可被重复的使用、所述属性转义数据,用于将指定的枚举值或掩码转换成对应的字符串,或将指定的字符串转换成枚举值或掩码、所述属性转义函数,用于将特定类型的数据转换成字符串,或将指定的字符串转换成特定类型的数据。
在本公开的一个可选实施例中,所述的间接存储类型,包括:
定长间接存储,用于存放固定长度的数据;
变长间接存储,用于存放非固定长度的数据,包括但不限于带有长度标记的字符串、带有结束标记的字符串或带有长度标记的二进制数据中的一种或者多种;
在本公开的一个可选实施例中,所述物理层支持持久化存储:
所述持久化存储,支持在所述数据库运行期间,根据设置的定时器或用户层的指令,将全部所述分区、所述分页的数据从内存中转储到磁盘文件或其它存储介质;
所述持久化存储,支持在所述数据库关闭时,将全部所述分区、所述分页的数据从所述内存中转储到所述磁盘文件或其它存储介质;
所述持久化存储,支持在所述数据库启动时,将全部所述分区、所述分页的数据从所述磁盘文件或其它存储介质载入到所述内存;
其中,在转储过程中,对数据进行相应的压缩、加密处理的编码处理、以及在所述载入过程中,对数据进行所述转储过程对应的解密、解压缩的解码处理。
在本公开的一个可选实施例中,所述接口层包括直接访问接口和结构化查询接口:
所述直接访问接口,用于根据所述对象标识,返回对象的全部属性信息;
所述直接访问接口,还用于插入对象、修改对象和删除对象;
所述结构化查询接口,用于根据结构化的查询命令,返回满足特定条件的对象的集合,对于每一个返回的对象所包含的属性信息由所述查询指令指定。
在本公开的一个可选实施例中,从接口的暴露方式,所述接口层包括内核层访问接口和用户层访问接口;
所述内核层访问接口采用内核层的函数指针公布,外部模块通过输入输出请求获取一组用于访问对象的接口函数,根据所述接口函数访问所述数据库;
所述用户层访问接口为用户层通过特定的所述输入输出请求进行操作,其中,所述输入输出请求所输入和输出的数据为二进制或文本格式。
在本公开的一个可选实施例中,在所述数据库第一次启动时,所述物理层会进行如下的初始化处理:
分配所述全局索引表的分区,其中,分区个数为哈希表的桶数,对于每一个分区,使用预设的页大小、指定非分页的内存类型进行分区初始化;
遍历所述属性架构定义集合,对于每一个数据类型为间接存储的属性分配一个存储分区和根据属性架构指定的数据类型计算出页大小,并根据所述页大小和内存类型对分区进行初始化,将分区关联到所述属性架构上;
遍历所述类架构定义集合,对于每一个类定义分配一个存储分区,根据类架构的属性数计算出页大小,并根据计算出的页大小和类架构指定的内存类型对分区进行初始化,将分区关联到所述类架构上。
在本公开的一个可选实施例中,所述持久化存储,在所述物理层还执行如下步骤:
以写权限打开数据库存储文件,如果文件不存在则新建数据库存储文件;
遍历类架构定义集合,将每一个类的分区的数据结构及全部的分页数据转储到文件;
遍历属性架构定义集合,对于每一个数据类型为间接存储的属性对应的分区的数据结构及全部的分页数据转储到文件;
对于所述全局索引表的每个分区的数据结构及全部的分页数据转储到文件。
在本公开的一个可选实施例中,在所述数据库启动时,所述物理层会进行如下的装载处理:
读取数据库存储文件的过程中校验数据库文件的完整性,如果校验失败,则终止装载处理,重新进行初始化处理;
如果校验成功,则按哈希表的桶数分配所述全局索引表的分区,并从文件读取每个分区的数据;
遍历所述属性架构定义集合,对于每一个数据类型为间接存储的属性,分配一个存储分区、从文件中加载分区数据和将分区关联到所述属性架构上;
遍历所述类架构定义集合,对于每一个类定义分配一个存储分区、从文件中加载分区数据和将分区关联到所述类架构上。
在本公开的一个可选实施例中,在所述物理层的分区追加一个新页包括以下步骤:
按分区指定的页大小和内存类型分配一个新页,并将页数据初始化为0和将页偏移设置为1;
对所述分区进行写锁定操作,并将所述新页加到所述分区;
将所述分区的当前页号加1,并解除所述分区的写锁定。
在本公开的一个可选实施例中,在所述物理层的分区中查找一个数据包括以下步骤:
从分区的最后一页开始到第一页为止,遍历页,并在页中采用二进制搜索,查找数据,如果找到了,根据页号和偏移构造数据标识返回。
在本公开的一个可选实施例中,在所述物理层的分区追加一个变长数据包括以下步骤:
判断分区的当前页的剩余空间是否满足待追加的数据,如果不满足,则向所述分区追加一个新页,将数据复制到所述当前页的尾部,将所述当前页的偏移增加指定的数据长度,并返回数据标识和数据指针;
在所述物理层的分区追加一个定长数据包括以下步骤:
将分区号、分区的当前页号、当前页的偏移量记录成新数据标识,并记录对应的数据指针,并将当前页的偏移量加1,在页空间已耗尽的情况下,向分区追加一个新页,返回所述新数据标识和对应的数据指针。
在本公开的一个可选实施例中,在所述逻辑层中插入一个新对象包括以下步骤:
获取参数为对象的类架构,根据类架构的定义,计算出存放一个对象所需要的内存空间大小;
在类对象的分区中追加一个定长数据,返回的数据指针作为对象指针,并通过所述对象指针,将对象标识设置为数据标识。
在本公开的一个可选实施例中,在所述逻辑层设置间接存储类型的对象属性包括如下步骤:
通过类架构的定义确定对应的属性架构定义;
如果属性架构的数据重用标志被设置,则查找属性的数据,如果找到了,则将数据标识设置到对象属性数组对应的元素,结束处理;
如果属性的数据类型是变长的,则追加传入的数据,将所述数据标识设置对象属性数组对应的元素,结束处理;
如果属性的数据类型是定长的,则分配一个定长的数据,将传入的数据复制到返回的指针,并将返回的数据标识设置对象属性数组对应的元素,结束处理。
在本公开的一个可选实施例中,在所述逻辑层通过对象指针获取对象属性包括如下步骤:
获取参数包含有属性在类架构定义中的属性索引,如果属性的数据类型是直接访问的,则直接返回对象属性数组对应索引的元素数据;
如果属性的数据类型是间接访问的,则取出对象属性数组对应索引的元素数据作为数据标识,在属性的存储分区中根据所述数据标识中的页号获取页内存的地址,加上偏移量作为数据指针返回。
在本公开的一个可选实施例中,在所述逻辑层访问内聚对象属性包括如下步骤:
获取参数包含有内聚对象的目标属性标识,其中,内聚对象属性存放的是一个对象标识,根据所述对象标识获取内聚对象的指针,如果指针无效,返回失败;
获取所述内聚对象的类架构定义,根据目标属性标识获取所述内聚对象属性在内聚对象类中的属性索引;
根据所述属性索引获取内聚对象指定属性的数据。
在本公开的一个可选实施例中,在所述逻辑层中按固有属性查找对象包括如下步骤:
获取参数包含对象名称和/或容器对象标识;
从分区的最后一个页开始,到第一个页为止,遍历页,在每一个页中,将页数据视作对象数组,比对每一个对象,如果对象名称指向的字符串与传入的参数匹配,并且所述容器对象标识相等,返回对象指针。
在本公开的一个可选实施例中,在所述逻辑层中按条件表达式筛选对象包括如下步骤:
获取参数以二叉树形式组织的表达式树,从分区的第一个页开始遍历页,在每一个页中,将页数据视作对象数组,遍历对象;
对于每一个对象作为输入,计算表达式树的值,如果为真,则将对象的指针加入到结果集。
在本公开的一个可选实施例中,在所述接口层中将对象序列化到缓冲区包括如下步骤:
计算所需要的缓冲区大小,判断目标缓冲区的长度是否小于所述缓冲区大小,如果是,则返回失败;
如果否,则将所述目标缓冲区的指针视作目标对象指针,将对象的固定属性和特有属性复制到目标对象;
提取对象的名称,将名称字符串追加到所述目标缓冲区的尾部,将名称字符串在所述目标缓冲区的偏移量存储到目标对象的名称属性中;
遍历对象的特有属性,对于间接存储属性,提取属性的数据追加到所述目标缓冲区的尾部,将属性数据在所述目标缓冲区的偏移量存储到目标对象的属性值里。
在本公开的一个可选实施例中,在所述接口层中用户层直接查询对象包括如下步骤:
从所述输入输出请求的输入缓冲区里提取出对象标识;
根据所述对象标识获取对象指针,并将对象序列化到所述输入输出请求的输出缓冲区。
在本公开的一个可选实施例中,在所述接口层中用户层插入对象包括如下步骤:
将所述输入输出请求的输入缓冲区指针视作源对象指针,根据源对象的对象标识中的分区号,获取对象的类架构;
根据所述类架构分配一个新对象,从所述输入缓冲区中获取对象名称的字符串,并设置新对象的名称;
复制源对象的固有属性到所述新对象,包括容器对象标识和基类对象标识;
根据所述类架构,遍历特有属性的架构;其中,对于直接存储类型的属性,直接复制源对象的属性数据到新对象,对于间接存储类型,将源对象属性中数据视作偏移量,从所述输入缓冲区中获取属性的数据,设置到所述新对象中;
将所述新对象的对象标识写入到所述输入输出请求的输出缓冲区。
在本公开的一个可选实施例中,在所述接口层中用户层结构化查询包括如下步骤:
从所述输入输出请求的输入缓冲区中,提取所述查询命令;
对所述查询命令进行处理,提取对象类名称、属性列表、条件表达式和排序参数;
在所述输出缓冲区中,根据解析出的属性列表,构造列头信息;其中,所述列头信息包括列数和每个列的名称和数据类型;
查询对象集合,如果有条件表达式,用所述条件表达式树筛选出所有匹配的对象,如果没有条件表达式,在类关联分区中,第一个页开始,将页数据作为对象数组,将页内全部的对象指针加入到结果集,获取全部对象;
如果有排序参数,则按所述排序参数将对象指针重新排序;
遍历结果集,对于每一个对象,在所述输出缓冲区中追加一个记录行,每一行将按顺序包含属性列表中指定的属性值。
本公开实施例提供的技术方案与现有技术相比具有如下优点:
通过提出一种面向对象的内核层数据库的构建方法,数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,数据库的存取单元为对象和对象属性,数据库包括接口层,用于接收并处理对象的存取请求和结构化查询请求,逻辑层,用于实现对象的存取,包括新建对象、修改对象、删除对象及获取对象;其中,对对象的操作是基于对象标识,对象标识用于标识唯一对象且指明对象在物理层的存储位置,对象标识可以计算转换为编程语言的对象指针,物理层,用于实现对象和对象属性的数据存取;其中,数据按分区、分页的形式分级存储,一个分区用于存储一类对象或对象属性,每个分区包括多个指定大小的分页,每个分页存储多个对象数据或属性数据,物理层,还用于存储全局索引表,全局索引表用于建立特定类型对象的路径索引,物理层,还用于实现对象数据和对象属性数据的持久化存储。由此,满足内核场景下,对复杂对象的存储和查询需求,提高访问效率。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例所述一种面向对象的内核层数据库的构建方法的结构示例图;
图2为本公开实施例所述另一种面向对象的内核层数据库的构建方法的结构示例。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
在实际应用中,除了上述背景技术描述的数据库外,还可以将一个嵌入式的关系数据库移植到内核层使用,但是这种方式,访问数据库存储的对象时,需要将其数据转换到程序的结构、如果数据库的存储层是文件,则在高派发级情况下,无法访问、以及如果数据库的存储层是内存,则无法确保分配到连续的内存。
针对上述问题,本公开提出一种面向对象的内核层数据库的构建方法,可以满足内核场景下,对复杂对象的存储和查询需求,提高访问效率。
本公开提出的数据库可以满足特定内核场景下的开发需要,尤其针对主机安全软件的开发,面向对象的,按类别存取对象,并且能够维护基本的对象间的关系(继承、聚合);可以根据需要调整数据库的架构,而不需要额外的代码编写;可以支持多种方式的查询,包括按键直接查询和结构化查询;能够满足各种内核场景下(主要是中断级)对数据的存取支持和对系统资源的消耗(CPU(Central Processing Unit,中央处理器)、内存、IO(InputOutput,输入输出)读写)应该尽量小。
图1为本公开实施例所述一种面向对象的内核层数据库的构建方法的结构示例图。
如图1所示,数据库包括:接口层100、逻辑层200和物理层300。
其中,数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,数据库的存取单元为对象和对象属性。
接口层100,用于接收并处理对象的存取请求和结构化查询请求。
逻辑层200,用于实现对象的存取,包括新建对象、修改对象、删除对象及获取对象;其中,对对象的操作是基于对象标识,对象标识用于标识唯一对象且指明对象在物理层的存储位置,对象标识可以计算转换为编程语言的对象指针。
物理层300,用于实现对象和对象属性的数据存取;其中,数据按分区、分页的形式分级存储,一个分区用于存储一类对象或对象属性,每个分区包括多个指定大小的分页,每个分页存储多个对象数据或属性数据。
物理层300,还用于存储全局索引表,全局索引表用于建立特定类型对象的路径索引。
物理层300,还用于实现对象数据和对象属性数据的持久化存储。
在本公开实施例中,数据库是面向对象的,是由一个架构定义统一描述的,包括:架构定义为一个数据结构,描述数据库所包含的全部对象类定义、属性定义以及对象之间的关系;架构定义包括属性架构,定义数据库的全部属性,包括属性的数据类型、内存类型和数据转换方法;架构定义包括类架构,定义数据库全部的对象类,包括对象类在物理层的分区号、内存类型以及类的特有属性。
其中,类架构,指定一个对象类的基类以描述对象之间的继承关系(例如,可执行文件类继承自文件类);类架构,指定一个对象类的容器类以描述对象之间的包含关系(例如,一个文件对象的容器类是一个目录对象);类架构为对象类定义数据类型为对象标识的特有属性,指向其它对象以描述对象之间的引用关系(例如,一个服务对象可以有一个数据类型为‘对象’的可执行文件属性,指向服务的可执行文件)。
在本公开实施例中,数据库在运行时,全部数据存储于内核层分配的内存上:物理层存储的数据包括对象数据、属性数据、索引数据;物理层在存储不同数据时,使用特定的分区,分区是一个数据结构,至少包括但不限于分区号、内存类型、分页大小和分页集合。
其中,分区号为一个整数,用于标识一个分区;内存类型,在操作系统内核层分为分页式的和非分页式的两类;其中,分页式的内存,用于存储仅低中断级访问的数据,非分页式的内存,用于存储可能在高中断级访问的对象;其中,低中断级是指操作系统中低于缺页中断的中断级别,在低中断级,允许进行内存换页操作,可以使用分页式的内存,高中断级是禁止换页操作的,所以仅可使用非分页式的常驻内存;分页大小,是指为一个分页所分配的连续内存的长度;分页集合,至少包含一个分页;分页,是一个数据结构,包含一段按内存类型、分页大小分配的连续内存,还包括分页当前的页偏移;其中,页偏移,是一个整数,用于指定新数据在连续内存中的插入位置;根据分区号、分页号、页偏移三个整数组成数据标识,用于定位和标识一个数据、以及通过对数据标识计算转换为数据在连续内存中的数据指针,数据指针在编程语言中使用。
其中,数据标识具有标识一个数据和数据寻址的双重含义,数据库在物理层上的存储为单调增长的;其中,对于物理层存放的对象数据的数据标识为对象标识,对象数据的数据指针为对象指针、对于物理层存放的属性数据的数据标识为属性数据标识,属性数据的数据指针为属性数据指针、对于物理层存放的索引数据的数据标识为索引标识,索引数据的数据指针为索引指针。
具体地,传统的数据库,在读取数据时,需要将数据从数据库表中读取到内存,然后转换成需要的对象结构,然后再使用,存储数据时也要有一个反向的转换过程。其转换过程会消耗过多的资源,这在内核场景中是不可容忍的。
为此,应该实现“即时存取”对象,即从数据库到程序可用的数据结构不需要转换,本公开实施例中,程序运行期间,数据库的全部数据应该驻留在内存中,即数据库持久化存储在文件中,操作系统启动时加载到内存、操作系统运行时,定期将数据库在内存中的变化转储到文件和操作系统关闭时,应该将数据库在内存中的变化转储到文件。
另外,对象在数据库中以程序可直接访问的形式组织,数据库对象的组织(属性)对于开发者来说是透明的,因此,为了满足数据库的通用性,需要一个通用的描述方式描述对象,即数据库架构,对象及其属性的存储具有规格化,即一个对象有一个固定的头部,存储若干固定的属性、对象特有的属性,每个属性在对象结构中占用的空间是定长的,不然无法使用查询语言比如C语言的数组访问、由于在对象中存储属性需要定长的数据,那么引申出了间接访问的需求,即对于数据超过一定长度的属性,可以另辟空间存储,在属性值存储其指针。
再者,由于内存的分配地址是不固定的,为此每次加载时,数据库中的对象,在内存中的地址也会变化,为此,需要为数据库中的对象设计一个编址方式,(类似于操作系统的虚拟内存管理中的页表机制),由此,对象的唯一标识可以直接转换成对象在内存中的地址、对象应该分区存储,不同的对象应该存储在不同的分区、由于内核层内存分配的限制,不能保证分配出连续的大片内存,因此在对象的分区中,应该再进行分页存储。(举例:分配16个1M内存总能成功,但分配一个16M内存可能会失败),因此,需要“分区-页-偏移”的三级寻址方案。而这个地址恰好也就可以作为对象的唯一标识(ID,Identity document)。
在本公开实施例中,数据库的内部架构,由开发者(数据库的使用者)提供的架构定义决定,架构定义是一个特定的数据结构,用于描述数据库的物理层300、逻辑层200及接口层100的具体定义。
在本公开实施例中,物理层300中,每个分区用于存储同一类型的数据对象,每个分区的基本信息包括:每个分区存储对象类型的标识、页内存是否可分页、当前的页数、每个指定大小的分页分配空间的大小、单一对象占用空间的大小、分区的读写锁和当前存储的对象数;每个指定大小的分页的基本信息包括:当前有效数据的结束位置和数据变更标记;其中,每个指定大小的分页存放多个数据对象,每个数据对象采用三级寻址方式,对象的地址作对象的唯一标识;全局字符串表为存放可重复使用的字符串,其中,获取字符串时,计算字符串的哈希值,根据哈希值确定字符串隶属的分区号,并根据分区号在分区的页里查找目标字符串;全局索引表为存储对象的索引,每个索引项包含一个键值和对象标识。
具体地,物理层300实现与数据库存储相关的功能,数据按“分区-页”两级存储:a)分区:每个分区用于存储同一类型的数据对象,分区的基本信息中包含:本分区存储对象类型的标识、页内存是否可分页的,根据对象存取时可能的中断级决定(具体的:当对象的存取全部发生在较低中断级的情况下,可以使用分页的内存,即可交换到磁盘页面文件上的内存;存取可能发生在较高中断级时,使用非分页的内存,即常驻于物理内存上)、当前的页数、每个分页分配空间的大小、单一对象占用空间的大小、分区的读写锁和当前存储的对象数等信息;b)页:每个分区包含若干指定大小的分页,每个分页上的基本信息包括:当前有效数据的结束位置,也是下一个对象插入的起始位置、数据变更标记:指示自从载入或上次转储后,页面上的数据是否发生了变化;其中,每个分页上可存放若干数据对象,随着对象的添加,页空间可能用尽,此时需要分配新的页、对分区中存放的数据对象,采用“分区号-页号-偏移”三级寻址方式,对象的地址可当作对象的唯一标识(即对象ID)、以及由上述两点,决定了数据库在存储上是单调递增的,不支持存储空间的回收。
c)全局字符串表:数据库预定义了若干个分区,用于存放可重复使用的字符串,存取字符串时,会先计算字符串的哈希值,然后根据哈希值确定字符串隶属的分区号,进而在分区的页里查找目标字符串(相当于一个哈希表);d)全局索引表:数据库预定义了若干分区,用于存储对象的索引,每个索引项包含一个键值和对象地址(即对象ID);e)持久化处理,在系统的启动阶段,将各分区、各页的数据从一个磁盘文件装载到内存,在系统关闭时,预定的定时器到期时或者用户层明确地发出请求时,将各分区、各页的数据从内存转储到一个磁盘文件,在转储的过程中,可以对数据进行压缩/解压缩、加密/解密等编码处理。
在本公开实施例中,逻辑层实现支持对象的存取:对象包含一个固定的头部,用于存放对象的多个固有属性,固有属性包括但不限于对象标识、对象名称、对象标志、对象索引、容器对象标识、基类对象标识、派生对象标识中的一种或者多种;对象的结构中,还包含一个由对象的类架构指定的固定大小的属性数组,用于存放对象的特有属性。
其中,对象标识为对象在物理层的数据标识,对对象标识计算转换成对象在物理层内存中的对象指针、对象名称的数据类型是一个变长的字符串、对象索引对于特定类别的对象,存放对象的路径索引,以便根据路径索引查找所述对象、容器对象标识用于指示对象的容器对象、基类对象标识和派生类对象标识,用于指示两个对象间的继承关系;逻辑层支持对象的新建,包括在物理层的指定分区中插入一个新对象的数据,以及设置新对象的固有属性和特有属性;逻辑层支持对象的修改,包括根据对象标识,获取对象指针,以及更新一个或多个对象的固有属性和特有属性;逻辑层支持所述对象的删除,其中,根据数据库的单调增长特性,采用设置对象标志来实现对象的删除。
具体地,a)对象类(相当于常用数据库中的“表”),对于每个对象类,有一个整数类型的对象类标识、任意的对象类都有若干固定的属性,包括但不限于:对象标识:用于唯一标识一个对象,也用于寻址、名称:引用全局的字符串库、容器对象标识:可选的,对于文件、目录对象,其容器对象为目录;对于注册表键和值,其容器为注册表键、基类对象标识和派生类对象标识:用于维护对象的继承关系,每个对象类定义有若干开发者自定义的属性,由于每个属性占用固定的存储空间(比如8字节),由此一个类的每个对象都占用相同大小的存储空间,每个对象类都有一个独占的存储分区,分区号即对象类标识号。
在本公开实施例中,属性架构,定义数据库的全部属性:属性架构至少包括但不限于属性的数据类型、属性标识、属性名称、内存类型、属性重用标记、属性转义数据和属性转义函数;其中,属性的数据类型,按属性的存储方式分为直接存储类型和间接存储类型。
其中,直接存储类型的属性的数据占用的空间不超过预设数量字节,用于存储包括但不限于布尔值、整数值、枚举、掩码、对象标识、网际互连协议地址中的一种或者多种,在对象的结构中,直接访问;间接存储类型的属性的数据占用的空间可超过所述预设数量字节,在物理层使用特定的分区存放,在对象的结构中,使用属性数据标识存放存储,在访问时,由属性数据标识获取对应的数据指针在程序中使用;属性重用标记,指明属性的数据是否可被重复的使用、属性转义数据,用于将指定的枚举值或掩码转换成对应的字符串,或将指定的字符串转换成枚举值或掩码、属性转义函数,用于将特定类型的数据转换成字符串,或将指定的字符串转换成特定类型的数据。
具体地,对属性的定义包含以下元素:属性标识:整数、名称:字符串、属性重用标志:指定属性的数据是否可重用的、转义数据(可选的),用于辅助将特定类型的属性的数据转换成字符串,例如对枚举和掩码,转义数据是特定结构的数组和转义函数(可选的),用于将特殊类型的数据转换成字符串。
在本公开实施例中,间接存储类型,包括:定长间接存储,用于存放固定长度的数据;变长间接存储,用于存放非固定长度的数据,包括但不限于带有长度标记的字符串、带有结束标记的字符串或带有长度标记的二进制数据中的一种或者多种。
具体地,按属性对应的数据类型,有以下分类定义,直接存储:存放最多预设数量比如8字节的定长数据,包括整数、枚举、掩码、对象标识、版本号以及其它的自定义类型;间接存储:属性的数据存储在一个分区里,分区号即属性标识,数据按对象标识寻址,定长指的是每个属性的数据占用固定的大小,包括GUID、IPv6地址以及其它自定义的定长数据结构;变长指的是每个属性占用不固定的大小,存储到页时,数据需要符加一个长度标识或者结束标识,用于存放字符串、二进制数据等。
在本公开实施例中,对象间的关系包括派生类的对象继承基类对象的全部属性、一个对象的属性指向另一个对象。
具体地,对象间的关系包括继承和聚合,其中,继承指的是派生类的对象会继承基类对象的全部属性(例如,文档继承自文件);聚合指的是一个对象的属性可以指向另一个对象(例如,一个对象的创建者属性可能指向另一个对象)。
在本公开实施例中,物理层支持持久化存储:持久化存储,支持在数据库运行期间,根据设置的定时器或用户层的指令,将全部分区、所述分页的数据从内存中转储到磁盘文件或其它存储介质;持久化存储,支持在数据库关闭时,将全部分区、分页的数据从内存中转储到磁盘文件或其它存储介质;持久化存储,支持在数据库启动时,将全部分区、分页的数据从磁盘文件或其它存储介质载入到内存;其中,在转储过程中,对数据进行相应的压缩、加密处理的编码处理、以及在载入过程中,对数据进行转储过程对应的解密、解压缩的解码处理。
在本公开实施例中,如图2所示,接口层100包括:直接访问接口101和结构化查询接口102,逻辑层200用于对象存取,物理层300包括对象存储分区和属性存储分区。
直接访问接口101,用于根据对象标识,返回对象的全部属性信息;直接访问接口101,还用于插入对象、修改对象和删除对象;结构化查询接口102,用于根据结构化的查询命令,返回满足特定条件的对象的集合,对于每一个返回的对象所包含的属性信息由查询指令指定。
具体地,直接查询为根据对象标识,返回对象的全部属性信息,结构化查询为根据给定的查询命令,返回对象的集合,查询命令可包含以下组成:选择(SELECT字段FROM对象类型)、条件表达式(WHERE表达式)和排序(Order by属性)。
在本公开实施例中,从接口的暴露方式,接口层100包括:内核层访问接口和用户层访问接口;内核层访问接口采用内核层的函数指针公布,外部模块通过输入输出请求获取一组用于访问对象的接口函数,根据接口函数访问数据库;用户层访问接口为用户层通过特定的输入输出请求进行操作,其中,输入输出请求所输入和输出的数据为二进制或文本格式。
具体地,内核层访问接口:采用内核层的函数指针公布,外部模块通过特定的输入输出请求获取一组用于查询对象、插入对象的接口函数。用户层访问接口:用户层通过特定的输入输出请求进行查询、插入、修改,输入输出请求所输入和输出的数据支持以下两种形式:二进制的:数据是按特定的数据结构组织、封装。文本格式的:数据以XML或JSON格式组织,在内核层会对数据进行一定的转义处理(二进制-字符串)。
在本公开实施例中,在数据库第一次启动时,物理层300会进行如下的初始化处理:分配全局索引表的分区,其中,分区个数为哈希表的桶数,对于每一个分区,使用预设的页大小、指定非分页的内存类型进行分区初始化;遍历属性架构定义集合,对于每一个数据类型为间接存储的属性分配一个存储分区和根据属性架构指定的数据类型计算出页大小,并根据页大小和内存类型对分区进行初始化,将分区关联到属性架构上;遍历类架构定义集合,对于每一个类定义分配一个存储分区,根据类架构的属性数计算出页大小,并根据计算出的页大小和类架构指定的内存类型对分区进行初始化,将分区关联到类架构上。
具体地,装载数据库架构定义,此架构定义可以签入在程序代码的内部,也可以存储于外部(磁盘文件或Windows注册表),其数据包含以下两部分内容:a)属性架构定义集合,定义了数据库所有已定义的属性,对于每一个已定义的属性,包含的信息有属性标识、名称、数据类型、数据内存分配类型、转义参数类、属性的存储分区等成员等(参见前面的架构描述);b)类架构定义集合,定义了数据库中所有已定义的对象类,对于每一个已定义的对象,包含对象类标识、对象内存分配类型、对象的属性数、对象的属性定义集合、类的存储分区等成员(参见前面的架构描述)。
具体地,从特定的外部存储位置读取已转储过的数据库存储文件。数据库存储文件,可以是多个文件,也可以是一个内部结构化的文件,具体的组织形式不限,可以根据需要采用压缩、加密等技术,为了简化后续流程的描述,使用读出、写入分别代指对数据库存储文件的解码和编码,并且隐含了定位等计算。
在本公开实施例中,持久化存储,在物理层300还执行如下步骤:以写权限打开数据库存储文件,如果文件不存在则新建数据库存储文件;遍历类架构定义集合,将每一个类的分区的数据结构及全部的分页数据转储到文件;遍历属性架构定义集合,对于每一个数据类型为间接存储的属性对应的分区的数据结构及全部的分页数据转储到文件;
对于全局索引表的每个分区的数据结构及全部的分页数据转储到文件。
具体地,如果数据库存储文件不存在,进行如下的数据库的初始化:a)分配全局字符串表的分区,分区个数即哈希表的桶数,对于每一个存储分区,使用预设的页大小、指定非分页的内存类型进行分区初始化,分区初始化,主要包含以下过程(下同,不再重复):1)分配第一个页所需要的内存,其大小和内存类型是指定的;2)如果分配失败,抛出系统异常(结束所有的处理);3)将页内存全部设置为0;4)将页偏移设置为1;5)将页的数据变更标记设置为1。
具体地,b)分配全局索引表的分区,分区个数即哈希表的桶数,对于每一个存储分区,使用预设的页大小、指定非分页的内存类型进行分区初始化。c)遍历属性架构定义集合,对于每一个数据类型为间接存储的属性:1)分配一个存储分区;2)根据属性架构指定的数据类型计算出页大小;3)用上一步中计算出的页大小和内存类型等信息对分区进行初始化;4)将分区关联到属性架构上。d)遍历类架构定义集合,对于每一个类定义:1)分配一个存储分区;2)根据类架构的属性数计算出页大小;3)用上一步中计算出的页大小和类架构指定的内存类型等信息对分区进行初始化;4)将分区关联到类架构上。
在本公开实施例中,在数据库启动时,物理层300会进行如下的装载处理:读取数据库存储文件的过程中校验数据库文件的完整性,如果校验失败,则终止装载处理,重新进行初始化处理;如果校验成功,则按哈希表的桶数分配全局索引表的分区,并从文件读取每个分区的数据;遍历属性架构定义集合,对于每一个数据类型为间接存储的属性,分配一个存储分区、从文件中加载分区数据和将分区关联到属性架构上;遍历类架构定义集合,对于每一个类定义分配一个存储分区、从文件中加载分区数据和将分区关联到类架构上。
具体地,如果数据库存储文件存在,进行如下的数据库装载处理:a)校验数据库文件的完整性,如果校验失败,抛出异常。b)从文件读出全局字符串表的每个分区的基本信息,逐一加载分区数据,所述的加载分区数据,包括以下处理(下同,不再赘述):1)从文件读出分区的基本信息,包括页数、页大小、内存分配类型等;2)分配指定数量的页,从文件中读出每一个页的数据到新分配的内存;3)对于最后一个页,从文件中读出页偏移,并将数据变更标记设置为0。c)从文件读出全局索引表的每个分区的基本信息,逐一加载分区数据。d)遍历属性架构定义集合,对于每一个数据类型为间接存储的属性:1)分配一个存储分区;2)从文件中加载分区数据;3)将分区关联到属性架构上。e)遍历类架构定义集合,对于每一个类定义:1)分配一个存储分区;2)从文件中加载分区数据;3)将分区关联到类架构上。
具体地,完成数据库的初始化或装载后,创建一个周期触发的定时器,在定时器到期时,对数据库进行转储。数据库转储,包含以下过程:a)以写权限打开数据库存储文件,如果文件不存在则新建。b)遍历类架构定义,对于每一个类,将其分区转储到文件,分区转储,包含以下动作(下同,不再赘述):1)对分区进行读锁定操作,以阻塞转储期间并发的写入操作;2)将分区基本信息写入文件;3)遍历分区的页,对于数据发生变化的页(数据变更标记为1的),将页数据写入到文件,将页的数据变更标记复位为0;4)解除分区的读锁定。c)遍历属性架构定义,对于每一个数据类型为间接存储的属性,将其分区转储到文件。d)将全局索引表的每个分区转储到文件。e)将全局字符串表的每个分区转储到文件。
在本公开实施例中,在物理层的分区追加一个新页包括以下步骤:按分区指定的页大小和内存类型分配一个新页,并将页数据初始化为0和将页偏移设置为1;对分区进行写锁定操作,并将新页加到分区;将分区的当前页号加1,并解除分区的写锁定。
在本公开实施例中,在物理层300的分区中查找一个数据包括以下步骤:从分区的最后一页开始到第一页为止,遍历页,并在页中采用二进制搜索,查找数据,如果找到了,根据页号和偏移构造数据标识返回。
在本公开实施例中,在物理层的分区追加一个变长数据包括以下步骤:判断分区的当前页的剩余空间是否满足待追加的数据,如果不满足,则向分区追加一个新页,将数据复制到当前页的尾部,将当前页的偏移增加指定的数据长度,并返回数据标识和数据指针。
具体地,a)判断分区的当前页(即尾页)的剩余空间是否足以容纳待追加的数据,如果不足以容纳,按前述向分区追加一个新页方式向分区追加一个新页。b)将数据复制到当前页的尾部,将当前页的偏移增加指定的数据长度。c)返回数据标识(即分区号-页号-数据偏移)和数据指针。
在本公开实施例中,在物理层300的分区追加一个定长数据包括以下步骤:将分区号、分区的当前页号、当前页的偏移量记录成新数据标识,并记录对应的数据指针,并将当前页的偏移量加1,在页空间已耗尽的情况下,向分区追加一个新页,返回新数据标识和对应的数据指针。
具体地,在分区中新分配一个定长数据的过程:a)将分区号、分区的当前页号、当前页的偏移量记录成新数据的标识,并记录对应的数据指针。b)将当前页的偏移量加1。c)页空间已耗尽,按前述向分区追加一个新页向分区追加一个新页。d)返回步骤a)中记录的数据标识和数据指针。
在本公开实施例中,根据数据标识返回数据指针:根据数据标识中的页号获取页内存的地址,加上偏移量,直接返回指针即可。
在本公开实施例中,在物理层300中插入一个全局字符串包括以下步骤:计算字符串的哈希值,根据哈希值计算出分区号,并依次在分区号对应的分区的页里查找字符串,如果找到了,则返回逻辑层字符串标识;如果没有找到,则判断最后一页是否有足够的空间容纳字符串,如果没有,则向分区追加一个新页,并将字符串符加到当前页的尾部,增加当前页的偏移,并返回逻辑层字符串标识;其中,在逻辑层将字符串标识设置为对象名称。
具体地,a)先计算出字符串的哈希值(算法不限,最终得出一个整数),根据哈希值计算出分区号(例如:哈希值与分区数做模运算)。b)然后依次在分区的页里查找字符串,如果找到了,则返回字符串的ID(即分区号-页号-偏移)。c)如果没有找到,则判断最后一页是否有足够的空间容纳字符串,如果没有则按前述向分区追加一个新页方式向分区追加一个页。d)将字符串符加到当前页的尾部,增加当前页的偏移(字符串的长度,包含起止符号的长度)。e)返回字符串标识(分区号-页号-数据偏移)。
在本公开实施例中,根据字符串标识获取字符串指针:根据字符串标识中包含的分区号,按前述根据数据标识返回数据指针:根据数据标识中的页号获取页内存的地址,加上偏移量,返回的数据指针即字符串指针。
在本公开实施例中,在逻辑层200中插入一个新对象包括以下步骤:获取参数为对象的类架构,根据类架构的定义,计算出存放一个对象所需要的内存空间大小;在类对象的分区中追加一个定长数据,返回的数据指针作为对象指针,并通过对象指针,将对象标识设置为数据标识。
具体地,插入一个新对象的方法:a)传入的参数是对象的类架构。b)根据类架构的定义,计算出存放一个对象所需要的内存空间大小(对象固定属性占用的空间+自定义的属性数*8)。c)按前述方式在类对象的分区中追加一个定长数据,返回的数据指针即对象的指针。d)通过对象指针,将对象ID设置为上一步返回的数据ID。
在本公开实施例中,在逻辑层设置间接存储类型的对象属性包括如下步骤:通过类架构的定义确定对应的属性架构定义;如果属性架构的数据重用标志被设置,则查找属性的数据,如果找到了,则将数据标识设置到对象属性数组对应的元素,结束处理;如果属性的数据类型是变长的,则追加传入的数据,将所述数据标识设置对象属性数组对应的元素,结束处理;如果属性的数据类型是定长的,则分配一个定长的数据,将传入的数据复制到返回的指针,并将返回的数据标识设置对象属性数组对应的元素,结束处理。
具体地,设置直接存储类型的对象属性的方法:通过对象指针,直接将数据复制到对象属性数组对应的元素即可。设置间接存储类型的对象属性的方法:a)通过类架构的定义,找出对应的属性架构定义。b)如果属性架构的数据重用标志被设置,则按前述在分区中查找一个数据方式查找属性的数据,如果找到了,则将数据ID设置到对象属性数组对应的元素,结束处理。c)如果属性的数据类型是变长的,按前述向分区追加一个变长数据方式追加传入的数据,将数据ID设置对象属性数组对应的元素,结束处理。d)如果属性的数据类型是定长的,按前述在类对象的分区中追加一个定长数据方式分配一个定长的数据,将传入的数据复制到返回的指针,并将返回的数据ID设置对象属性数组对应的元素,结束处理。
在本公开实施例中,在逻辑层通过对象指针获取对象属性包括如下步骤:获取参数包含有属性在类架构定义中的属性索引,如果属性的数据类型是直接访问的,则直接返回对象属性数组对应索引的元素数据;如果属性的数据类型是间接访问的,则取出对象属性数组对应索引的元素数据作为数据标识,在属性的存储分区中根据数据标识中的页号获取页内存的地址,加上偏移量作为数据指针返回。
具体地,a)传入的参数应该包含有属性在类架构定义中的索引(属性索引)。b)如果属性的数据类型是直接访问的,直接返回对象属性数组对应索引的元素数据。如果属性的数据类型是间接访问的,则取出对象属性数组对应索引的元素数据,将其视作数据ID,在属性的存储分区中,按前述根据数据标识返回数据指针:根据数据标识中的页号获取页内存的地址,加上偏移量,直接返回指针即可的方式返回数据指针。
在本公开实施例中,在逻辑层访问内聚对象属性包括如下步骤:获取参数包含有内聚对象的目标属性标识,其中,内聚对象属性存放的是一个对象标识,根据对象标识获取内聚对象的指针,如果指针无效,返回失败;获取内聚对象的类架构定义,根据目标属性标识获取内聚对象属性在内聚对象类中的属性索引;根据属性索引获取内聚对象指定属性的数据。
具体地,访问内聚对象属性的方法:a)传入的参数应该包含有内聚对象的目标属性标识。b)内聚对象属性存放的是一个对象ID(Identity document,标识),按照前述根据对象标识获取对象指针的方法:在对象的存储分区中返回的数据指针即对象指针的方式获取内聚对象的指针,如果指针无效,返回失败。c)获取内聚对象的类架构定义,按传入的目标属性标识,查找出该属性在内聚对象类中的属性索引。d)按上一步骤获取的属性索引,按照通过对象指针获取对象属性方式,返回内聚对象指定属性的数据。
在本公开实施例中,在逻辑层中按固有属性查找对象包括如下步骤:获取参数包含对象名称和/或容器对象标识;从分区的最后一个页开始,到第一个页为止,遍历页,在每一个页中,将页数据视作对象数组,比对每一个对象,如果对象名称指向的字符串与传入的参数匹配,并且容器对象标识相等,返回对象指针。
具体地,按固有属性查找对象的方法:a)传入的参数应该包含对象名称、容器对象ID(可选的)。b)在类关联分区中,搜索对象,1)从分区的最后一个页开始,到第一个页为止,遍历页;2)在每一个页中,将页数据视作对象数组,比对每一个对象,如果对象名称指向的字符串与传入的参数匹配,并且容器对象ID也相等,返回对象指针。
具体地,获取指定类的全部对象的方法:在类关联分区中,第一个页开始,页数据视作对象数组,将页内全部的对象指针加入到结果集。
在本公开实施例中,在逻辑层中按条件表达式筛选对象包括如下步骤:获取参数以二叉树形式组织的表达式树,从分区的第一个页开始遍历页,在每一个页中,将页数据视作对象数组,遍历对象;对于每一个对象作为输入,计算表达式树的值,如果为真,则将对象的指针加入到结果集。
具体地,a)传入的参数应该是以二叉树形式组织的表达式树,关于表达式树:1)非叶节点上存放的是运算符,可以包含:a)逻辑运算符:与、或、非;b)比较运算符:等于、不等于、大于、小于、大于等于、小于等于;c)其它自定义的运算符:正则表达式、二进制查找等。2)左叶节点上存放的是提取对象属性所需要的信息,在计算表达式时,根据这些信息提取出对象的属性值。3)右叶子节点存放的是常量值,其数据类型与运算符即左叶节点的类型相关。4)表达式经过计算,返回的是布尔值。
d)在类分区中,搜索对象,1)从分区的第一个页开始遍历页;2)
在每一个页中,将页数据视作对象数组,遍历对象;对于每一个对象,将其作为输入,计算表达式树的值,如果为真,则将对象的指针加入到结果集。
在本公开实施例中,在接口层中将对象序列化到缓冲区包括如下步骤:计算所需要的缓冲区大小,判断目标缓冲区的长度是否小于所述缓冲区大小,如果是,则返回失败;如果否,则将目标缓冲区的指针视作目标对象指针,将对象的固定属性和特有属性复制到目标对象;提取对象的名称,将名称字符串追加到目标缓冲区的尾部,将名称字符串在目标缓冲区的偏移量存储到目标对象的名称属性中;遍历对象的特有属性,对于间接存储属性,提取属性的数据追加到目标缓冲区的尾部,将属性数据在目标缓冲区的偏移量存储到目标对象的属性值里。
具体地,将对象序列化到缓冲区的方法:a)计算所需要的缓冲区大小:1)所需大小=对象固定属性占用的空间+自定义的属性数*8;2)根据字符串ID获取字符串指针,根据ID中包含的分区号,11.根据数据ID返回数据指针:根据数据ID中的页号获取页内存的地址,加上偏移量,直接返回指针即可的方式,返回的数据指针即字符串指针的方法,提取出对象的名称,计算其长度,将其累加到所需大小;3)遍历对象的特有属性,对于间接存储类型的属性,如果是定长的:所需大小加上属性数据的长度;如果是变长的:提取并计算属性数据的长度,将其累加到所需大小。b)判断目标缓冲区的长度是否小于上一步中计算出的所需大小,如果是,则返回失败。c)将目标缓冲区的指针视作目标对象指针。d)将对象的固定属性和特有属性复制目标对象。e)按前述根据字符串ID获取字符串指针,根据ID中包含的分区号,11.根据数据ID返回数据指针:根据数据ID中的页号获取页内存的地址,加上偏移量,直接返回指针即可的方式,提取对象的名称,将名称字符串追加到缓冲区的尾部,将名称字符串在目标缓冲区的偏移量存储到目标对象的名称属性中。f)遍历对象的特有属性,对于间接存储属性,提取属性的数据,将其追加到目标缓冲区的尾部;将属性数据在目标缓冲区的偏移量存储到目标对象的属性值里。
在本公开实施例中,在接口层中用户层直接查询对象包括如下步骤:从输入输出请求的输入缓冲区里提取出对象标识;根据对象标识获取对象指针,并将对象序列化到输入输出请求的输出缓冲区。
具体地,从IO请求的输入缓冲区里提取出对象ID,b)按前述方式根据对象ID获取对象指针,按前述方式将对象序列化到IO请求的输出缓冲区。
在本公开实施例中,在接口层中用户层插入对象包括如下步骤:将输入输出请求的输入缓冲区指针视作源对象指针,根据源对象的对象标识中的分区号,获取对象的类架构;根据类架构分配一个新对象,从所述输入缓冲区中获取对象名称的字符串,并设置新对象的名称;复制源对象的固有属性到新对象,包括容器对象标识和基类对象标识;根据类架构,遍历特有属性的架构;其中,对于直接存储类型的属性,直接复制源对象的属性数据到新对象,对于间接存储类型,将源对象属性中数据视作偏移量,从输入缓冲区中获取属性的数据,设置到新对象中;将新对象的对象标识写入到输入输出请求的输出缓冲区。
具体地,a)将IO请求的输入缓冲区指针视作源对象指针。b)根据源对象的对象ID中的分区号,获取对象的类架构。c)按照插入一个新对象的方式,根据上一步中获取的类架构分配一个新对象。d)源对象的名称存放的是一个名称偏移量,由此可从输入缓冲区中获取对象名称的字符串。e)通过对象指针,按前述方式插入全局字符串,将返回的ID设置新对象的名称。f)复制源对象的其它固有属性到新对象,如容器对象ID、基类对象ID。g)根据类架构,遍历特有属性的架构,对于直接存储类型的属性,直接复制源对象的属性数据到新对象;对于间接存储类型,将源对象属性中数据视作偏移量,由此可从输入缓冲区中获取属性的数据,按前述设置间接存储类型的对象属性方式,设置到新对象里。h)将新对象的对象ID写入到IO请求的输出缓冲区,返回。
在本公开实施例中,在接口层中用户层结构化查询包括如下步骤:从输入输出请求的输入缓冲区中,提取查询命令;对查询命令进行处理,提取对象类名称、属性列表、条件表达式和排序参数;在输出缓冲区中,根据解析出的属性列表,构造列头信息;其中,列头信息包括列数和每个列的名称和数据类型;查询对象集合,如果有条件表达式,用条件表达式树筛选出所有匹配的对象,如果没有条件表达式,在类关联分区中,第一个页开始,将页数据作为对象数组,将页内全部的对象指针加入到结果集,获取全部对象;如果有排序参数,则按排序参数将对象指针重新排序;遍历结果集,对于每一个对象,在所述输出缓冲区中追加一个记录行,每一行将按顺序包含属性列表中指定的属性值。
具体地,用户层结构化查询的处理流程:a)从IO请求的输入缓冲区中,提取出结构化查询命令。b)对查询命令进行处理,提取出:1)对象类名称(表名),由此可以找出类的架构;2)属性列表(字段);3)条件表达式,由此可以构造出表达式树;4)排序参数:包括排序所依据的属性,升序或降序。c)在输出缓冲区中,根据解析出的属性列表,构造列头信息,包括:1)共有多少个列;2)每个列的名称和数据类型。d)查询对象集合:1)如果有条件表达式:按按条件表达式筛选对象方式,用条件表达式树筛选出所有匹配的对象;2)如果没有对象表达式:在类关联分区中,第一个页开始,页数据视作对象数组,将页内全部的对象指针加入到结果集,获取全部对象。e)如果有排序参数,则按排序参数将对象指针重新排序。f)遍历结果集,对于每一个对象,在输出缓冲区中追加一个记录行,每一行将按顺序包含属性列表中指定的属性值,具体有:1)在行的头部,预留出4字节的空间,用于存放行数据长度,将行数据长度初始化为4;2)遍历输入的属性列表,对于每一个属性:按照通过对象指针获取对象属性方式,获取属性的数据;计算属性数据的长度;c)将属性数据的长度追加到行数据的尾部(存放长度占用2个字节);d)将属性数据追加到行数据的尾部;e)行数据长度=(属性数据长度+2);3)将行数据长度更新到行的头部。
由此,本公开提出的数据库,可以满足内核场景下,开发者对复杂对象的存储和查询需求。相对于内核层常用的硬编码数据或使用注册表存取键值对的方式,或者简单的移植签入型关系数据库,应用本发明提出的内核层数据库,具有以下优点:内存数据库,访问效率高、面向对象的:架构组织简洁且不失严整(对象-属性);支持继承;支持内聚、以及高效性,对象的ID即可标识对象的唯一性,又可以直接转换为内存指针、还可以直接访问,数据库中存储的对象可以当作C的结构指针直接访问,另外存储节约,支持字符串重用和属性数据重用。
综上所述,本公开的提出一种面向对象的内核层数据库的构建方法,数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,数据库的存取单元为对象和对象属性,数据库包括接口层,用于接收并处理对象的存取请求和结构化查询请求,逻辑层,用于实现对象的存取,包括新建对象、修改对象、删除对象及获取对象;其中,对对象的操作是基于对象标识,对象标识用于标识唯一对象且指明对象在物理层的存储位置,对对象标识计算转换为编程语言的对象指针,物理层,用于实现对象和对象属性的数据存取;其中,数据按分区、分页的形式分级存储,一个分区用于存储一类对象或对象属性,每个分区包括多个指定大小的分页,每个分页存储多个对象数据或属性数据,物理层,还用于存储全局索引表,全局索引表用于建立特定类型对象的路径索引,物理层,还用于实现对象数据和对象属性数据的持久化存储。由此,满足内核场景下,对复杂对象的存储和查询需求,提高访问效率。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (24)
1.一种面向对象的内核层数据库的构建方法,其特征在于,数据库在运行时,全部数据存储于内核层分配的内存上,数据库是面向对象的,是由一个架构定义统一描述的,所述数据库的存取单元为对象和对象属性,所述数据库包括:接口层、逻辑层和物理层;
所述接口层,用于接收并处理对象的存取请求和结构化查询请求;
所述逻辑层,用于实现对象的存取,包括新建对象、修改对象、删除对象及获取对象;其中,对对象的操作是基于对象标识,所述对象标识用于标识唯一对象且指明对象在所述物理层的存储位置,所述对象标识计算转换为编程语言的对象指针;
所述物理层,用于实现所述对象和所述对象属性的数据存取;其中,数据按分区、分页的形式分级存储,一个分区用于存储一类对象或对象属性,每个所述分区包括多个指定大小的分页,每个所述分页存储多个对象数据或属性数据;其中,所述分区是一个数据结构,至少包括分区号、内存类型、分页大小和分页集合,所述分页是一个数据结构包含一段按内存类型、分页大小分配的连续内存;
所述物理层,还用于存储全局索引表,所述全局索引表用于建立所述对象的路径索引;
所述物理层,还用于实现所述对象数据和所述对象属性数据的持久化存储;
其中,所述逻辑层实现对象的存取:
所述对象包含一个固定的头部,用于存放所述对象的多个固有属性,所述固有属性包括对象标识、对象名称、对象标志、对象索引、容器对象标识、基类对象标识、派生对象类标识中的一种或者多种;
所述对象的结构中,还包含一个由所述对象的类架构指定的固定大小的属性数组,用于存放所述对象的特有属性;其中,所述类架构指定一个对象类的基类以描述对象之间的继承关系,所述类架构还指定一个对象类的容器类以描述对象之间的包含关系;
其中,所述对象标识为所述对象在所述物理层的数据标识,对所述对象标识计算转换成所述对象在所述物理层内存中的对象指针,所述对象名称的数据类型是一个变长的字符串,所述对象索引对于特定类别的对象,存放所述对象的路径索引,以便根据所述路径索引查找所述对象,所述容器对象标识用于指示所述对象的容器对象,所述基类对象标识和所述派生类对象标识,用于指示两个对象间的继承关系;
所述逻辑层支持所述对象的新建,包括在所述物理层的指定分区中插入一个新对象的数据,以及设置新对象的固有属性和特有属性;
所述逻辑层支持所述对象的修改,包括根据所述对象标识,获取所述对象指针,以及更新一个或多个对象的固有属性和特有属性;
所述逻辑层支持所述对象的删除,其中,根据所述数据库的单调增长特性,采用设置对象标志来实现所述对象的删除。
2.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,所述数据库是面向对象的,是由一个架构定义统一描述的,包括:
所述架构定义为一个数据结构,描述所述数据库所包含的全部对象类定义、属性定义以及对象之间的关系;
所述架构定义包括属性架构,定义所述数据库的全部属性,包括属性的数据类型、内存类型和数据转换方法;
所述架构定义包括类架构,定义所述数据库全部的对象类,包括对象类在所述物理层的分区号、内存类型以及类的特有属性;
所述类架构为对象类定义数据类型的对象标识的特有属性,指向其它对象以描述对象之间的引用关系。
3.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,所述数据库在运行时,全部数据存储于内核层分配的内存上:
所述物理层存储的数据包括对象数据、属性数据、索引数据;
所述物理层在存储不同数据时,使用特定的分区;
其中,所述分区号为一个整数,用于标识一个分区;
所述内存类型,在操作系统内核层分为分页式的和非分页式的两类;其中,分页式的内存,用于仅存储低中断级访问的数据,非分页式的内存,用于存储在高中断级访问的对象;其中,所述低中断级是指操作系统中低于缺页中断的中断级别,在所述低中断级,允许进行内存换页操作,使用分页式的内存,所述高中断级是禁止换页操作的,仅使用非分页式的常驻内存;
所述分页大小,是指为一个分页所分配的连续内存的长度;
所述分页集合,至少包含一个分页;
所述分页还包括所述分页当前的页偏移;其中,所述页偏移,是一个整数,用于指定新数据在所述连续内存中的插入位置;
根据所述分区号、分页号、所述页偏移三个整数组成数据标识,用于定位和标识一个数据、以及通过对所述数据标识计算转换为数据在所述连续内存中的数据指针,所述数据指针在编程语言中使用;
其中,所述数据标识具有标识一个数据和数据寻址的双重含义,所述数据库在所述物理层上的存储为单调增长的;
对于所述物理层存放的对象数据的数据标识为对象标识,所述对象数据的数据指针为对象指针、对于所述物理层存放的属性数据的数据标识为属性数据标识,所述属性数据的数据指针为属性数据指针、对于所述物理层存放的索引数据的数据标识为索引标识,所述索引数据的数据指针为索引指针。
4.根据权利要求2所述的面向对象的内核层数据库的构建方法,其特征在于,所述属性架构,定义所述数据库的全部属性:
所述属性架构至少包括属性的数据类型、属性标识、属性名称、内存类型、属性重用标记、属性转义数据和属性转义函数;
其中,所述属性的数据类型,按属性的存储方式分为直接存储类型和间接存储类型;
所述直接存储类型的属性数据占用的空间不超过预设数量字节,用于存储包括布尔值、整数值、枚举、掩码、对象标识、网际互连协议地址中的一种或者多种,在对象的结构中,直接访问;所述间接存储类型的属性数据占用的空间能超过所述预设数量字节,在所述物理层使用特定的分区存放,在对象的结构中,使用属性数据标识存放存储,在访问时,由所述属性数据标识获取对应的数据指针在程序中使用;
所述属性重用标记,指明属性的数据是否被重复的使用,所述属性转义数据,用于将指定的枚举值或掩码转换成对应的字符串,或将指定的字符串转换成枚举值或掩码,所述属性转义函数,用于将指定类型的数据转换成字符串,或将指定的字符串转换成指定类型的数据。
5.根据权利要求4所述的面向对象的内核层数据库的构建方法,所述间接存储类型,包括:
定长间接存储,用于存放固定长度的数据;
变长间接存储,用于存放非固定长度的数据,包括带有长度标记的字符串、带有结束标记的字符串或带有长度标记的二进制数据中的一种或者多种。
6.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,所述物理层支持持久化存储:
所述持久化存储,支持在所述数据库运行期间,根据设置的定时器或用户层的指令,将全部所述分区、所述分页的数据从内存中转储到磁盘文件或其它存储介质;
所述持久化存储,支持在所述数据库关闭时,将全部所述分区、所述分页的数据从所述内存中转储到所述磁盘文件或其它存储介质;
所述持久化存储,支持在所述数据库启动时,将全部所述分区、所述分页的数据从所述磁盘文件或其它存储介质载入到所述内存;
其中,在转储过程中,对数据进行相应的压缩、加密的编码处理、以及在所述载入过程中,对数据进行所述转储过程对应的解密、解压缩的解码处理。
7.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,所述接口层包括直接访问接口和结构化查询接口:
所述直接访问接口,用于根据所述对象标识,返回对象的全部属性信息;
所述直接访问接口,还用于插入对象、修改对象和删除对象;
所述结构化查询接口,用于根据结构化的查询命令,返回满足特定条件的对象的集合,对于每一个返回的对象所包含的属性信息由查询指令指定。
8.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,从接口的暴露方式,所述接口层包括内核层访问接口和用户层访问接口;
所述内核层访问接口采用内核层的函数指针公布,外部模块通过输入输出请求获取一组用于访问对象的接口函数,根据所述接口函数访问所述数据库;
所述用户层访问接口为用户层提供所述输入输出请求的操作,其中,输入输出请求所输入和输出的数据为二进制或文本格式。
9.根据权利要求6所述的面向对象的内核层数据库的构建方法,其特征在于,在所述数据库第一次启动时,所述物理层会进行如下的初始化处理:
分配所述全局索引表的分区,其中,分区个数为哈希表的桶数,对于每一个分区,使用预设的页大小、指定非分页的内存类型进行分区初始化;
遍历属性架构定义的集合,对于每一个数据类型为间接存储的属性分配一个存储分区和根据属性架构指定的数据类型计算出页大小,并根据所述页大小和内存类型对分区进行初始化,将分区关联到所述属性架构上;
遍历类架构定义的集合,对于每一个类定义分配一个存储分区,根据类架构的属性数计算出页大小,并根据计算出的页大小和类架构指定的内存类型对分区进行初始化,将分区关联到所述类架构上。
10.根据权利要求6所述的面向对象的内核层数据库的构建方法,其特征在于,所述持久化存储,在所述物理层还执行如下步骤:
以写权限打开数据库存储文件,如果文件不存在则新建数据库存储文件;
遍历类架构定义的集合,将每一个类的分区的数据结构及全部的分页数据转储到文件;
遍历属性架构定义的集合,对于每一个数据类型为间接存储的属性对应的分区的数据结构及全部的分页数据转储到文件;
对于所述全局索引表的每个分区的数据结构及全部的分页数据转储到文件。
11.根据权利要求6所述的面向对象的内核层数据库的构建方法,其特征在于,在所述数据库启动时,所述物理层会进行如下的装载处理:
读取数据库存储文件的过程中校验数据库文件的完整性,如果校验失败,则终止装载处理,重新进行初始化处理;
如果校验成功,则按哈希表的桶数分配所述全局索引表的分区,并从文件读取每个分区的数据;
遍历属性架构定义的集合,对于每一个数据类型为间接存储的属性,分配一个存储分区、从文件中加载分区数据和将分区关联到所述属性架构上;
遍历类架构定义的集合,对于每一个类定义分配一个存储分区、从文件中加载分区数据和将分区关联到所述类架构上。
12.根据权利要求7所述的面向对象的内核层数据库的构建方法,其特征在于,在所述物理层的分区追加一个新页包括以下步骤:
按分区指定的页大小和内存类型分配一个新页,并将页数据初始化为0和将页偏移设置为1;
对所述分区进行写锁定操作,并将所述新页加到所述分区;
将所述分区的当前页号加1,并解除所述分区的写锁定。
13.根据权利要求6所述的面向对象的内核层数据库的构建方法,其特征在于,在所述物理层的分区中查找一个数据包括以下步骤:
从分区的最后一页开始到第一页为止,遍历页,并在页中采用二进制搜索,查找数据,如果找到了,根据页号和偏移构造数据标识返回。
14.根据权利要求12所述的面向对象的内核层数据库的构建方法,其特征在于,在所述物理层的分区追加一个变长数据包括以下步骤:
判断分区的当前页的剩余空间是否满足待追加的数据,如果不满足,则向所述分区追加一个新页,将数据复制到所述当前页的尾部,将所述当前页的偏移量增加指定的数据长度,并返回数据标识和数据指针;
在所述物理层的分区追加一个定长数据包括以下步骤:
将分区号、分区的当前页号、当前页的偏移量记录成新数据标识,并记录对应的数据指针,并将当前页的偏移量加1,在页空间已耗尽的情况下,向分区追加一个新页,返回所述新数据标识和对应的数据指针。
15.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层中插入一个新对象包括以下步骤:
获取参数为对象的类架构,根据类架构的定义,计算出存放一个对象所需要的内存空间大小;
在类对象的分区中追加一个定长数据,返回的数据指针作为对象指针,并通过所述对象指针,将对象标识设置为数据标识。
16.根据权利要求1或4所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层设置间接存储类型的对象属性包括如下步骤:
通过类架构的定义确定对应的属性架构定义;
如果属性架构的数据重用标志被设置,则查找属性的数据,如果找到了,则将数据标识设置到对象属性数组对应的元素,结束处理;
如果属性的数据类型是变长的,则追加传入的数据,将所述数据标识设置对象属性数组对应的元素,结束处理;
如果属性的数据类型是定长的,则分配一个定长的数据,将传入的数据复制到返回的指针,并将返回的数据标识设置对象属性数组对应的元素,结束处理。
17.根据权利要求1或4所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层通过对象指针获取对象属性包括如下步骤:
获取参数包含有属性在类架构定义中的属性索引,如果属性的数据类型是直接访问的,则直接返回对象属性数组对应索引的元素数据;
如果属性的数据类型是间接访问的,则取出对象属性数组对应索引的元素数据作为数据标识,在属性的存储分区中根据所述数据标识中的页号获取页内存的地址,加上偏移量作为数据指针返回。
18.根据权利要求1或4所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层访问内聚对象属性包括如下步骤:
获取参数包含有内聚对象的目标属性标识,其中,内聚对象属性存放的是一个对象标识,根据所述对象标识获取内聚对象的指针,如果指针无效,返回失败;
获取所述内聚对象的类架构定义,根据目标属性标识获取所述内聚对象属性在内聚对象类中的属性索引;
根据所述属性索引获取内聚对象指定属性的数据。
19.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层中按固有属性查找对象包括如下步骤:
获取参数包含对象名称和/或容器对象标识;
从分区的最后一个页开始,到第一个页为止,遍历页,在每一个页中,将页数据视作对象数组,比对每一个对象,如果对象名称指向的字符串与传入的参数匹配,并且所述容器对象标识相等,返回对象指针。
20.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述逻辑层中按条件表达式筛选对象包括如下步骤:
获取参数以二叉树形式组织的表达式树,从分区的第一个页开始遍历页,在每一个页中,将页数据视作对象数组,遍历对象;
对于每一个对象作为输入,计算表达式树的值,如果为真,则将对象的指针加入到结果集。
21.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述接口层中将对象序列化到缓冲区包括如下步骤:
计算所需要的缓冲区大小,判断目标缓冲区的长度是否小于所述缓冲区大小,如果是,则返回失败;
如果否,则将所述目标缓冲区的指针视作目标对象指针,将对象的固定属性和特有属性复制到目标对象;
提取对象的名称,将名称字符串追加到所述目标缓冲区的尾部,将名称字符串在所述目标缓冲区的偏移量存储到目标对象的名称属性中;
遍历对象的特有属性,对于间接存储属性,提取属性的数据追加到所述目标缓冲区的尾部,将属性数据在所述目标缓冲区的偏移量存储到目标对象的属性值里。
22.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述接口层中用户层直接查询对象包括如下步骤:
从输入输出请求的输入缓冲区里提取出对象标识;
根据所述对象标识获取对象指针,并将对象序列化到所述输入输出请求的输出缓冲区。
23.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述接口层中用户层插入对象包括如下步骤:
将输入输出请求的输入缓冲区指针视作源对象指针,根据源对象的对象标识中的分区号,获取对象的类架构;
根据所述类架构分配一个新对象,从所述输入缓冲区中获取对象名称的字符串,并设置新对象的名称;
复制源对象的固有属性到所述新对象,包括容器对象标识和基类对象标识;
根据所述类架构,遍历特有属性的架构;其中,对于直接存储类型的属性,直接复制源对象的属性数据到新对象,对于间接存储类型,将源对象属性中数据视作偏移量,从所述输入缓冲区中获取属性的数据,设置到所述新对象中;
将所述新对象的对象标识写入到所述输入输出请求的输出缓冲区。
24.根据权利要求1所述的面向对象的内核层数据库的构建方法,其特征在于,在所述接口层中用户层结构化查询包括如下步骤:
从输入输出请求的输入缓冲区中,提取查询命令;
对所述查询命令进行处理,提取对象类名称、属性列表、条件表达式和排序参数;
在输出缓冲区中,根据解析出的属性列表,构造列头信息;其中,所述列头信息包括列数和每个列的名称和数据类型;
查询对象集合,如果有条件表达式,用条件表达式筛选出所有匹配的对象,如果没有条件表达式,在类关联分区中,第一个页开始,将页数据作为对象数组,将页内全部的对象指针加入到结果集,获取全部对象;
如果有排序参数,则按所述排序参数将对象指针重新排序;
遍历结果集,对于每一个对象,在所述输出缓冲区中追加一个记录行,每一行将按顺序包含属性列表中指定的属性值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110733656.4A CN113342908B (zh) | 2021-06-30 | 2021-06-30 | 一种面向对象的内核层数据库的构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110733656.4A CN113342908B (zh) | 2021-06-30 | 2021-06-30 | 一种面向对象的内核层数据库的构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113342908A CN113342908A (zh) | 2021-09-03 |
CN113342908B true CN113342908B (zh) | 2022-03-11 |
Family
ID=77481639
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110733656.4A Active CN113342908B (zh) | 2021-06-30 | 2021-06-30 | 一种面向对象的内核层数据库的构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113342908B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113569508B (zh) | 2021-09-18 | 2021-12-10 | 芯行纪科技有限公司 | 基于id进行数据索引与访问的数据库模型构建方法及设备 |
CN113986145B (zh) * | 2021-12-23 | 2022-04-01 | 南京集成电路设计服务产业创新中心有限公司 | 一种适用于大规模集成电路后端设计的内存管理方法 |
CN114900363B (zh) * | 2022-05-18 | 2024-05-14 | 杭州安恒信息技术股份有限公司 | 一种恶意网站识别方法、装置、电子设备及存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1999024919A1 (en) * | 1997-11-07 | 1999-05-20 | Crosskeys Systems Corporation | Database building system |
CN1996308A (zh) * | 2006-12-30 | 2007-07-11 | 陈�峰 | 面向对象标识方法 |
CN101216844A (zh) * | 2008-01-03 | 2008-07-09 | 彭智勇 | 数据库跨类查询方法 |
US7448049B1 (en) * | 2002-10-18 | 2008-11-04 | Crossroads Systems, Inc. | System and method of supporting kernel functionality |
CN102567659A (zh) * | 2010-12-28 | 2012-07-11 | 河南省躬行信息科技有限公司 | 基于双驱动联动的文件安全主动防护方法 |
CN107708084A (zh) * | 2017-09-30 | 2018-02-16 | 广东欧珀移动通信有限公司 | 数据处理方法和装置、计算机设备、计算机可读存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6480860B1 (en) * | 1999-02-11 | 2002-11-12 | International Business Machines Corporation | Tagged markup language interface with document type definition to access data in object oriented database |
US7434229B2 (en) * | 2002-07-31 | 2008-10-07 | Genesys Telecommunications Laboratories, Inc. | Method for improving temporal consistency and snapshot recency in a monitored real-time software-reporting-application architecture |
US9311381B2 (en) * | 2013-12-30 | 2016-04-12 | Bmc Software Inc. | Lifecycle reference partitioning for database objects |
-
2021
- 2021-06-30 CN CN202110733656.4A patent/CN113342908B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO1999024919A1 (en) * | 1997-11-07 | 1999-05-20 | Crosskeys Systems Corporation | Database building system |
US7448049B1 (en) * | 2002-10-18 | 2008-11-04 | Crossroads Systems, Inc. | System and method of supporting kernel functionality |
CN1996308A (zh) * | 2006-12-30 | 2007-07-11 | 陈�峰 | 面向对象标识方法 |
CN101216844A (zh) * | 2008-01-03 | 2008-07-09 | 彭智勇 | 数据库跨类查询方法 |
CN102567659A (zh) * | 2010-12-28 | 2012-07-11 | 河南省躬行信息科技有限公司 | 基于双驱动联动的文件安全主动防护方法 |
CN107708084A (zh) * | 2017-09-30 | 2018-02-16 | 广东欧珀移动通信有限公司 | 数据处理方法和装置、计算机设备、计算机可读存储介质 |
Non-Patent Citations (1)
Title |
---|
输配电地理信息系统平台图形浏览服务的实现;李飞 等;《电力系统自动化》;20170610;第99页左栏第1段-第103页右栏第2段 * |
Also Published As
Publication number | Publication date |
---|---|
CN113342908A (zh) | 2021-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113342908B (zh) | 一种面向对象的内核层数据库的构建方法 | |
US11625501B2 (en) | Masking sensitive information in records of filtered accesses to unstructured data | |
US9575976B2 (en) | Methods and apparatuses to optimize updates in a file system based on birth time | |
US9830341B2 (en) | Resource name generation and derivation utilizing attribute space monikers and their associated context | |
US7849112B2 (en) | Using a file handle for associating the file with a tree quota in a file server | |
US5454101A (en) | Data storage system with set lists which contain elements associated with parents for defining a logical hierarchy and general record pointers identifying specific data sets | |
US9043334B2 (en) | Method and system for accessing files on a storage system | |
US7509338B1 (en) | Compact garbage collection tables | |
US20040015516A1 (en) | Object graph faulting and trimming in an object-relational database system | |
US10650032B1 (en) | Filtering pipeline optimizations for unstructured data | |
CN106599111B (zh) | 一种数据管理方法及存储系统 | |
US10664508B1 (en) | Server-side filtering of unstructured data items at object storage services | |
CN106406748A (zh) | 存储器中心数据库架构 | |
CN115712500A (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
CN100527131C (zh) | 一种ims数据库互动式访问方法和工具 | |
CN112835638A (zh) | 一种基于嵌入式应用程序的配置信息管理方法及装置 | |
CN115756838A (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
US20140189715A1 (en) | Conversion of lightweight object to a heavyweight object | |
CN115495462A (zh) | 批量数据更新方法、装置、电子设备和可读存储介质 | |
US20140059080A1 (en) | System for lightweight objects | |
CN114328500A (zh) | 一种数据访问方法、装置、设备及计算机可读存储介质 | |
US11803313B2 (en) | Method of constructing a file system based on a hierarchy of nodes | |
McAuliffe | Storage management methods for object database systems | |
JPH09305449A (ja) | データベース管理システム | |
Onodera | Enhanced RAM Simulation in Succinct Space |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |