PostgreSQL之精妙的数据库导入导出工具架构 (四)

(四)pg_backup_custom.c文件的导出格式研究

1 可仔细体会文件如何存放数据
2 可体会文件头中和版本有关的信息(文件版本,程序版本)

基本部分

结构

备注

文件头

dump标识

5个字符= PGDMP

文件版本标识

3char=vmaj | vmin | vrev

version = ((vmaj * 256 + vmin) * 256 + vrev) * 256 + 0;

version:最终得出的文件版本,int

integer”的长度

1byte=4

偏移数值的长度

1byte=4

备份文件的格式

1byte=4

压缩级别

根据文件版本确定:1byte1int

创建时间

7int=xxx

数据库名

字符串=len+data=int+byte[]

服务器的版本

字符串

程序的版本

字符串

可导出对象元信息链

toc count

int = 4toc链上元素的个数

dumpID

int = 4

dataDumper

int * = 4,函数指针

tableoid

字符串

OID

字符串

tag

字符串,对象名(对象是表,即表名)

desc

字符串,对象类型(对象是表,即“TABLE”)

defn

字符串,对象的create SQL语句

dropStmt

字符串,对象的drop SQL语句

copyStmt

字符串,对象的drop SQL语句

namespace

字符串,对象所属的schema

tablespace

字符串,对象所在的tablespace

owner

字符串,对象所有者

withOids

字符串,对象是否有oid,只有“true”和“false”值

dependencies

字符串list,对象的依赖关系

NULL

结束标志

数据块

有两种类型:

 

三个标志:byte

BLK_DATA:表数据的标识

BLK_BLOB:没有被使用

BLK_BLOBS:所有大对象的数据块

 

普通数据

基本结构 ::= BLK_DATA | dumpId |data | 0

BLK_DATA ::= 1 byte

dumpId::= int4

data ::= copyState / insertStates

copyState ::= chunkLen | chunkBytes| … | chunkLen | chunkBytes | . | \n | \n | \n

insertStates ::= insert SQL statement | ; | \n | … | insert SQL statement | ; | \n | \n | \n

 

大对象块

基本结构 ::= BLK_BLOBS | dumpId | one LOB | … | one LOB | 0

BLK_BLOBS ::= 1 byte

dumpId::= int4

one LOB ::= OID | chunkLen | chunkBytes| …. | chunkLen | chunkBytes | 0

OID ::= int4

chunkLen ::=  int4

chunkBytes  ::=  n byte

1)        BLK_BLOBS:大对象的标志,以byte格式写出

2)        dumpId:可导出对象的一个统一导出编号,以int格式写出

3)        oid:大对象的oid,以int格式写出

4)        [数据长度/数据块]:可以有多个,“[”和“]”符号表示可选;长度以int格式写出;

5)        0:标识结束

 

 

Byte格式: 单字符 (调用fputc输出)

Int格式:符号位 | 字节1 | 字节2…  (最低位优先的字节序列)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值