1 可仔细体会文件如何存放数据
2 可体会文件头中和版本有关的信息(文件版本,程序版本)
基本部分 | 结构 | 备注 |
文件头 | dump标识 | 5个字符= PGDMP |
文件版本标识 | 3个char=vmaj | vmin | vrev version = ((vmaj * 256 + vmin) * 256 + vrev) * 256 + 0; version:最终得出的文件版本,int型 | |
“integer”的长度 | 1个byte=4 | |
偏移数值的长度 | 1个byte=4 | |
备份文件的格式 | 1个byte=4 | |
压缩级别 | 根据文件版本确定:1个byte或1个int | |
创建时间 | 7个int=xxx | |
数据库名 | 字符串=len+data=int+byte[] | |
服务器的版本 | 字符串 | |
程序的版本 | 字符串 | |
可导出对象元信息链 | toc count | int = 4,toc链上元素的个数 |
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… (最低位优先的字节序列)