postgres.h文件分析(原创,持续更新)
postgres.h是postgresql数据库服务器端各个主要模块代码都会包含的一个头文件。这个头文件中包含了服务器端广泛使用的变量的声明,因此,首先分析这个文件对阅读整个源码有很大的帮助。
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;
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只能用于服务器端。
阅读代码的同学如果发现以上的分析有错误,请及时告知。

浙公网安备 33010602011771号