postgresql从入门到菜鸟(十)initdb流程分析-环境设定

分析完了参数解析,接下来分析环境设置
首先设定的是认证方式

static void
check_authmethod_unspecified(const char **authmethod)
{
	if (*authmethod == NULL || strlen(*authmethod) == 0)
	{
		authwarning = _("\nWARNING: enabling \"trust\" authentication for local connections\n"
						"You can change this by editing pg_hba.conf or using the option -A, or\n"
			"--auth-local and --auth-host, the next time you run initdb.\n");
		*authmethod = "trust";
	}
}

因为在initdb过程中,我只设定了-D参数,没有设定认证方式,所以这里authmethod为空,认证方式被设置为默认的trust。所以后续的代码相关的检查也被跳过。

接下来设定pgdata,但是我指定过-D参数,所以不会走下面这一段,如果没有指定-D的话,会尝试从系统变量中读取PGDATA变量然后赋值给pgdata。之后还会还有一些斜杠的处理之类的操作,这里就不分析了。

setup_pgdata(void)
{
	char	   *pgdata_get_env,
			   *pgdata_set_env;

	if (strlen(pg_data) == 0)
	{
		pgdata_get_env = getenv("PGDATA");
		if (pgdata_get_env && strlen(pgdata_get_env))
		{
			/* PGDATA found */
			pg_data = pg_strdup(pgdata_get_env);
		}
		else
		{
			fprintf(stderr,
					_("%s: no data directory specified\n"
					  "You must identify the directory where the data for this database system\n"
					  "will reside.  Do this with either the invocation option -D or the\n"
					  "environment variable PGDATA.\n"),
					progname);
			exit(1);
		}
	}

	pgdata_native = pg_strdup(pg_data);
	canonicalize_path(pg_data);

	pgdata_set_env = psprintf("PGDATA=%s", pg_data);
	putenv(pgdata_set_env);
}

接下来需要找到同目录下postgre程序,后面初期化数据库集簇很多操作都会调用postgres程序,然后设定bin和share路径

void
setup_bin_paths(const char *argv0)
{
	int			ret;

	if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
							   backend_exec)) < 0)
	{
		……
	}
	
	/* store binary directory */
	strcpy(bin_path, backend_exec);
	*last_dir_separator(bin_path) = '\0';
	canonicalize_path(bin_path);;

	if (!share_path)
	{
		share_path = pg_malloc(MAXPGPATH);
		get_share_path(backend_exec, share_path);
	}
	……

接下来设置information_schema的版本信息,奇怪的是这里赋值给全局变量infoversion的值并不是PG_VERSION的值,而是一个很奇怪的数字。不太能理解这个赋值的作用。

set_info_version();

接下来设置后面数据集簇初期化需要用到的文件,顺便检查一下所需文件是否存在

void
setup_data_file_paths(void)
{
	set_input(&bki_file, "postgres.bki");
	set_input(&desc_file, "postgres.description");
	set_input(&shdesc_file, "postgres.shdescription");
	set_input(&hba_file, "pg_hba.conf.sample");
	set_input(&ident_file, "pg_ident.conf.sample");
	set_input(&conf_file, "postgresql.conf.sample");
	set_input(&conversion_file, "conversion_create.sql");
	set_input(&dictionary_file, "snowball_create.sql");
	set_input(&info_schema_file, "information_schema.sql");
	set_input(&features_file, "sql_features.txt");
	set_input(&system_views_file, "system_views.sql");

	//中间还有一些debug模式下才会打印的信息,这里就不贴出来了

	check_input(bki_file);
	check_input(desc_file);
	check_input(shdesc_file);
	check_input(hba_file);
	check_input(ident_file);
	check_input(conf_file);
	check_input(conversion_file);
	check_input(dictionary_file);
	check_input(info_schema_file);
	check_input(features_file);
	check_input(system_views_file);
}

最后还会设置区域和字符集,这里就不展开了

	//setup_locale_encoding();用来设定字符集
	//如果在initdb时不设定local,默认使用系统的local,因系统而异
	setup_locale_encoding();
	
	//setup_locale_encoding();用来设定区域和格式化
	setup_text_search();

到了这里环境设定阶段就基本结束了,后面就开始正式的数据集簇的初期化了。

你可能感兴趣的:(postgresql)