postgres.h又包含了三个头文件:
c.h:一些简单类型的定义,其中包括很多typedef和一些简单的struct。
utils/elog.h:一些错误报告和日志的定义。
utils/palloc.h:定义了postgresql内存分配的基本接口。
结构 varatt_external的定义:
struct varatt_external
{
int32 va_rawsize; /* 数据的实际大小 */
int32 va_extsize; /* 实际存储的大小 */
Oid va_valueid; /* TOAST表中该数据的唯一标识ID */
Oid va_toastrelid; /* 包含该数据的TOAST表的RelID */
}
这个结构用来提取那些被压缩了的数据。由于postgresql允许存储用户自定义的对象,当这个对象的数据量太大时,为了便于存储,需要对数据进行压缩。压缩后的数据就可以利用这个结构进行提取。
typedef union
{
struct /* Normal varlena (4-byte length) */
{
uint32 va_header;
char va_data[1];
} va_4byte;
struct /* Compressed-in-line format */
{
uint32 va_header;
uint32 va_rawsize; /* Original data size (excludes header) */
char va_data[1]; /* Compressed data */
} va_compressed;
} varattrib_4b;
这个联合表示varlena数据的头部信息。varlena是一个定义在c.h中的结构,它的功能和varatt_external结构的功能有点类似,不同的地方在于varlena可以被客户端和一些特殊的类型使用,而varatt_external只能用于服务器端。
阅读代码的同学如果发现以上的分析有错误,请及时告知。