Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0ae5a66

Browse files
committed
partial_restore_type as separate type
1 parent 454eeac commit 0ae5a66

File tree

4 files changed

+36
-12
lines changed

4 files changed

+36
-12
lines changed

src/pg_probackup.c

+19-3
Original file line numberDiff line numberDiff line change
@@ -609,23 +609,29 @@ main(int argc, char *argv[])
609609
restore_params->skip_block_validation = skip_block_validation;
610610
restore_params->skip_external_dirs = skip_external_dirs;
611611
restore_params->partial_db_list = NULL;
612+
restore_params->partial_restore_type = NONE;
612613

613614
/* handle partial restore parameters */
614615
if (datname_exclude_list && datname_include_list)
615616
elog(ERROR, "You cannot specify '--db-include' and '--db-exclude' together");
616617

617618
if (datname_exclude_list)
618619
{
619-
restore_params->is_include_list = false;
620+
restore_params->partial_restore_type = EXCLUDE;
620621
restore_params->partial_db_list = datname_exclude_list;
621622
}
622623
else if (datname_include_list)
623624
{
624-
restore_params->is_include_list = true;
625+
restore_params->partial_restore_type = INCLUDE;
625626
restore_params->partial_db_list = datname_include_list;
626627
}
627628
}
628629

630+
/* sanity */
631+
if (backup_subcmd == VALIDATE_CMD && restore_params->no_validate)
632+
elog(ERROR, "You cannot specify \"--no-validate\" option with the \"%s\" command",
633+
command_name);
634+
629635
if (num_threads < 1)
630636
num_threads = 1;
631637

@@ -663,8 +669,15 @@ main(int argc, char *argv[])
663669
restore_params);
664670
case VALIDATE_CMD:
665671
if (current.backup_id == 0 && target_time == 0 && target_xid == 0 && !target_lsn)
672+
{
673+
/* sanity */
674+
if (datname_exclude_list || datname_include_list)
675+
elog(ERROR, "You must specify parameter (-i, --backup-id) for partial validation");
676+
666677
return do_validate_all();
678+
}
667679
else
680+
/* PITR validation and, optionally, partial validation */
668681
return do_restore_or_validate(current.backup_id,
669682
recovery_target_options,
670683
restore_params);
@@ -797,7 +810,10 @@ opt_datname_include_list(ConfigOption *opt, const char *arg)
797810

798811
dbname = pgut_malloc(strlen(arg) + 1);
799812

800-
/* TODO add sanity for database name */
813+
if (strcmp(dbname, "tempate0") == 0 ||
814+
strcmp(dbname, "tempate1") == 0)
815+
elog(ERROR, "Databases 'template0' and 'template1' cannot be used for partial restore or validation");
816+
801817
strcpy(dbname, arg);
802818

803819
parray_append(datname_include_list, dbname);

src/pg_probackup.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ typedef struct db_map_entry
9191
char *datname;
9292
} db_map_entry;
9393

94+
typedef enum PartialRestoreType
95+
{
96+
NONE,
97+
INCLUDE,
98+
EXCLUDE,
99+
} PartialRestoreType;
100+
94101
typedef enum CompressAlg
95102
{
96103
NOT_DEFINED_COMPRESS = 0,
@@ -348,7 +355,7 @@ typedef struct pgRestoreParams
348355
bool skip_block_validation;
349356

350357
/* options for partial restore */
351-
bool is_include_list;
358+
PartialRestoreType partial_restore_type;
352359
parray *partial_db_list;
353360
} pgRestoreParams;
354361

@@ -512,8 +519,9 @@ extern pgRecoveryTarget *parseRecoveryTargetOptions(
512519
const char *target_inclusive, TimeLineID target_tli, const char* target_lsn,
513520
const char *target_stop, const char *target_name,
514521
const char *target_action);
522+
515523
extern parray *get_dbOid_exclude_list(pgBackup *backup, parray *files,
516-
parray *datname_list, bool partial_restore_type);
524+
parray *datname_list, PartialRestoreType partial_restore_type);
517525

518526
/* in merge.c */
519527
extern void do_merge(time_t backup_id);

src/restore.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ do_restore_or_validate(time_t target_backup_id, pgRecoveryTarget *rt,
459459
*/
460460
if (params->partial_db_list)
461461
dbOid_exclude_list = get_dbOid_exclude_list(dest_backup, dest_files, params->partial_db_list,
462-
params->is_include_list);
462+
params->partial_restore_type);
463463

464464
/*
465465
* Restore dest_backup internal directories.
@@ -1183,7 +1183,7 @@ parseRecoveryTargetOptions(const char *target_time,
11831183
*/
11841184
parray *
11851185
get_dbOid_exclude_list(pgBackup *backup, parray *files,
1186-
parray *datname_list, bool is_include_list)
1186+
parray *datname_list, PartialRestoreType partial_restore_type)
11871187
{
11881188
int i;
11891189
int j;
@@ -1233,9 +1233,9 @@ get_dbOid_exclude_list(pgBackup *backup, parray *files,
12331233
* So we have a list of datnames and a database_map for it.
12341234
* We must construct a list of dbOids to exclude.
12351235
*/
1236-
if (is_include_list)
1236+
if (partial_restore_type == INCLUDE)
12371237
{
1238-
/* For 'include' keep dbOid of every datname NOT specified by user */
1238+
/* For 'include', keep dbOid of every datname NOT specified by user */
12391239
for (i = 0; i < parray_num(datname_list); i++)
12401240
{
12411241
bool found_match = false;
@@ -1270,9 +1270,9 @@ get_dbOid_exclude_list(pgBackup *backup, parray *files,
12701270
parray_append(dbOid_exclude_list, &db_entry->dbOid);
12711271
}
12721272
}
1273-
else
1273+
else if (partial_restore_type == EXCLUDE)
12741274
{
1275-
/* For exclude job is easier, find dbOid for every specified datname */
1275+
/* For exclude, job is easier - find dbOid for every specified datname */
12761276
for (i = 0; i < parray_num(datname_list); i++)
12771277
{
12781278
bool found_match = false;

src/validate.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pgBackupValidate(pgBackup *backup, pgRestoreParams *params)
109109

110110
if (params && params->partial_db_list)
111111
dbOid_exclude_list = get_dbOid_exclude_list(backup, files, params->partial_db_list,
112-
params->is_include_list);
112+
params->partial_restore_type);
113113

114114
/* setup threads */
115115
for (i = 0; i < parray_num(files); i++)

0 commit comments

Comments
 (0)