LCOV - differential code coverage report
Current view: top level - src/bin/pg_dump - pg_restore.c (source / functions) Coverage Total Hit UNC UBC GIC GNC CBC
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 79.7 % 311 248 8 55 53 195
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 3 3 3
Baseline: 16@8cea358b128 Branches: 71.2 % 132 94 12 26 2 18 74
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: 77.8 % 9 7 2 7
(120,180] days: 88.5 % 52 46 6 46
(240..) days: 78.0 % 250 195 55 195
Function coverage date bins:
(120,180] days: 100.0 % 1 1 1
(240..) days: 100.0 % 2 2 2
Branch coverage date bins:
[..60] days: 66.7 % 6 4 2 4
(120,180] days: 58.3 % 24 14 10 14
(240..) days: 74.5 % 102 76 26 2 74

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  *
                                  3                 :                :  * pg_restore.c
                                  4                 :                :  *  pg_restore is an utility extracting postgres database definitions
                                  5                 :                :  *  from a backup archive created by pg_dump using the archiver
                                  6                 :                :  *  interface.
                                  7                 :                :  *
                                  8                 :                :  *  pg_restore will read the backup archive and
                                  9                 :                :  *  dump out a script that reproduces
                                 10                 :                :  *  the schema of the database in terms of
                                 11                 :                :  *        user-defined types
                                 12                 :                :  *        user-defined functions
                                 13                 :                :  *        tables
                                 14                 :                :  *        indexes
                                 15                 :                :  *        aggregates
                                 16                 :                :  *        operators
                                 17                 :                :  *        ACL - grant/revoke
                                 18                 :                :  *
                                 19                 :                :  * the output script is SQL that is understood by PostgreSQL
                                 20                 :                :  *
                                 21                 :                :  * Basic process in a restore operation is:
                                 22                 :                :  *
                                 23                 :                :  *  Open the Archive and read the TOC.
                                 24                 :                :  *  Set flags in TOC entries, and *maybe* reorder them.
                                 25                 :                :  *  Generate script to stdout
                                 26                 :                :  *  Exit
                                 27                 :                :  *
                                 28                 :                :  * Copyright (c) 2000, Philip Warner
                                 29                 :                :  *      Rights are granted to use this software in any way so long
                                 30                 :                :  *      as this notice is not removed.
                                 31                 :                :  *
                                 32                 :                :  *  The author is not responsible for loss or damages that may
                                 33                 :                :  *  result from its use.
                                 34                 :                :  *
                                 35                 :                :  *
                                 36                 :                :  * IDENTIFICATION
                                 37                 :                :  *      src/bin/pg_dump/pg_restore.c
                                 38                 :                :  *
                                 39                 :                :  *-------------------------------------------------------------------------
                                 40                 :                :  */
                                 41                 :                : #include "postgres_fe.h"
                                 42                 :                : 
                                 43                 :                : #include <ctype.h>
                                 44                 :                : #ifdef HAVE_TERMIOS_H
                                 45                 :                : #include <termios.h>
                                 46                 :                : #endif
                                 47                 :                : 
                                 48                 :                : #include "dumputils.h"
                                 49                 :                : #include "fe_utils/option_utils.h"
                                 50                 :                : #include "filter.h"
                                 51                 :                : #include "getopt_long.h"
                                 52                 :                : #include "parallel.h"
                                 53                 :                : #include "pg_backup_utils.h"
                                 54                 :                : 
                                 55                 :                : static void usage(const char *progname);
                                 56                 :                : static void read_restore_filters(const char *filename, RestoreOptions *dopt);
                                 57                 :                : 
                                 58                 :                : int
 8424 bruce@momjian.us           59                 :CBC          67 : main(int argc, char **argv)
                                 60                 :                : {
                                 61                 :                :     RestoreOptions *opts;
                                 62                 :                :     int         c;
                                 63                 :                :     int         exit_code;
 4039 andrew@dunslane.net        64                 :             67 :     int         numWorkers = 1;
                                 65                 :                :     Archive    *AH;
                                 66                 :                :     char       *inputFileSpec;
                                 67                 :                :     static int  disable_triggers = 0;
                                 68                 :                :     static int  enable_row_security = 0;
                                 69                 :                :     static int  if_exists = 0;
                                 70                 :                :     static int  no_data_for_failed_tables = 0;
                                 71                 :                :     static int  outputNoTableAm = 0;
                                 72                 :                :     static int  outputNoTablespaces = 0;
                                 73                 :                :     static int  use_setsessauth = 0;
                                 74                 :                :     static int  no_comments = 0;
                                 75                 :                :     static int  no_publications = 0;
                                 76                 :                :     static int  no_security_labels = 0;
                                 77                 :                :     static int  no_subscriptions = 0;
                                 78                 :                :     static int  strict_names = 0;
                                 79                 :                : 
 8271 peter_e@gmx.net            80                 :             67 :     struct option cmdopts[] = {
                                 81                 :                :         {"clean", 0, NULL, 'c'},
                                 82                 :                :         {"create", 0, NULL, 'C'},
                                 83                 :                :         {"data-only", 0, NULL, 'a'},
                                 84                 :                :         {"dbname", 1, NULL, 'd'},
                                 85                 :                :         {"exit-on-error", 0, NULL, 'e'},
                                 86                 :                :         {"exclude-schema", 1, NULL, 'N'},
                                 87                 :                :         {"file", 1, NULL, 'f'},
                                 88                 :                :         {"format", 1, NULL, 'F'},
                                 89                 :                :         {"function", 1, NULL, 'P'},
                                 90                 :                :         {"host", 1, NULL, 'h'},
                                 91                 :                :         {"index", 1, NULL, 'I'},
                                 92                 :                :         {"jobs", 1, NULL, 'j'},
                                 93                 :                :         {"list", 0, NULL, 'l'},
                                 94                 :                :         {"no-privileges", 0, NULL, 'x'},
                                 95                 :                :         {"no-acl", 0, NULL, 'x'},
                                 96                 :                :         {"no-owner", 0, NULL, 'O'},
                                 97                 :                :         {"no-reconnect", 0, NULL, 'R'},
                                 98                 :                :         {"port", 1, NULL, 'p'},
                                 99                 :                :         {"no-password", 0, NULL, 'w'},
                                100                 :                :         {"password", 0, NULL, 'W'},
                                101                 :                :         {"schema", 1, NULL, 'n'},
                                102                 :                :         {"schema-only", 0, NULL, 's'},
                                103                 :                :         {"superuser", 1, NULL, 'S'},
                                104                 :                :         {"table", 1, NULL, 't'},
                                105                 :                :         {"trigger", 1, NULL, 'T'},
                                106                 :                :         {"use-list", 1, NULL, 'L'},
                                107                 :                :         {"username", 1, NULL, 'U'},
                                108                 :                :         {"verbose", 0, NULL, 'v'},
                                109                 :                :         {"single-transaction", 0, NULL, '1'},
                                110                 :                : 
                                111                 :                :         /*
                                112                 :                :          * the following options don't have an equivalent short option letter
                                113                 :                :          */
                                114                 :                :         {"disable-triggers", no_argument, &disable_triggers, 1},
                                115                 :                :         {"enable-row-security", no_argument, &enable_row_security, 1},
                                116                 :                :         {"if-exists", no_argument, &if_exists, 1},
                                117                 :                :         {"no-data-for-failed-tables", no_argument, &no_data_for_failed_tables, 1},
                                118                 :                :         {"no-table-access-method", no_argument, &outputNoTableAm, 1},
                                119                 :                :         {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
                                120                 :                :         {"role", required_argument, NULL, 2},
                                121                 :                :         {"section", required_argument, NULL, 3},
                                122                 :                :         {"strict-names", no_argument, &strict_names, 1},
                                123                 :                :         {"transaction-size", required_argument, NULL, 5},
                                124                 :                :         {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
                                125                 :                :         {"no-comments", no_argument, &no_comments, 1},
                                126                 :                :         {"no-publications", no_argument, &no_publications, 1},
                                127                 :                :         {"no-security-labels", no_argument, &no_security_labels, 1},
                                128                 :                :         {"no-subscriptions", no_argument, &no_subscriptions, 1},
                                129                 :                :         {"filter", required_argument, NULL, 4},
                                130                 :                : 
                                131                 :                :         {NULL, 0, NULL, 0}
                                132                 :                :     };
                                133                 :                : 
 1840 peter@eisentraut.org      134                 :             67 :     pg_logging_init(argv[0]);
 1831                           135                 :             67 :     pg_logging_set_level(PG_LOG_WARNING);
 5603 peter_e@gmx.net           136                 :             67 :     set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
                                137                 :                : 
 5513 andrew@dunslane.net       138                 :             67 :     init_parallel_dump_utils();
                                139                 :                : 
 8668 pjw@rhyme.com.au          140                 :             67 :     opts = NewRestoreOptions();
                                141                 :                : 
 7681 bruce@momjian.us          142                 :             67 :     progname = get_progname(argv[0]);
                                143                 :                : 
 8499 peter_e@gmx.net           144         [ +  + ]:             67 :     if (argc > 1)
                                145                 :                :     {
 8424 bruce@momjian.us          146   [ +  +  -  + ]:             66 :         if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
                                147                 :                :         {
 8499 peter_e@gmx.net           148                 :              1 :             usage(progname);
 4441 rhaas@postgresql.org      149                 :              1 :             exit_nicely(0);
                                150                 :                :         }
 8424 bruce@momjian.us          151   [ +  +  +  + ]:             65 :         if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
                                152                 :                :         {
 8499 peter_e@gmx.net           153                 :             10 :             puts("pg_restore (PostgreSQL) " PG_VERSION);
 4441 rhaas@postgresql.org      154                 :             10 :             exit_nicely(0);
                                155                 :                :         }
                                156                 :                :     }
                                157                 :                : 
 2763 peter_e@gmx.net           158                 :            236 :     while ((c = getopt_long(argc, argv, "acCd:ef:F:h:I:j:lL:n:N:Op:P:RsS:t:T:U:vwWx1",
 7769                           159         [ +  + ]:            236 :                             cmdopts, NULL)) != -1)
                                160                 :                :     {
 8668 pjw@rhyme.com.au          161   [ +  +  +  +  :            186 :         switch (c)
                                     +  +  +  +  +  
                                     +  -  -  -  -  
                                     +  -  -  -  -  
                                     +  -  -  +  +  
                                     -  -  -  +  +  
                                        -  -  +  +  
                                                 + ]
                                162                 :                :         {
                                163                 :              2 :             case 'a':           /* Dump data only */
                                164                 :              2 :                 opts->dataOnly = 1;
                                165                 :              2 :                 break;
 6756 bruce@momjian.us          166                 :              7 :             case 'c':           /* clean (i.e., drop) schema prior to create */
 8668 pjw@rhyme.com.au          167                 :              7 :                 opts->dropSchema = 1;
                                168                 :              7 :                 break;
 8657                           169                 :             12 :             case 'C':
 5083 tgl@sss.pgh.pa.us         170                 :             12 :                 opts->createDB = 1;
 8657 pjw@rhyme.com.au          171                 :             12 :                 break;
 8668                           172                 :             15 :             case 'd':
 1298 tgl@sss.pgh.pa.us         173                 :             15 :                 opts->cparams.dbname = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          174                 :             15 :                 break;
 7177 bruce@momjian.us          175                 :             10 :             case 'e':
                                176                 :             10 :                 opts->exit_on_error = true;
                                177                 :             10 :                 break;
 8668 pjw@rhyme.com.au          178                 :             33 :             case 'f':           /* output file name */
 4524 bruce@momjian.us          179                 :             33 :                 opts->filename = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          180                 :             33 :                 break;
                                181                 :             11 :             case 'F':
 8424 bruce@momjian.us          182         [ +  - ]:             11 :                 if (strlen(optarg) != 0)
 4524                           183                 :             11 :                     opts->formatName = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          184                 :             11 :                 break;
                                185                 :             10 :             case 'h':
                                186         [ +  - ]:             10 :                 if (strlen(optarg) != 0)
 1298 tgl@sss.pgh.pa.us         187                 :             10 :                     opts->cparams.pghost = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          188                 :             10 :                 break;
                                189                 :                : 
 5504 peter_e@gmx.net           190                 :              9 :             case 'j':           /* number of restore jobs */
  995 michael@paquier.xyz       191         [ +  + ]:              9 :                 if (!option_parse_int(optarg, "-j/--jobs", 1,
                                192                 :                :                                       PG_MAX_JOBS,
                                193                 :                :                                       &numWorkers))
                                194                 :              1 :                     exit(1);
 5504 peter_e@gmx.net           195                 :              8 :                 break;
                                196                 :                : 
 8440 pjw@rhyme.com.au          197                 :              5 :             case 'l':           /* Dump the TOC summary */
                                198                 :              5 :                 opts->tocSummary = 1;
                                199                 :              5 :                 break;
                                200                 :                : 
 8440 pjw@rhyme.com.au          201                 :UBC           0 :             case 'L':           /* input TOC summary file name */
 4524 bruce@momjian.us          202                 :              0 :                 opts->tocFile = pg_strdup(optarg);
 8440 pjw@rhyme.com.au          203                 :              0 :                 break;
                                204                 :                : 
 6636 bruce@momjian.us          205                 :              0 :             case 'n':           /* Dump data for this schema only */
 3882 heikki.linnakangas@i      206                 :              0 :                 simple_string_list_append(&opts->schemaNames, optarg);
 6636 bruce@momjian.us          207                 :              0 :                 break;
                                208                 :                : 
 2763 peter_e@gmx.net           209                 :              0 :             case 'N':           /* Do not dump data for this schema */
                                210                 :              0 :                 simple_string_list_append(&opts->schemaExcludeNames, optarg);
                                211                 :              0 :                 break;
                                212                 :                : 
 8668 pjw@rhyme.com.au          213                 :              0 :             case 'O':
 8657                           214                 :              0 :                 opts->noOwner = 1;
 8668                           215                 :              0 :                 break;
                                216                 :                : 
 8668 pjw@rhyme.com.au          217                 :CBC          20 :             case 'p':
                                218         [ +  - ]:             20 :                 if (strlen(optarg) != 0)
 1298 tgl@sss.pgh.pa.us         219                 :             20 :                     opts->cparams.pgport = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          220                 :             20 :                 break;
 8657 pjw@rhyme.com.au          221                 :UBC           0 :             case 'R':
                                222                 :                :                 /* no-op, still accepted for backwards compatibility */
                                223                 :              0 :                 break;
 8424 bruce@momjian.us          224                 :              0 :             case 'P':           /* Function */
 8668 pjw@rhyme.com.au          225                 :              0 :                 opts->selTypes = 1;
                                226                 :              0 :                 opts->selFunction = 1;
 3882 heikki.linnakangas@i      227                 :              0 :                 simple_string_list_append(&opts->functionNames, optarg);
 8668 pjw@rhyme.com.au          228                 :              0 :                 break;
 8424 bruce@momjian.us          229                 :              0 :             case 'I':           /* Index */
 8668 pjw@rhyme.com.au          230                 :              0 :                 opts->selTypes = 1;
                                231                 :              0 :                 opts->selIndex = 1;
 3882 heikki.linnakangas@i      232                 :              0 :                 simple_string_list_append(&opts->indexNames, optarg);
 8668 pjw@rhyme.com.au          233                 :              0 :                 break;
 8424 bruce@momjian.us          234                 :              0 :             case 'T':           /* Trigger */
 8668 pjw@rhyme.com.au          235                 :              0 :                 opts->selTypes = 1;
                                236                 :              0 :                 opts->selTrigger = 1;
 3882 heikki.linnakangas@i      237                 :              0 :                 simple_string_list_append(&opts->triggerNames, optarg);
 8668 pjw@rhyme.com.au          238                 :              0 :                 break;
 8668 pjw@rhyme.com.au          239                 :CBC           1 :             case 's':           /* dump schema only */
                                240                 :              1 :                 opts->schemaOnly = 1;
                                241                 :              1 :                 break;
 8657 pjw@rhyme.com.au          242                 :UBC           0 :             case 'S':           /* Superuser username */
                                243         [ #  # ]:              0 :                 if (strlen(optarg) != 0)
 4524 bruce@momjian.us          244                 :              0 :                     opts->superuser = pg_strdup(optarg);
 8657 pjw@rhyme.com.au          245                 :              0 :                 break;
 3209 tgl@sss.pgh.pa.us         246                 :              0 :             case 't':           /* Dump specified table(s) only */
 8668 pjw@rhyme.com.au          247                 :              0 :                 opts->selTypes = 1;
                                248                 :              0 :                 opts->selTable = 1;
 4105 magnus@hagander.net       249                 :              0 :                 simple_string_list_append(&opts->tableNames, optarg);
 8668 pjw@rhyme.com.au          250                 :              0 :                 break;
                                251                 :                : 
 8368 peter_e@gmx.net           252                 :CBC          12 :             case 'U':
 1298 tgl@sss.pgh.pa.us         253                 :             12 :                 opts->cparams.username = pg_strdup(optarg);
 8668 pjw@rhyme.com.au          254                 :             12 :                 break;
                                255                 :                : 
                                256                 :             15 :             case 'v':           /* verbose */
                                257                 :             15 :                 opts->verbose = 1;
 1305 tgl@sss.pgh.pa.us         258                 :             15 :                 pg_logging_increase_verbosity();
 8668 pjw@rhyme.com.au          259                 :             15 :                 break;
                                260                 :                : 
 5526 peter_e@gmx.net           261                 :UBC           0 :             case 'w':
 1298 tgl@sss.pgh.pa.us         262                 :              0 :                 opts->cparams.promptPassword = TRI_NO;
 5526 peter_e@gmx.net           263                 :              0 :                 break;
                                264                 :                : 
 8368                           265                 :              0 :             case 'W':
 1298 tgl@sss.pgh.pa.us         266                 :              0 :                 opts->cparams.promptPassword = TRI_YES;
 8368 peter_e@gmx.net           267                 :              0 :                 break;
                                268                 :                : 
 8668 pjw@rhyme.com.au          269                 :              0 :             case 'x':           /* skip ACL dump */
                                270                 :              0 :                 opts->aclsSkip = 1;
                                271                 :              0 :                 break;
                                272                 :                : 
 5578 tgl@sss.pgh.pa.us         273                 :CBC           2 :             case '1':           /* Restore data in a single transaction */
                                274                 :              2 :                 opts->single_txn = true;
                                275                 :              2 :                 opts->exit_on_error = true;
                                276                 :              2 :                 break;
                                277                 :                : 
 8271 peter_e@gmx.net           278                 :              1 :             case 0:
                                279                 :                : 
                                280                 :                :                 /*
                                281                 :                :                  * This covers the long options without a short equivalent.
                                282                 :                :                  */
                                283                 :              1 :                 break;
                                284                 :                : 
 5578 tgl@sss.pgh.pa.us         285                 :UBC           0 :             case 2:             /* SET ROLE */
 4202 bruce@momjian.us          286                 :              0 :                 opts->use_role = pg_strdup(optarg);
 6636                           287                 :              0 :                 break;
                                288                 :                : 
 4503 andrew@dunslane.net       289                 :              0 :             case 3:             /* section */
 4338 tgl@sss.pgh.pa.us         290                 :              0 :                 set_dump_section(optarg, &(opts->dumpSections));
 4503 andrew@dunslane.net       291                 :              0 :                 break;
                                292                 :                : 
   13 tgl@sss.pgh.pa.us         293                 :GNC          10 :             case 4:             /* filter */
  137 dgustafsson@postgres      294                 :             10 :                 read_restore_filters(optarg, opts);
                                295                 :              6 :                 break;
                                296                 :                : 
   13 tgl@sss.pgh.pa.us         297                 :             10 :             case 5:             /* transaction-size */
                                298         [ -  + ]:             10 :                 if (!option_parse_int(optarg, "--transaction-size",
                                299                 :                :                                       1, INT_MAX,
                                300                 :                :                                       &opts->txn_size))
   13 tgl@sss.pgh.pa.us         301                 :UNC           0 :                     exit(1);
   13 tgl@sss.pgh.pa.us         302                 :GNC          10 :                 opts->exit_on_error = true;
                                303                 :             10 :                 break;
                                304                 :                : 
 8668 pjw@rhyme.com.au          305                 :CBC           1 :             default:
                                306                 :                :                 /* getopt_long already emitted a complaint */
  737 tgl@sss.pgh.pa.us         307                 :              1 :                 pg_log_error_hint("Try \"%s --help\" for more information.", progname);
 4441 rhaas@postgresql.org      308                 :              1 :                 exit_nicely(1);
                                309                 :                :         }
                                310                 :                :     }
                                311                 :                : 
                                312                 :                :     /* Get file name from command line */
 8424 bruce@momjian.us          313         [ +  + ]:             50 :     if (optind < argc)
 4993 tgl@sss.pgh.pa.us         314                 :             42 :         inputFileSpec = argv[optind++];
                                315                 :                :     else
 7482                           316                 :              8 :         inputFileSpec = NULL;
                                317                 :                : 
                                318                 :                :     /* Complain if any arguments remain */
 4993                           319         [ +  + ]:             50 :     if (optind < argc)
                                320                 :                :     {
 1840 peter@eisentraut.org      321                 :              1 :         pg_log_error("too many command-line arguments (first is \"%s\")",
                                322                 :                :                      argv[optind]);
  737 tgl@sss.pgh.pa.us         323                 :              1 :         pg_log_error_hint("Try \"%s --help\" for more information.", progname);
 4441 rhaas@postgresql.org      324                 :              1 :         exit_nicely(1);
                                325                 :                :     }
                                326                 :                : 
                                327                 :                :     /* Complain if neither -f nor -d was specified (except if dumping TOC) */
 1298 tgl@sss.pgh.pa.us         328   [ +  +  +  +  :             49 :     if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary)
                                              +  + ]
  737                           329                 :              1 :         pg_fatal("one of -d/--dbname and -f/--file must be specified");
                                330                 :                : 
                                331                 :                :     /* Should get at most one of -d and -f, else user is confused */
 1298                           332         [ +  + ]:             48 :     if (opts->cparams.dbname)
                                333                 :                :     {
 7482                           334         [ +  + ]:             15 :         if (opts->filename)
                                335                 :                :         {
 1840 peter@eisentraut.org      336                 :              1 :             pg_log_error("options -d/--dbname and -f/--file cannot be used together");
  737 tgl@sss.pgh.pa.us         337                 :              1 :             pg_log_error_hint("Try \"%s --help\" for more information.", progname);
 4441 rhaas@postgresql.org      338                 :              1 :             exit_nicely(1);
                                339                 :                :         }
 7482 tgl@sss.pgh.pa.us         340                 :             14 :         opts->useDB = 1;
                                341                 :                :     }
                                342                 :                : 
 3939 peter_e@gmx.net           343   [ +  +  +  + ]:             47 :     if (opts->dataOnly && opts->schemaOnly)
  737 tgl@sss.pgh.pa.us         344                 :              1 :         pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together");
                                345                 :                : 
 3939 peter_e@gmx.net           346   [ +  +  +  - ]:             46 :     if (opts->dataOnly && opts->dropSchema)
  737 tgl@sss.pgh.pa.us         347                 :              1 :         pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
                                348                 :                : 
   13 tgl@sss.pgh.pa.us         349   [ +  +  -  + ]:GNC          45 :     if (opts->single_txn && opts->txn_size > 0)
   13 tgl@sss.pgh.pa.us         350                 :UNC           0 :         pg_fatal("options -1/--single-transaction and --transaction-size cannot be used together");
                                351                 :                : 
                                352                 :                :     /*
                                353                 :                :      * -C is not compatible with -1, because we can't create a database inside
                                354                 :                :      * a transaction block.
                                355                 :                :      */
 1993 michael@paquier.xyz       356   [ +  +  +  + ]:CBC          45 :     if (opts->createDB && opts->single_txn)
  737 tgl@sss.pgh.pa.us         357                 :              1 :         pg_fatal("options -C/--create and -1/--single-transaction cannot be used together");
                                358                 :                : 
                                359                 :                :     /* Can't do single-txn mode with multiple connections */
 4039 andrew@dunslane.net       360   [ +  +  +  - ]:             44 :     if (opts->single_txn && numWorkers > 1)
  737 tgl@sss.pgh.pa.us         361                 :              1 :         pg_fatal("cannot specify both --single-transaction and multiple jobs");
                                362                 :                : 
 8010                           363                 :             43 :     opts->disable_triggers = disable_triggers;
 3495 sfrost@snowman.net        364                 :             43 :     opts->enable_row_security = enable_row_security;
 6399 peter_e@gmx.net           365                 :             43 :     opts->noDataForFailedTables = no_data_for_failed_tables;
  818 michael@paquier.xyz       366                 :             43 :     opts->noTableAm = outputNoTableAm;
 5869 tgl@sss.pgh.pa.us         367                 :             43 :     opts->noTablespace = outputNoTablespaces;
                                368                 :             43 :     opts->use_setsessauth = use_setsessauth;
 2271                           369                 :             43 :     opts->no_comments = no_comments;
 2529 peter_e@gmx.net           370                 :             43 :     opts->no_publications = no_publications;
 4714                           371                 :             43 :     opts->no_security_labels = no_security_labels;
 2532                           372                 :             43 :     opts->no_subscriptions = no_subscriptions;
                                373                 :                : 
 3695 alvherre@alvh.no-ip.      374   [ +  +  +  - ]:             43 :     if (if_exists && !opts->dropSchema)
  737 tgl@sss.pgh.pa.us         375                 :              1 :         pg_fatal("option --if-exists requires option -c/--clean");
 3695 alvherre@alvh.no-ip.      376                 :             42 :     opts->if_exists = if_exists;
 3135 teodor@sigaev.ru          377                 :             42 :     opts->strict_names = strict_names;
                                378                 :                : 
 8424 bruce@momjian.us          379         [ +  + ]:             42 :     if (opts->formatName)
                                380                 :                :     {
                                381   [ +  +  +  + ]:             11 :         switch (opts->formatName[0])
                                382                 :                :         {
 8440 pjw@rhyme.com.au          383                 :              8 :             case 'c':
                                384                 :                :             case 'C':
                                385                 :              8 :                 opts->format = archCustom;
                                386                 :              8 :                 break;
                                387                 :                : 
 4830 heikki.linnakangas@i      388                 :              1 :             case 'd':
                                389                 :                :             case 'D':
                                390                 :              1 :                 opts->format = archDirectory;
                                391                 :              1 :                 break;
                                392                 :                : 
 8440 pjw@rhyme.com.au          393                 :              1 :             case 't':
                                394                 :                :             case 'T':
                                395                 :              1 :                 opts->format = archTar;
                                396                 :              1 :                 break;
                                397                 :                : 
                                398                 :              1 :             default:
  737 tgl@sss.pgh.pa.us         399                 :              1 :                 pg_fatal("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"",
                                400                 :                :                          opts->formatName);
                                401                 :                :         }
                                402                 :                :     }
                                403                 :                : 
 7482                           404                 :             41 :     AH = OpenArchive(inputFileSpec, opts->format);
                                405                 :                : 
 3014                           406                 :             41 :     SetArchiveOptions(AH, NULL, opts);
                                407                 :                : 
                                408                 :                :     /*
                                409                 :                :      * We don't have a connection yet but that doesn't matter. The connection
                                410                 :                :      * is initialized to NULL and if we terminate through exit_nicely() while
                                411                 :                :      * it's still NULL, the cleanup function will just be a no-op.
                                412                 :                :      */
 4408 alvherre@alvh.no-ip.      413                 :             41 :     on_exit_close_archive(AH);
                                414                 :                : 
                                415                 :                :     /* Let the archiver know how noisy to be */
 8668 pjw@rhyme.com.au          416                 :             41 :     AH->verbose = opts->verbose;
                                417                 :                : 
                                418                 :                :     /*
                                419                 :                :      * Whether to keep submitting sql commands as "pg_restore ... | psql ... "
                                420                 :                :      */
 7177 bruce@momjian.us          421                 :             41 :     AH->exit_on_error = opts->exit_on_error;
                                422                 :                : 
 8424                           423         [ -  + ]:             41 :     if (opts->tocFile)
 3014 tgl@sss.pgh.pa.us         424                 :UBC           0 :         SortTocFromFile(AH);
                                425                 :                : 
 4039 andrew@dunslane.net       426                 :CBC          41 :     AH->numWorkers = numWorkers;
                                427                 :                : 
 8424 bruce@momjian.us          428         [ +  + ]:             41 :     if (opts->tocSummary)
 3014 tgl@sss.pgh.pa.us         429                 :              5 :         PrintTOCSummary(AH);
                                430                 :                :     else
                                431                 :                :     {
                                432                 :             36 :         ProcessArchiveRestoreOptions(AH);
 4338                           433                 :             36 :         RestoreArchive(AH);
                                434                 :                :     }
                                435                 :                : 
                                436                 :                :     /* done, print a summary of ignored errors */
 7297 bruce@momjian.us          437         [ -  + ]:             41 :     if (AH->n_errors)
 1840 peter@eisentraut.org      438                 :UBC           0 :         pg_log_warning("errors ignored on restore: %d", AH->n_errors);
                                439                 :                : 
                                440                 :                :     /* AH may be freed in CloseArchive? */
 7168 bruce@momjian.us          441                 :CBC          41 :     exit_code = AH->n_errors ? 1 : 0;
                                442                 :                : 
 3014 tgl@sss.pgh.pa.us         443                 :             41 :     CloseArchive(AH);
                                444                 :                : 
 7297 bruce@momjian.us          445                 :             41 :     return exit_code;
                                446                 :                : }
                                447                 :                : 
                                448                 :                : static void
 8424                           449                 :              1 : usage(const char *progname)
                                450                 :                : {
 7900 peter_e@gmx.net           451                 :              1 :     printf(_("%s restores a PostgreSQL database from an archive created by pg_dump.\n\n"), progname);
                                452                 :              1 :     printf(_("Usage:\n"));
 7849                           453                 :              1 :     printf(_("  %s [OPTION]... [FILE]\n"), progname);
                                454                 :                : 
                                455                 :              1 :     printf(_("\nGeneral options:\n"));
 7094 bruce@momjian.us          456                 :              1 :     printf(_("  -d, --dbname=NAME        connect to database name\n"));
 1837 alvherre@alvh.no-ip.      457                 :              1 :     printf(_("  -f, --file=FILENAME      output file name (- for stdout)\n"));
 4830 heikki.linnakangas@i      458                 :              1 :     printf(_("  -F, --format=c|d|t       backup file format (should be automatic)\n"));
 7893 bruce@momjian.us          459                 :              1 :     printf(_("  -l, --list               print summarized TOC of the archive\n"));
 7849 peter_e@gmx.net           460                 :              1 :     printf(_("  -v, --verbose            verbose mode\n"));
 4318                           461                 :              1 :     printf(_("  -V, --version            output version information, then exit\n"));
                                462                 :              1 :     printf(_("  -?, --help               show this help, then exit\n"));
                                463                 :                : 
 7123 bruce@momjian.us          464                 :              1 :     printf(_("\nOptions controlling the restore:\n"));
 4349 peter_e@gmx.net           465                 :              1 :     printf(_("  -a, --data-only              restore only the data, no schema\n"));
                                466                 :              1 :     printf(_("  -c, --clean                  clean (drop) database objects before recreating\n"));
                                467                 :              1 :     printf(_("  -C, --create                 create the target database\n"));
                                468                 :              1 :     printf(_("  -e, --exit-on-error          exit on error, default is to continue\n"));
 3522                           469                 :              1 :     printf(_("  -I, --index=NAME             restore named index\n"));
 4349                           470                 :              1 :     printf(_("  -j, --jobs=NUM               use this many parallel jobs to restore\n"));
                                471                 :              1 :     printf(_("  -L, --use-list=FILENAME      use table of contents from this file for\n"
                                472                 :                :              "                               selecting/ordering output\n"));
 3522                           473                 :              1 :     printf(_("  -n, --schema=NAME            restore only objects in this schema\n"));
 2763                           474                 :              1 :     printf(_("  -N, --exclude-schema=NAME    do not restore objects in this schema\n"));
 4349                           475                 :              1 :     printf(_("  -O, --no-owner               skip restoration of object ownership\n"));
 3522                           476                 :              1 :     printf(_("  -P, --function=NAME(args)    restore named function\n"));
 4349                           477                 :              1 :     printf(_("  -s, --schema-only            restore only the schema, no data\n"));
                                478                 :              1 :     printf(_("  -S, --superuser=NAME         superuser user name to use for disabling triggers\n"));
 2911                           479                 :              1 :     printf(_("  -t, --table=NAME             restore named relation (table, view, etc.)\n"));
 3522                           480                 :              1 :     printf(_("  -T, --trigger=NAME           restore named trigger\n"));
 4349                           481                 :              1 :     printf(_("  -x, --no-privileges          skip restoration of access privileges (grant/revoke)\n"));
                                482                 :              1 :     printf(_("  -1, --single-transaction     restore as a single transaction\n"));
                                483                 :              1 :     printf(_("  --disable-triggers           disable triggers during data-only restore\n"));
 3133                           484                 :              1 :     printf(_("  --enable-row-security        enable row security\n"));
  137 dgustafsson@postgres      485                 :GNC           1 :     printf(_("  --filter=FILENAME            restore or skip objects based on expressions\n"
                                486                 :                :              "                               in FILENAME\n"));
 3695 alvherre@alvh.no-ip.      487                 :CBC           1 :     printf(_("  --if-exists                  use IF EXISTS when dropping objects\n"));
 2119 michael@paquier.xyz       488                 :              1 :     printf(_("  --no-comments                do not restore comments\n"));
 4349 peter_e@gmx.net           489                 :              1 :     printf(_("  --no-data-for-failed-tables  do not restore data of tables that could not be\n"
                                490                 :                :              "                               created\n"));
 2529                           491                 :              1 :     printf(_("  --no-publications            do not restore publications\n"));
 4349                           492                 :              1 :     printf(_("  --no-security-labels         do not restore security labels\n"));
 2532                           493                 :              1 :     printf(_("  --no-subscriptions           do not restore subscriptions\n"));
  818 michael@paquier.xyz       494                 :              1 :     printf(_("  --no-table-access-method     do not restore table access methods\n"));
 4349 peter_e@gmx.net           495                 :              1 :     printf(_("  --no-tablespaces             do not restore tablespace assignments\n"));
 3522                           496                 :              1 :     printf(_("  --section=SECTION            restore named section (pre-data, data, or post-data)\n"));
 3135 teodor@sigaev.ru          497                 :              1 :     printf(_("  --strict-names               require table and/or schema include patterns to\n"
                                498                 :                :              "                               match at least one entity each\n"));
   13 tgl@sss.pgh.pa.us         499                 :GNC           1 :     printf(_("  --transaction-size=N         commit after every N objects\n"));
 5869 tgl@sss.pgh.pa.us         500                 :CBC           1 :     printf(_("  --use-set-session-authorization\n"
                                501                 :                :              "                               use SET SESSION AUTHORIZATION commands instead of\n"
                                502                 :                :              "                               ALTER OWNER commands to set ownership\n"));
                                503                 :                : 
 7849 peter_e@gmx.net           504                 :              1 :     printf(_("\nConnection options:\n"));
 7613 bruce@momjian.us          505                 :              1 :     printf(_("  -h, --host=HOSTNAME      database server host or socket directory\n"));
 7849 peter_e@gmx.net           506                 :              1 :     printf(_("  -p, --port=PORT          database server port number\n"));
                                507                 :              1 :     printf(_("  -U, --username=NAME      connect as specified database user\n"));
 5526                           508                 :              1 :     printf(_("  -w, --no-password        never prompt for password\n"));
 7849                           509                 :              1 :     printf(_("  -W, --password           force password prompt (should happen automatically)\n"));
 4708                           510                 :              1 :     printf(_("  --role=ROLENAME          do SET ROLE before restore\n"));
                                511                 :                : 
 3522                           512                 :              1 :     printf(_("\n"
                                513                 :                :              "The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
                                514                 :                :              "multiple times to select multiple objects.\n"));
 7900                           515                 :              1 :     printf(_("\nIf no input file name is supplied, then standard input is used.\n\n"));
 1507 peter@eisentraut.org      516                 :              1 :     printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
                                517                 :              1 :     printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
 8668 pjw@rhyme.com.au          518                 :              1 : }
                                519                 :                : 
                                520                 :                : /*
                                521                 :                :  * read_restore_filters - retrieve object identifier patterns from file
                                522                 :                :  *
                                523                 :                :  * Parse the specified filter file for include and exclude patterns, and add
                                524                 :                :  * them to the relevant lists.  If the filename is "-" then filters will be
                                525                 :                :  * read from STDIN rather than a file.
                                526                 :                :  */
                                527                 :                : static void
  137 dgustafsson@postgres      528                 :GNC          10 : read_restore_filters(const char *filename, RestoreOptions *opts)
                                529                 :                : {
                                530                 :                :     FilterStateData fstate;
                                531                 :                :     char       *objname;
                                532                 :                :     FilterCommandType comtype;
                                533                 :                :     FilterObjectType objtype;
                                534                 :                : 
                                535                 :             10 :     filter_init(&fstate, filename, exit_nicely);
                                536                 :                : 
                                537         [ +  + ]:             27 :     while (filter_read_item(&fstate, &objname, &comtype, &objtype))
                                538                 :                :     {
                                539         [ +  + ]:             11 :         if (comtype == FILTER_COMMAND_TYPE_INCLUDE)
                                540                 :                :         {
                                541   [ -  +  +  +  :              8 :             switch (objtype)
                                        +  +  +  - ]
                                542                 :                :             {
  137 dgustafsson@postgres      543                 :UNC           0 :                 case FILTER_OBJECT_TYPE_NONE:
                                544                 :              0 :                     break;
  137 dgustafsson@postgres      545                 :GNC           2 :                 case FILTER_OBJECT_TYPE_TABLE_DATA:
                                546                 :                :                 case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN:
                                547                 :                :                 case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN:
                                548                 :                :                 case FILTER_OBJECT_TYPE_DATABASE:
                                549                 :                :                 case FILTER_OBJECT_TYPE_EXTENSION:
                                550                 :                :                 case FILTER_OBJECT_TYPE_FOREIGN_DATA:
  136                           551                 :              2 :                     pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"),
                                552                 :                :                                         "include",
                                553                 :                :                                         filter_object_type_name(objtype));
  137                           554                 :              2 :                     exit_nicely(1);
                                555                 :                : 
                                556                 :              2 :                 case FILTER_OBJECT_TYPE_FUNCTION:
                                557                 :              2 :                     opts->selTypes = 1;
                                558                 :              2 :                     opts->selFunction = 1;
                                559                 :              2 :                     simple_string_list_append(&opts->functionNames, objname);
                                560                 :              2 :                     break;
                                561                 :              1 :                 case FILTER_OBJECT_TYPE_INDEX:
                                562                 :              1 :                     opts->selTypes = 1;
                                563                 :              1 :                     opts->selIndex = 1;
                                564                 :              1 :                     simple_string_list_append(&opts->indexNames, objname);
                                565                 :              1 :                     break;
                                566                 :              1 :                 case FILTER_OBJECT_TYPE_SCHEMA:
                                567                 :              1 :                     simple_string_list_append(&opts->schemaNames, objname);
                                568                 :              1 :                     break;
                                569                 :              1 :                 case FILTER_OBJECT_TYPE_TABLE:
                                570                 :              1 :                     opts->selTypes = 1;
                                571                 :              1 :                     opts->selTable = 1;
                                572                 :              1 :                     simple_string_list_append(&opts->tableNames, objname);
                                573                 :              1 :                     break;
                                574                 :              1 :                 case FILTER_OBJECT_TYPE_TRIGGER:
                                575                 :              1 :                     opts->selTypes = 1;
                                576                 :              1 :                     opts->selTrigger = 1;
                                577                 :              1 :                     simple_string_list_append(&opts->triggerNames, objname);
                                578                 :              1 :                     break;
                                579                 :                :             }
                                580                 :                :         }
                                581         [ +  - ]:              3 :         else if (comtype == FILTER_COMMAND_TYPE_EXCLUDE)
                                582                 :                :         {
                                583   [ -  +  +  - ]:              3 :             switch (objtype)
                                584                 :                :             {
  137 dgustafsson@postgres      585                 :UNC           0 :                 case FILTER_OBJECT_TYPE_NONE:
                                586                 :              0 :                     break;
  137 dgustafsson@postgres      587                 :GNC           2 :                 case FILTER_OBJECT_TYPE_TABLE_DATA:
                                588                 :                :                 case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN:
                                589                 :                :                 case FILTER_OBJECT_TYPE_DATABASE:
                                590                 :                :                 case FILTER_OBJECT_TYPE_EXTENSION:
                                591                 :                :                 case FILTER_OBJECT_TYPE_FOREIGN_DATA:
                                592                 :                :                 case FILTER_OBJECT_TYPE_FUNCTION:
                                593                 :                :                 case FILTER_OBJECT_TYPE_INDEX:
                                594                 :                :                 case FILTER_OBJECT_TYPE_TABLE:
                                595                 :                :                 case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN:
                                596                 :                :                 case FILTER_OBJECT_TYPE_TRIGGER:
  136                           597                 :              2 :                     pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"),
                                598                 :                :                                         "exclude",
                                599                 :                :                                         filter_object_type_name(objtype));
  137                           600                 :              2 :                     exit_nicely(1);
                                601                 :                : 
                                602                 :              1 :                 case FILTER_OBJECT_TYPE_SCHEMA:
                                603                 :              1 :                     simple_string_list_append(&opts->schemaExcludeNames, objname);
                                604                 :              1 :                     break;
                                605                 :                :             }
                                606                 :                :         }
                                607                 :                :         else
                                608                 :                :         {
  137 dgustafsson@postgres      609         [ #  # ]:UNC           0 :             Assert(comtype == FILTER_COMMAND_TYPE_NONE);
                                610         [ #  # ]:              0 :             Assert(objtype == FILTER_OBJECT_TYPE_NONE);
                                611                 :                :         }
                                612                 :                : 
  137 dgustafsson@postgres      613         [ -  + ]:GNC           7 :         if (objname)
                                614                 :              7 :             free(objname);
                                615                 :                :     }
                                616                 :                : 
                                617                 :              6 :     filter_free(&fstate);
                                618                 :              6 : }
        

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