zoukankan      html  css  js  c++  java
  • PostgreSQL的 initdb 源代码分析之十二

    继续分析

        /* Now create all the text config files */
        setup_config();

    将其展开:

    实质就是,确定各种参数,分别写入 postgresql.conf 、pg_hba.conf、pg_indent.conf 文件。 

    /*
     * set up all the config files
     */
    static void
    setup_config(void)
    {
        char      **conflines;
        char        repltok[100];
        char        path[MAXPGPATH];
    
        fputs(_("creating configuration files ... "), stdout);
        fflush(stdout);
    
        /* postgresql.conf */
    
        conflines = readfile(conf_file);
    
        snprintf(repltok, sizeof(repltok), "max_connections = %d", n_connections);
        conflines = replace_token(conflines, "#max_connections = 100", repltok);
    
        if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
            snprintf(repltok, sizeof(repltok), "shared_buffers = %dMB",
                     (n_buffers * (BLCKSZ / 1024)) / 1024);
        else
            snprintf(repltok, sizeof(repltok), "shared_buffers = %dkB",
                     n_buffers * (BLCKSZ / 1024));
        conflines = replace_token(conflines, "#shared_buffers = 32MB", repltok);
    
    #if DEF_PGPORT != 5432
        snprintf(repltok, sizeof(repltok), "#port = %d", DEF_PGPORT);
        conflines = replace_token(conflines, "#port = 5432", repltok);
    #endif
    
        snprintf(repltok, sizeof(repltok), "lc_messages = '%s'",
                 escape_quotes(lc_messages));
        conflines = replace_token(conflines, "#lc_messages = 'C'", repltok);
    
        snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'",
                 escape_quotes(lc_monetary));
        conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok);
    
        snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'",
                 escape_quotes(lc_numeric));
        conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok);
    
        snprintf(repltok, sizeof(repltok), "lc_time = '%s'",
                 escape_quotes(lc_time));
        conflines = replace_token(conflines, "#lc_time = 'C'", repltok);
    
        switch (locale_date_order(lc_time))
        {
            case DATEORDER_YMD:
                strcpy(repltok, "datestyle = 'iso, ymd'");
                break;
            case DATEORDER_DMY:
                strcpy(repltok, "datestyle = 'iso, dmy'");
                break;
            case DATEORDER_MDY:
            default:
                strcpy(repltok, "datestyle = 'iso, mdy'");
                break;
        }
        conflines = replace_token(conflines, "#datestyle = 'iso, mdy'", repltok);
    
        snprintf(repltok, sizeof(repltok),
                 "default_text_search_config = 'pg_catalog.%s'",
                 escape_quotes(default_text_search_config));
        conflines = replace_token(conflines,
                             "#default_text_search_config = 'pg_catalog.simple'",
                                  repltok);
    
        snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
    
        writefile(path, conflines);
    
        chmod(path, S_IRUSR | S_IWUSR);
    
        free(conflines);
    
    
        /* pg_hba.conf */
    
        conflines = readfile(hba_file);
    
    #ifndef HAVE_UNIX_SOCKETS
        conflines = filter_lines_with_token(conflines, "@remove-line-for-nolocal@");
    #else
        conflines = replace_token(conflines, "@remove-line-for-nolocal@", "");
    #endif
    
    #ifdef HAVE_IPV6
    
        /*
         * Probe to see if there is really any platform support for IPv6, and
         * comment out the relevant pg_hba line if not.  This avoids runtime
         * warnings if getaddrinfo doesn't actually cope with IPv6.  Particularly
         * useful on Windows, where executables built on a machine with IPv6 may
         * have to run on a machine without.
         */
        {
            struct addrinfo *gai_result;
            struct addrinfo hints;
            int            err = 0;
    
    #ifdef WIN32
            /* need to call WSAStartup before calling getaddrinfo */
            WSADATA        wsaData;
    
            err = WSAStartup(MAKEWORD(2, 2), &wsaData);
    #endif
    
            /* for best results, this code should match parse_hba() */
            hints.ai_flags = AI_NUMERICHOST;
            hints.ai_family = PF_UNSPEC;
            hints.ai_socktype = 0;
            hints.ai_protocol = 0;
            hints.ai_addrlen = 0;
            hints.ai_canonname = NULL;
            hints.ai_addr = NULL;
            hints.ai_next = NULL;
    
            if (err != 0 ||
                getaddrinfo("::1", NULL, &hints, &gai_result) != 0)
                conflines = replace_token(conflines,
                                   "host    all             all             ::1",
                                 "#host    all             all             ::1");
        }
    #else                            /* !HAVE_IPV6 */
        /* If we didn't compile IPV6 support at all, always comment it out */
        conflines = replace_token(conflines,
                                  "host    all             all             ::1",
                                  "#host    all             all             ::1");
    #endif   /* HAVE_IPV6 */
    
        /* Replace default authentication methods */
        conflines = replace_token(conflines,
                                  "@authmethod@",
                                  authmethod);
        conflines = replace_token(conflines,
                                  "@authmethodlocal@",
                                  authmethodlocal);
    
        conflines = replace_token(conflines,
                                  "@authcomment@",
                           strcmp(authmethod, "trust") ? "" : AUTHTRUST_WARNING);
    
        /* Replace username for replication */
        conflines = replace_token(conflines,
                                  "@default_username@",
                                  username);
    
        snprintf(path, sizeof(path), "%s/pg_hba.conf", pg_data);
    
        writefile(path, conflines);
        chmod(path, S_IRUSR | S_IWUSR);
    
        free(conflines);
    
        /* pg_ident.conf */
    
        conflines = readfile(ident_file);
    
        snprintf(path, sizeof(path), "%s/pg_ident.conf", pg_data);
    
        writefile(path, conflines);
        chmod(path, S_IRUSR | S_IWUSR);
    
        free(conflines);
    
        check_ok();
    }
  • 相关阅读:
    2019春总结作业
    2019春第十二周作业
    2019春第十一周作业
    第九周作业
    2019春第八周作业
    第七周作业
    第六周作业
    第五周作业 英文单词排序
    2019年春季学期第四周作业
    2019春第三周作业
  • 原文地址:https://www.cnblogs.com/gaojian/p/3177593.html
Copyright © 2011-2022 走看看