2222do_delete (time_t backup_id )
2323{
2424int i ;
25- int last_index ;
26- parray * backup_list ;
27- pgBackup * last_backup = NULL ;
25+ parray * backup_list ,
26+ * delete_list ;
27+ time_t parent_id = 0 ;
28+ bool backup_found = false;
2829
2930/* DATE are always required */
3031if (backup_id == 0 )
@@ -38,47 +39,59 @@ do_delete(time_t backup_id)
3839if (!backup_list )
3940elog (ERROR ,"no backup list found, can't process any more" );
4041
41- /* Find backup to be deleted */
42- for (i = 0 ;i < parray_num (backup_list );i ++ )
42+ delete_list = parray_new ();
43+
44+ /* Find backup to be deleted and make increment backups array to be deleted */
45+ for (i = (int )parray_num (backup_list )- 1 ;i >=0 ;i -- )
4346{
44- last_backup = (pgBackup * )parray_get (backup_list ,i );
45- if (last_backup -> start_time == backup_id )
46- gotofound_backup ;
47- }
47+ pgBackup * backup = (pgBackup * )parray_get (backup_list , (size_t )i );
4848
49- elog (ERROR ,"no backup found, cannot delete." );
49+ if (backup -> start_time == backup_id )
50+ {
51+ parray_append (delete_list ,backup );
5052
51- found_backup :
52- last_index = i ;
53- /* check for interrupt */
54- if (interrupted )
55- elog (ERROR ,"interrupted during delete backup" );
53+ /*
54+ * Do not remove next backups, if target backup was finished
55+ * incorrectly.
56+ */
57+ if (backup -> status == BACKUP_STATUS_ERROR )
58+ break ;
5659
57- /* just do it */
58- pgBackupDeleteFiles (last_backup );
60+ /* Save backup id to retreive increment backups */
61+ parent_id = backup -> start_time ;
62+ backup_found = true;
63+ }
64+ else if (backup_found )
65+ {
66+ if (backup -> backup_mode != BACKUP_MODE_FULL &&
67+ backup -> parent_backup == parent_id )
68+ {
69+ /* Append to delete list increment backup */
70+ parray_append (delete_list ,backup );
71+ /* Save backup id to retreive increment backups */
72+ parent_id = backup -> start_time ;
73+ }
74+ else
75+ break ;
76+ }
77+ }
5978
60- /*
61- * Do not remove next backups, if current backup is not full backup and
62- * was finished incorrectly.
63- */
64- if (last_backup -> status != BACKUP_STATUS_OK &&
65- last_backup -> status != BACKUP_STATUS_CORRUPT &&
66- last_backup -> backup_mode != BACKUP_MODE_FULL )
67- return 0 ;
79+ if (parray_num (delete_list )== 0 )
80+ elog (ERROR ,"no backup found, cannot delete" );
6881
69- /*Remove all increments after removed backup */
70- for (i = last_index - 1 ;i >=0 ;i -- )
82+ /*Delete backups from the end of list */
83+ for (i = ( int ) parray_num ( delete_list ) - 1 ;i >=0 ;i -- )
7184{
72- pgBackup * backup = (pgBackup * )parray_get (backup_list , i );
85+ pgBackup * backup = (pgBackup * )parray_get (delete_list , ( size_t ) i );
7386
74- /* Stop removing increments */
75- if (backup -> backup_mode >=BACKUP_MODE_FULL )
76- break ;
87+ if (interrupted )
88+ elog (ERROR ,"interrupted during delete backup" );
7789
7890pgBackupDeleteFiles (backup );
7991}
8092
8193/* cleanup */
94+ parray_free (delete_list );
8295parray_walk (backup_list ,pgBackupFree );
8396parray_free (backup_list );
8497
@@ -295,6 +308,7 @@ pgBackupDeleteFiles(pgBackup *backup)
295308
296309parray_walk (files ,pgFileFree );
297310parray_free (files );
311+ backup -> status = BACKUP_STATUS_DELETED ;
298312
299313return 0 ;
300314}