LCOV - differential code coverage report
Current view: top level - src/bin/scripts - createdb.c (source / functions) Coverage Total Hit UBC GBC GIC GNC CBC DCB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 75.7 % 206 156 50 5 10 141 2
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 2 2 2
Baseline: 16@8cea358b128 Branches: 67.6 % 74 50 24 2 1 2 45
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed [..60] days: 100.0 % 10 10 10
(240..) days: 74.5 % 196 146 50 5 141
Function coverage date bins:
(240..) days: 100.0 % 2 2 2
Branch coverage date bins:
[..60] days: 100.0 % 2 2 2
(240..) days: 66.7 % 72 48 24 2 1 45

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  *
                                  3                 :                :  * createdb
                                  4                 :                :  *
                                  5                 :                :  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
                                  6                 :                :  * Portions Copyright (c) 1994, Regents of the University of California
                                  7                 :                :  *
                                  8                 :                :  * src/bin/scripts/createdb.c
                                  9                 :                :  *
                                 10                 :                :  *-------------------------------------------------------------------------
                                 11                 :                :  */
                                 12                 :                : #include "postgres_fe.h"
                                 13                 :                : 
                                 14                 :                : #include "common.h"
                                 15                 :                : #include "common/logging.h"
                                 16                 :                : #include "fe_utils/option_utils.h"
                                 17                 :                : #include "fe_utils/string_utils.h"
                                 18                 :                : 
                                 19                 :                : 
                                 20                 :                : static void help(const char *progname);
                                 21                 :                : 
                                 22                 :                : 
                                 23                 :                : int
 7698 peter_e@gmx.net            24                 :CBC          48 : main(int argc, char *argv[])
                                 25                 :                : {
                                 26                 :                :     static struct option long_options[] = {
                                 27                 :                :         {"host", required_argument, NULL, 'h'},
                                 28                 :                :         {"port", required_argument, NULL, 'p'},
                                 29                 :                :         {"username", required_argument, NULL, 'U'},
                                 30                 :                :         {"no-password", no_argument, NULL, 'w'},
                                 31                 :                :         {"password", no_argument, NULL, 'W'},
                                 32                 :                :         {"echo", no_argument, NULL, 'e'},
                                 33                 :                :         {"owner", required_argument, NULL, 'O'},
                                 34                 :                :         {"tablespace", required_argument, NULL, 'D'},
                                 35                 :                :         {"template", required_argument, NULL, 'T'},
                                 36                 :                :         {"encoding", required_argument, NULL, 'E'},
                                 37                 :                :         {"strategy", required_argument, NULL, 'S'},
                                 38                 :                :         {"lc-collate", required_argument, NULL, 1},
                                 39                 :                :         {"lc-ctype", required_argument, NULL, 2},
                                 40                 :                :         {"locale", required_argument, NULL, 'l'},
                                 41                 :                :         {"maintenance-db", required_argument, NULL, 3},
                                 42                 :                :         {"locale-provider", required_argument, NULL, 4},
                                 43                 :                :         {"builtin-locale", required_argument, NULL, 5},
                                 44                 :                :         {"icu-locale", required_argument, NULL, 6},
                                 45                 :                :         {"icu-rules", required_argument, NULL, 7},
                                 46                 :                :         {NULL, 0, NULL, 0}
                                 47                 :                :     };
                                 48                 :                : 
                                 49                 :                :     const char *progname;
                                 50                 :                :     int         optindex;
                                 51                 :                :     int         c;
                                 52                 :                : 
                                 53                 :             48 :     const char *dbname = NULL;
 4513 rhaas@postgresql.org       54                 :             48 :     const char *maintenance_db = NULL;
 7698 peter_e@gmx.net            55                 :             48 :     char       *comment = NULL;
                                 56                 :             48 :     char       *host = NULL;
                                 57                 :             48 :     char       *port = NULL;
                                 58                 :             48 :     char       *username = NULL;
 5526                            59                 :             48 :     enum trivalue prompt_password = TRI_DEFAULT;
                                 60                 :                :     ConnParams  cparams;
 7698                            61                 :             48 :     bool        echo = false;
                                 62                 :             48 :     char       *owner = NULL;
 7240 tgl@sss.pgh.pa.us          63                 :             48 :     char       *tablespace = NULL;
 7698 peter_e@gmx.net            64                 :             48 :     char       *template = NULL;
                                 65                 :             48 :     char       *encoding = NULL;
  747 rhaas@postgresql.org       66                 :             48 :     char       *strategy = NULL;
 5682 heikki.linnakangas@i       67                 :             48 :     char       *lc_collate = NULL;
                                 68                 :             48 :     char       *lc_ctype = NULL;
 5634 alvherre@alvh.no-ip.       69                 :             48 :     char       *locale = NULL;
  759 peter@eisentraut.org       70                 :             48 :     char       *locale_provider = NULL;
   32 jdavis@postgresql.or       71                 :GNC          48 :     char       *builtin_locale = NULL;
  759 peter@eisentraut.org       72                 :CBC          48 :     char       *icu_locale = NULL;
  403                            73                 :             48 :     char       *icu_rules = NULL;
                                 74                 :                : 
                                 75                 :                :     PQExpBufferData sql;
                                 76                 :                : 
                                 77                 :                :     PGconn     *conn;
                                 78                 :                :     PGresult   *result;
                                 79                 :                : 
 1840                            80                 :             48 :     pg_logging_init(argv[0]);
 7698 peter_e@gmx.net            81                 :             48 :     progname = get_progname(argv[0]);
 5603                            82                 :             48 :     set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
                                 83                 :                : 
 7698                            84                 :             48 :     handle_help_version_opts(argc, argv, "createdb", help);
                                 85                 :                : 
  489 peter@eisentraut.org       86         [ +  + ]:            129 :     while ((c = getopt_long(argc, argv, "D:eE:h:l:O:p:S:T:U:wW", long_options, &optindex)) != -1)
                                 87                 :                :     {
 7698 peter_e@gmx.net            88   [ -  -  +  -  :             84 :         switch (c)
                                     +  +  -  +  +  
                                     +  -  -  +  +  
                                     -  +  +  +  +  
                                                 + ]
                                 89                 :                :         {
  489 peter@eisentraut.org       90                 :UBC           0 :             case 'D':
                                 91                 :              0 :                 tablespace = pg_strdup(optarg);
                                 92                 :              0 :                 break;
                                 93                 :              0 :             case 'e':
                                 94                 :              0 :                 echo = true;
                                 95                 :              0 :                 break;
  489 peter@eisentraut.org       96                 :CBC           8 :             case 'E':
                                 97                 :              8 :                 encoding = pg_strdup(optarg);
                                 98                 :              8 :                 break;
 7698 peter_e@gmx.net            99                 :UBC           0 :             case 'h':
 4202 bruce@momjian.us          100                 :              0 :                 host = pg_strdup(optarg);
 7698 peter_e@gmx.net           101                 :              0 :                 break;
  489 peter@eisentraut.org      102                 :CBC          10 :             case 'l':
                                103                 :             10 :                 locale = pg_strdup(optarg);
                                104                 :             10 :                 break;
                                105                 :              1 :             case 'O':
                                106                 :              1 :                 owner = pg_strdup(optarg);
                                107                 :              1 :                 break;
 7698 peter_e@gmx.net           108                 :UBC           0 :             case 'p':
 4202 bruce@momjian.us          109                 :              0 :                 port = pg_strdup(optarg);
 7698 peter_e@gmx.net           110                 :              0 :                 break;
  489 peter@eisentraut.org      111                 :CBC           3 :             case 'S':
                                112                 :              3 :                 strategy = pg_strdup(optarg);
                                113                 :              3 :                 break;
                                114                 :             22 :             case 'T':
                                115                 :             22 :                 template = pg_strdup(optarg);
                                116                 :             22 :                 break;
 7698 peter_e@gmx.net           117                 :              6 :             case 'U':
 4202 bruce@momjian.us          118                 :              6 :                 username = pg_strdup(optarg);
 7698 peter_e@gmx.net           119                 :              6 :                 break;
 5526 peter_e@gmx.net           120                 :UBC           0 :             case 'w':
                                121                 :              0 :                 prompt_password = TRI_NO;
                                122                 :              0 :                 break;
 7698                           123                 :              0 :             case 'W':
 5526                           124                 :              0 :                 prompt_password = TRI_YES;
 7698                           125                 :              0 :                 break;
 5682 heikki.linnakangas@i      126                 :CBC           5 :             case 1:
 4202 bruce@momjian.us          127                 :              5 :                 lc_collate = pg_strdup(optarg);
 5682 heikki.linnakangas@i      128                 :              5 :                 break;
                                129                 :              5 :             case 2:
 4202 bruce@momjian.us          130                 :              5 :                 lc_ctype = pg_strdup(optarg);
 5682 heikki.linnakangas@i      131                 :              5 :                 break;
 4513 rhaas@postgresql.org      132                 :UBC           0 :             case 3:
 4202 bruce@momjian.us          133                 :              0 :                 maintenance_db = pg_strdup(optarg);
 4513 rhaas@postgresql.org      134                 :              0 :                 break;
  759 peter@eisentraut.org      135                 :CBC          16 :             case 4:
                                136                 :             16 :                 locale_provider = pg_strdup(optarg);
                                137                 :             16 :                 break;
                                138                 :              2 :             case 5:
   32 jdavis@postgresql.or      139                 :GNC           2 :                 builtin_locale = pg_strdup(optarg);
  759 peter@eisentraut.org      140                 :CBC           2 :                 break;
  403 peter@eisentraut.org      141                 :GBC           4 :             case 6:
   32 jdavis@postgresql.or      142                 :GNC           4 :                 icu_locale = pg_strdup(optarg);
                                143                 :              4 :                 break;
                                144                 :              1 :             case 7:
  403 peter@eisentraut.org      145                 :GBC           1 :                 icu_rules = pg_strdup(optarg);
                                146                 :              1 :                 break;
 7698 peter_e@gmx.net           147                 :CBC           1 :             default:
                                148                 :                :                 /* getopt_long already emitted a complaint */
  737 tgl@sss.pgh.pa.us         149                 :              1 :                 pg_log_error_hint("Try \"%s --help\" for more information.", progname);
 7698 peter_e@gmx.net           150                 :              1 :                 exit(1);
                                151                 :                :         }
                                152                 :                :     }
                                153                 :                : 
                                154   [ -  +  -  - ]:             45 :     switch (argc - optind)
                                155                 :                :     {
 7698 peter_e@gmx.net           156                 :UBC           0 :         case 0:
                                157                 :              0 :             break;
 7698 peter_e@gmx.net           158                 :CBC          45 :         case 1:
                                159                 :             45 :             dbname = argv[optind];
                                160                 :             45 :             break;
 7698 peter_e@gmx.net           161                 :UBC           0 :         case 2:
                                162                 :              0 :             dbname = argv[optind];
                                163                 :              0 :             comment = argv[optind + 1];
                                164                 :              0 :             break;
                                165                 :              0 :         default:
 1840 peter@eisentraut.org      166                 :              0 :             pg_log_error("too many command-line arguments (first is \"%s\")",
                                167                 :                :                          argv[optind + 2]);
  737 tgl@sss.pgh.pa.us         168                 :              0 :             pg_log_error_hint("Try \"%s --help\" for more information.", progname);
 7698 peter_e@gmx.net           169                 :              0 :             exit(1);
                                170                 :                :     }
                                171                 :                : 
 7698 peter_e@gmx.net           172         [ +  + ]:CBC          45 :     if (encoding)
                                173                 :                :     {
                                174         [ +  + ]:              8 :         if (pg_char_to_encoding(encoding) < 0)
  737 tgl@sss.pgh.pa.us         175                 :              1 :             pg_fatal("\"%s\" is not a valid encoding name", encoding);
                                176                 :                :     }
                                177                 :                : 
 7698 peter_e@gmx.net           178         [ -  + ]:             44 :     if (dbname == NULL)
                                179                 :                :     {
 7698 peter_e@gmx.net           180         [ #  # ]:UBC           0 :         if (getenv("PGDATABASE"))
                                181                 :              0 :             dbname = getenv("PGDATABASE");
                                182         [ #  # ]:              0 :         else if (getenv("PGUSER"))
                                183                 :              0 :             dbname = getenv("PGUSER");
                                184                 :                :         else
 3770 bruce@momjian.us          185                 :              0 :             dbname = get_user_name_or_exit(progname);
                                186                 :                :     }
                                187                 :                : 
                                188                 :                :     /* No point in trying to use postgres db when creating postgres db. */
 1508 michael@paquier.xyz       189   [ +  -  -  + ]:CBC          44 :     if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
 1508 michael@paquier.xyz       190                 :UBC           0 :         maintenance_db = "template1";
                                191                 :                : 
 1273 tgl@sss.pgh.pa.us         192                 :CBC          44 :     cparams.dbname = maintenance_db;
                                193                 :             44 :     cparams.pghost = host;
                                194                 :             44 :     cparams.pgport = port;
                                195                 :             44 :     cparams.pguser = username;
                                196                 :             44 :     cparams.prompt_password = prompt_password;
                                197                 :             44 :     cparams.override_dbname = NULL;
                                198                 :                : 
                                199                 :             44 :     conn = connectMaintenanceDatabase(&cparams, progname, echo);
                                200                 :                : 
 7698 peter_e@gmx.net           201                 :             44 :     initPQExpBuffer(&sql);
                                202                 :                : 
 7641 tgl@sss.pgh.pa.us         203                 :             44 :     appendPQExpBuffer(&sql, "CREATE DATABASE %s",
                                204                 :                :                       fmtId(dbname));
                                205                 :                : 
 7698 peter_e@gmx.net           206         [ +  + ]:             44 :     if (owner)
                                207                 :              1 :         appendPQExpBuffer(&sql, " OWNER %s", fmtId(owner));
 7240 tgl@sss.pgh.pa.us         208         [ -  + ]:             44 :     if (tablespace)
 7240 tgl@sss.pgh.pa.us         209                 :UBC           0 :         appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace));
 7698 peter_e@gmx.net           210         [ +  + ]:CBC          44 :     if (encoding)
                                211                 :                :     {
 1508 michael@paquier.xyz       212                 :              7 :         appendPQExpBufferStr(&sql, " ENCODING ");
                                213                 :              7 :         appendStringLiteralConn(&sql, encoding, conn);
                                214                 :                :     }
  747 rhaas@postgresql.org      215         [ +  + ]:             44 :     if (strategy)
                                216                 :              3 :         appendPQExpBuffer(&sql, " STRATEGY %s", fmtId(strategy));
 7698 peter_e@gmx.net           217         [ +  + ]:             44 :     if (template)
                                218                 :             22 :         appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
  303 jdavis@postgresql.or      219         [ +  + ]:             44 :     if (locale)
                                220                 :                :     {
                                221                 :             10 :         appendPQExpBufferStr(&sql, " LOCALE ");
                                222                 :             10 :         appendStringLiteralConn(&sql, locale, conn);
                                223                 :                :     }
   32 jdavis@postgresql.or      224         [ +  + ]:GNC          44 :     if (builtin_locale)
                                225                 :                :     {
                                226                 :              2 :         appendPQExpBufferStr(&sql, " BUILTIN_LOCALE ");
                                227                 :              2 :         appendStringLiteralConn(&sql, builtin_locale, conn);
                                228                 :                :     }
 5682 heikki.linnakangas@i      229         [ +  + ]:CBC          44 :     if (lc_collate)
                                230                 :                :     {
 1508 michael@paquier.xyz       231                 :              5 :         appendPQExpBufferStr(&sql, " LC_COLLATE ");
                                232                 :              5 :         appendStringLiteralConn(&sql, lc_collate, conn);
                                233                 :                :     }
 5682 heikki.linnakangas@i      234         [ +  + ]:             44 :     if (lc_ctype)
                                235                 :                :     {
 1508 michael@paquier.xyz       236                 :              5 :         appendPQExpBufferStr(&sql, " LC_CTYPE ");
                                237                 :              5 :         appendStringLiteralConn(&sql, lc_ctype, conn);
                                238                 :                :     }
  759 peter@eisentraut.org      239         [ +  + ]:             44 :     if (locale_provider)
                                240                 :             16 :         appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", locale_provider);
                                241         [ +  + ]:             44 :     if (icu_locale)
                                242                 :                :     {
                                243                 :              4 :         appendPQExpBufferStr(&sql, " ICU_LOCALE ");
                                244                 :              4 :         appendStringLiteralConn(&sql, icu_locale, conn);
                                245                 :                :     }
  403                           246         [ +  + ]:             44 :     if (icu_rules)
                                247                 :                :     {
  403 peter@eisentraut.org      248                 :GBC           1 :         appendPQExpBufferStr(&sql, " ICU_RULES ");
                                249                 :              1 :         appendStringLiteralConn(&sql, icu_rules, conn);
                                250                 :                :     }
                                251                 :                : 
 3209 heikki.linnakangas@i      252                 :CBC          44 :     appendPQExpBufferChar(&sql, ';');
                                253                 :                : 
 7698 peter_e@gmx.net           254         [ -  + ]:             44 :     if (echo)
 3716 peter_e@gmx.net           255                 :UBC           0 :         printf("%s\n", sql.data);
 7698 peter_e@gmx.net           256                 :CBC          44 :     result = PQexec(conn, sql.data);
                                257                 :                : 
                                258         [ +  + ]:             44 :     if (PQresultStatus(result) != PGRES_COMMAND_OK)
                                259                 :                :     {
 1840 peter@eisentraut.org      260                 :             13 :         pg_log_error("database creation failed: %s", PQerrorMessage(conn));
 7698 peter_e@gmx.net           261                 :             13 :         PQfinish(conn);
                                262                 :             13 :         exit(1);
                                263                 :                :     }
                                264                 :                : 
                                265                 :             31 :     PQclear(result);
                                266                 :                : 
                                267         [ -  + ]:             31 :     if (comment)
                                268                 :                :     {
 7641 tgl@sss.pgh.pa.us         269                 :UBC           0 :         printfPQExpBuffer(&sql, "COMMENT ON DATABASE %s IS ", fmtId(dbname));
 6531                           270                 :              0 :         appendStringLiteralConn(&sql, comment, conn);
 3209 heikki.linnakangas@i      271                 :              0 :         appendPQExpBufferChar(&sql, ';');
                                272                 :                : 
 7698 peter_e@gmx.net           273         [ #  # ]:              0 :         if (echo)
 3716                           274                 :              0 :             printf("%s\n", sql.data);
 7698                           275                 :              0 :         result = PQexec(conn, sql.data);
                                276                 :                : 
                                277         [ #  # ]:              0 :         if (PQresultStatus(result) != PGRES_COMMAND_OK)
                                278                 :                :         {
 1840 peter@eisentraut.org      279                 :              0 :             pg_log_error("comment creation failed (database was created): %s",
                                280                 :                :                          PQerrorMessage(conn));
 7698 peter_e@gmx.net           281                 :              0 :             PQfinish(conn);
                                282                 :              0 :             exit(1);
                                283                 :                :         }
                                284                 :                : 
 6530 bruce@momjian.us          285                 :              0 :         PQclear(result);
                                286                 :                :     }
                                287                 :                : 
 4723 bruce@momjian.us          288                 :CBC          31 :     PQfinish(conn);
                                289                 :                : 
 7698 peter_e@gmx.net           290                 :             31 :     exit(0);
                                291                 :                : }
                                292                 :                : 
                                293                 :                : 
                                294                 :                : static void
                                295                 :              1 : help(const char *progname)
                                296                 :                : {
                                297                 :              1 :     printf(_("%s creates a PostgreSQL database.\n\n"), progname);
                                298                 :              1 :     printf(_("Usage:\n"));
                                299                 :              1 :     printf(_("  %s [OPTION]... [DBNAME] [DESCRIPTION]\n"), progname);
                                300                 :              1 :     printf(_("\nOptions:\n"));
 7240 tgl@sss.pgh.pa.us         301                 :              1 :     printf(_("  -D, --tablespace=TABLESPACE  default tablespace for the database\n"));
 5527 peter_e@gmx.net           302                 :              1 :     printf(_("  -e, --echo                   show the commands being sent to the server\n"));
 7240 tgl@sss.pgh.pa.us         303                 :              1 :     printf(_("  -E, --encoding=ENCODING      encoding for the database\n"));
 5634 alvherre@alvh.no-ip.      304                 :              1 :     printf(_("  -l, --locale=LOCALE          locale settings for the database\n"));
 5527 peter_e@gmx.net           305                 :              1 :     printf(_("      --lc-collate=LOCALE      LC_COLLATE setting for the database\n"));
                                306                 :              1 :     printf(_("      --lc-ctype=LOCALE        LC_CTYPE setting for the database\n"));
   32 jdavis@postgresql.or      307                 :GNC           1 :     printf(_("      --builtin-locale=LOCALE  builtin locale setting for the database\n"));
  759 peter@eisentraut.org      308                 :CBC           1 :     printf(_("      --icu-locale=LOCALE      ICU locale setting for the database\n"));
  403                           309                 :              1 :     printf(_("      --icu-rules=RULES        ICU rules setting for the database\n"));
   32 jdavis@postgresql.or      310                 :GNC           1 :     printf(_("      --locale-provider={builtin|libc|icu}\n"
                                311                 :                :              "                               locale provider for the database's default collation\n"));
 7240 tgl@sss.pgh.pa.us         312                 :CBC           1 :     printf(_("  -O, --owner=OWNER            database user to own the new database\n"));
  747 rhaas@postgresql.org      313                 :              1 :     printf(_("  -S, --strategy=STRATEGY      database creation strategy wal_log or file_copy\n"));
 7240 tgl@sss.pgh.pa.us         314                 :              1 :     printf(_("  -T, --template=TEMPLATE      template database to copy\n"));
 4318 peter_e@gmx.net           315                 :              1 :     printf(_("  -V, --version                output version information, then exit\n"));
                                316                 :              1 :     printf(_("  -?, --help                   show this help, then exit\n"));
 7698                           317                 :              1 :     printf(_("\nConnection options:\n"));
 7240 tgl@sss.pgh.pa.us         318                 :              1 :     printf(_("  -h, --host=HOSTNAME          database server host or socket directory\n"));
                                319                 :              1 :     printf(_("  -p, --port=PORT              database server port\n"));
                                320                 :              1 :     printf(_("  -U, --username=USERNAME      user name to connect as\n"));
 5526 peter_e@gmx.net           321                 :              1 :     printf(_("  -w, --no-password            never prompt for password\n"));
 5969 tgl@sss.pgh.pa.us         322                 :              1 :     printf(_("  -W, --password               force password prompt\n"));
 4513 rhaas@postgresql.org      323                 :              1 :     printf(_("  --maintenance-db=DBNAME      alternate maintenance database\n"));
 7698 peter_e@gmx.net           324                 :              1 :     printf(_("\nBy default, a database with the same name as the current user is created.\n"));
 1507 peter@eisentraut.org      325                 :              1 :     printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
                                326                 :              1 :     printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
 7698 peter_e@gmx.net           327                 :              1 : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622