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

(九)详解逻辑备份---对象定义的导出(一)
    以导出表对象定义为例,深入剖析对象的定义,是如何导出的。

1 概述
1.1 getTables函数功能:读出当前执行导出工具的用户可以读取到的所有的表的元信息。用户登录,只能导出自己有权限读取的对象和数据。

PostgreSQL之精妙的数据库导入导出工具架构 (九) - 那海蓝蓝 - 那海蓝蓝的博客
 
    图:读出多个表对象定义的调用关系  
1.2 dumpTable:导出一个具体的表对象到备份文件。

PostgreSQL之精妙的数据库导入导出工具架构 (九) - 那海蓝蓝 - 那海蓝蓝的博客
    图:导出单个表的调用关系

1.3 所有可被导出的对象的定义,都被读入内存(调用类似getTables的函数,注意是tables是复数,标识多个表),并按设定好的对象类型的优先导出顺序在内存排好序,然后调用对应的导出函数(调用类似dumpTable的函数,把某个具体的表定义导出,注意table是单数,标识导出单个具体的表),把对应的信息写出到备份文件。
 
2 getTables函数细节
2.1 函数返回值,是“TableInfo”类型,即表对象对应的内存结构信息。每类对象,都有自己不同的结构对应,这是根据对象的特点确定的。如,表上要有列的信息、约束的信息等等,这些,都在“TableInfo”中定义。
    注意返回值,是个结构指针,其空间,是在本函数中分配的。所以,注意将来使用完毕后,内存要释放。pg_dump没有主动释放这里的内存空间,是依赖于整个程序执行结束,进程退出,操作系统释放资源。
2.2 函数名,是“getTables”,复数名称表达了读出的是多个对象的信息。
2.3 函数人口参数,是“int *numTables”,注意,这是个指针,将来要把读到的表对象的个数传递出去
2.4 函数的开头部分,是变量的定义。
2.5 每个类似的函数,通常都会执行“selectSourceSchema("pg_catalog");”,这是在设定读取系统表时,指示数据库引擎要到系统的schema下去找(原代码解释:Make sure we are in proper schema )。
2.6 根据不同的目的数据库的版本,设定不同的SQL语句,从pg_class系统表读取表的元信息。注意对于版本的判断,可以使得pg_dump做到“向下兼容”,即高版本的pg_dump二进制程序可以导出低版本的数据库的信息。
2.7 执行SQL,取出结果集信息,这时,就能得到“numTables”的值,原文代码如下:
    res = PQexec(g_conn, query->data);
    check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
    ntups = PQntuples(res);
    *numTables = ntups;

2.8 遍历取到的信息,逐个把每个表的信息放到tblinfo中(本函数的返回值)。
2.9 上一步中,要根据pg_class表的“relkind”列,决定取到的是什么类型的内容。因为在pg_class系统表中,存放了表、视图、索引等的定义,本函数取出的,实际上不仅是表对象的定义。并决定是否导出(此信息在dumpTable这样的函数中会用到)。
2.10 再次遍历要导出的对象,决定是否要为与表的某个列绑定的序列(sequence)收集更多的信息。这个信息将来被getTableAttrs使用。(列信息是额外读出的,但读出列的信息的使用,使用了本函数的输出值,即读取到的表的信息,getTableAttrs函数要为每个表找到对应的列的信息本把信息置于表上,这样,列的信息是逐个读出,但不是以独立对象存在的于内存中,其信息要依附于表)
    getTableAttrs(TableInfo *tblinfo, int numTables)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值