分析完了参数解析,接下来分析环境设置
首先设定的是认证方式
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();
到了这里环境设定阶段就基本结束了,后面就开始正式的数据集簇的初期化了。