/
catchup_file_unwrapper.go
60 lines (54 loc) · 1.61 KB
/
catchup_file_unwrapper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package postgres
import (
"archive/tar"
"io"
"os"
"github.com/pkg/errors"
)
// CatchupFileUnwrapper is used for catchup (catchup-push) backups
type CatchupFileUnwrapper struct {
BackupFileUnwrapper
}
func (u *CatchupFileUnwrapper) UnwrapNewFile(reader io.Reader, header *tar.Header,
file *os.File) (*FileUnwrapResult, error) {
if u.options.isIncremented {
targetReadWriterAt, err := NewReadWriterAtFrom(file)
if err != nil {
return nil, err
}
missingBlockCount, err := CreateFileFromIncrement(reader, targetReadWriterAt)
if err != nil {
return nil, errors.Wrapf(err, "Interpret: failed to create file from increment '%s'", file.Name())
}
return NewCreatedFromIncrementResult(missingBlockCount), nil
}
err := u.writeLocalFile(reader, header, file)
if err != nil {
return nil, err
}
return NewCompletedResult(), nil
}
func (u *CatchupFileUnwrapper) UnwrapExistingFile(reader io.Reader, header *tar.Header,
file *os.File) (*FileUnwrapResult, error) {
if u.options.isIncremented {
targetReadWriterAt, err := NewReadWriterAtFrom(file)
if err != nil {
return nil, err
}
restoredBlockCount, err := WritePagesFromIncrement(reader, targetReadWriterAt, true)
if err != nil {
return nil, errors.Wrapf(err, "Interpret: failed to write increment to file '%s'", file.Name())
}
return NewWroteIncrementBlocksResult(restoredBlockCount), nil
}
// clear the local file because there is a newer version for it
err := u.clearLocalFile(file)
if err != nil {
return nil, err
}
err = u.writeLocalFile(reader, header, file)
if err != nil {
return nil, err
}
return NewCompletedResult(), nil
}