上篇文章分析到使用引导模式创建了template0,下面继续分析
到了这里引导模式的工作基本就结束了,下面开始使用postgres的单用户模式对template1创建系统表,视图,依赖,以及扩展插件的安装等一列操作。
首先是通过setup_auth()设置search_path和exit_on_error,下面的代码本来是放在setup_auth()中执行,但是新版本中被提出来了。
//这里第一个参数给的是postgres,第二个参数给的是-single -F -O -c search_path=pg_catalog -c exit_on_error=true
//这里把exit_on_error设为true之后,任何错误将中止当前会话。默认是false,只有 FATAL 错误(致命)将中止会话。
snprintf(cmd, sizeof(cmd),
"\"%s\" %s template1 >%s",
backend_exec, backend_options,
DEVNULL);
然后是通过setup_depend()设置依赖关系,其实就是更新pg_depend和pg_shdepend表
static void
setup_depend(FILE *cmdfd)
{
const char *const *line;
static const char *const pg_depend_setup[] = {
……
//删除pg_depend和pg_shdepend表中的数据并清理
//pg_depend和pg_shdepend表之前通过postgres.bki创建
"DELETE FROM pg_depend;\n\n",
"VACUUM pg_depend;\n\n",
"DELETE FROM pg_shdepend;\n\n",
"VACUUM pg_shdepend;\n\n",
//向pg_depend表中填充数据
"INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
" FROM pg_class;\n\n",
"INSERT INTO pg_depend SELECT 0,0,0, tableoid,oid,0, 'p' "
" FROM pg_proc;\n\n",
……
NULL
};
//逐行执行
for (line = pg_depend_setup