声明语句
声明语句用于指定三种不同的实体:数据库名称、用户定义的“对象标识符”或 oid 以及自动对象标识符或 auto_oid:
declare database dbname;
declare oid structname [expected-number-of-entries];
declare auto_oid[expected-number-of-entries];
数据库声明
所有模式定义都必须包含一个数据库声明,以指定数据库的名称。DDL 编译器会根据传递给 declare 语句的 dbname 创建实现文件名。例如以下声明, DDL 编译器将生成 simpledb.h 和 simpledb.c 这两个文件。
declare database simpledb;
oid 声明
声明语句还用于标识具有将与 oid一起存储的预期对象数量的唯一对象标识符。运行时使用预期条目数量来计算索引的初始哈希表大小。一旦声明了 oid 结构,就可以声明具有此唯一标识符的类。运行时维护一个内部索引,引用此类的所有对象。对象可以使用 ref 数据类型通过 oid 相互引用。oid 是用户定义的结构,即使 oid 只有一个字段。对于整个数据库,每个oid 值都必须是唯一的。
在一个数据库模式中只允许一个数据库和一个 oid 声明。
示例:
struct Id {
uint4 id;
uint4 time_in;
};
declare database market;
declare oid Id[20000];
表示 oid 的结构体存在一个限制,即其元素必须是固定大小的。
例如,以下代码是非法的,并且会生成编译错误:
struct StrId {
string str;
int2 num;
};
declare oid StrId[20000];
但以下这个定义完全没问题:
struct StrId {
char<32> str;
int2 num;
};
declare oid StrId[20000];
auto_oid 声明
对于高可用性数据库,auto_oid 声明是必需的,并且对于可能参与二进制模式演进(BSE)的数据库来说,它也可能很有用。与 oid 一样,auto_oid 声明指定了数据库中预期的对象数量:T
declare auto_oid[10000];
然而,如果 oid 是用户定义的结构,并且必须由应用程序显式插入或更新,那么 auto_oid 是由运行时生成的 8 字节唯一标识符,在创建数据库对象时会自动插入。此 auto_oid 是运行时在 BSE 加载操作期间使用的全局对象标识符,并在 SmartEDB 高可用性应用程序中执行同步。(请注意,auto_oid 的内部格式未公布,并且没有直接创建或修改 auto_oid 的接口函数。)
注意:在 oid 和 auto_oid 声明中指定的“预期对象数量”不必精确。此估计值仅初始化与它们相关联的内部哈希索引所使用的哈希表,如果需要,运行时会自动增加此表的大小。
列表声明
每个列表声明都会创建一个额外的动态结构,其消耗的资源类似于树索引所占用的资源。当以下情况时,列表声明是有用的:
必须按顺序访问类的对象。
应用程序不要求访问对象的任何特定顺序。
该类没有合适的索引。