一、插件的基本组成
在 He3DB 中,插件(或称扩展)是一种可扩展的机制,允许用户增加数据库的功能。每个插件的基本组成部分如下:
(1)控制文件(.control 文件):
位置:通常位于 $PGSHARE/extension/ 目录中。
内容:控制文件定义了插件的元数据,包括名称、默认版本、兼容版本、SQL 脚本路径等。它的结构是键值对格式,常见字段包括:
name:插件名称。
default_version:默认版本号。
comment:描述信息。
relocatable:是否可以重新定位,即插件是否可以安装到不同的 schema 中。
requires:插件依赖的其他插件列表。
module_pathname:共享库文件的路径。
schema:安装插件时默认的 schema。
(2)SQL 脚本文件:
位置:通常位于 $PGSHARE/extension/ 目录中,文件名通常为 extension–version.sql 。
内容:SQL 脚本文件定义了插件在数据库中的对象,例如函数、视图、数据类型、操作符等。这些 SQL 脚本在安装插件时会被执行。
(3)源码文件(.c).c 文件包含扩展的实现代码,通常用 C 或 C++ 编写。它定义了扩展中的函数、操作符等。
(4)Makefile 文件Makefile 文件用于定义如何编译和链接扩展。它通常包括编译选项、目标文件和链接规则。
二、CREATE EXTENSION 命令的执行流程
CREATE EXTENSION 命令用于安装和初始化插件。以下是该命令的详细执行流程:
-
语法解析与检查:He3DB 解析 CREATE EXTENSION 命令,检查插件名称、版本和选项是否合法。如果指定了 SCHEMA选项,系统会验证该 schema 是否存在。
-
检查插件是否已存在:系统查询 pg_extension 表,检查插件是否已安装。如果插件已存在,系统将返回一个错误(除非使用 IF NOT EXISTS 选项)。
-
读取控制文件:在 pg_available_extensions 目录中搜索与插件名称匹配的 .control
文件,并读取其中定义的元数据。系统检查 default_version字段以确定要安装的插件版本。如果用户未指定版本,系统使用默认版本。 -
检查依赖关系:根据控制文件中的 requires 字段,系统检查所有依赖插件是否已经安装。如果依赖的插件未安装,系统将返回一个错误。系统还会检查插件是否可以重新定位(relocatable),如果插件不可重新定位但指定了 SCHEMA 选项,则会返回错误。
-
加载共享库:如果插件需要共享库(即 .so 文件), 会通过 module_pathname 加载该库。 加载时,系统会调用共享库中的_PG_init() 函数(如果存在)进行初始化。
-
执行 SQL 脚本: 执行与插件版本对应的 SQL 脚本文件,以创建和初始化插件的数据库对象。 这些脚本文件可以包含任何有效的 SQL语句,如创建函数、数据类型、视图等。
-
记录插件信