mirror of
https://github.com/nxshock/backuper.git
synced 2024-11-28 00:21:02 +05:00
Calculate backup diff only from last full backup
This commit is contained in:
parent
959a356153
commit
85e1aa28a1
47
backuper.go
47
backuper.go
@ -27,7 +27,7 @@ type Mask struct {
|
|||||||
// FindAll возвращает индекс файлов, совпавших по маске
|
// FindAll возвращает индекс файлов, совпавших по маске
|
||||||
func (b *Config) FindAll(mask string) (*Index, error) {
|
func (b *Config) FindAll(mask string) (*Index, error) {
|
||||||
b.logf(LogLevelDebug, "Поиск маски %s...", mask)
|
b.logf(LogLevelDebug, "Поиск маски %s...", mask)
|
||||||
index, err := b.index()
|
index, err := b.index(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("index: %v", err)
|
return nil, fmt.Errorf("index: %v", err)
|
||||||
}
|
}
|
||||||
@ -50,7 +50,7 @@ func (b *Config) FindAll(mask string) (*Index, error) {
|
|||||||
// IncrementalBackup выполняет инкрементальный бекап.
|
// IncrementalBackup выполняет инкрементальный бекап.
|
||||||
// В случае, если бекап выполняется впервые, выполняется полный бекап.
|
// В случае, если бекап выполняется впервые, выполняется полный бекап.
|
||||||
func (b *Config) IncrementalBackup() error {
|
func (b *Config) IncrementalBackup() error {
|
||||||
index, err := b.index()
|
index, err := b.index(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ func (b *Config) doBackup(index *Index) error {
|
|||||||
suffix = "i" // Инкрементальный бекап
|
suffix = "i" // Инкрементальный бекап
|
||||||
}
|
}
|
||||||
|
|
||||||
filePath := filepath.Join(filepath.Dir(b.filePath), b.FileName+"_"+time.Now().Local().Format("2006-01-02_15-04-05")+suffix+defaultExt)
|
filePath := filepath.Join(filepath.Dir(b.filePath), b.FileName+"_"+time.Now().Local().Format(defaulFileNameTimeFormat)+suffix+defaultExt)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
filePath, err = filepath.Abs(filePath)
|
filePath, err = filepath.Abs(filePath)
|
||||||
@ -299,7 +299,7 @@ func (b *Config) addFileToTarWriter(filePath string, tarWriter *tar.Writer) erro
|
|||||||
|
|
||||||
// GetFileWithTime возвращает содержимое файла на указанную дату.
|
// GetFileWithTime возвращает содержимое файла на указанную дату.
|
||||||
func (b *Config) GetFileWithTime(path string, t time.Time, w io.Writer) error {
|
func (b *Config) GetFileWithTime(path string, t time.Time, w io.Writer) error {
|
||||||
index, err := b.index()
|
index, err := b.index(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ошибка при построении индекса: %v", err)
|
return fmt.Errorf("ошибка при построении индекса: %v", err)
|
||||||
}
|
}
|
||||||
@ -343,19 +343,46 @@ func (b *Config) GetFileWithTime(path string, t time.Time, w io.Writer) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Config) index() (*Index, error) {
|
// fullIndex - true = все файлы, false = только от последнего полного
|
||||||
|
func (b *Config) index(fullIndex bool) (*Index, error) {
|
||||||
b.logf(LogLevelInfo, "Построение индекса текущего архива из %s...", filepath.Dir(b.filePath))
|
b.logf(LogLevelInfo, "Построение индекса текущего архива из %s...", filepath.Dir(b.filePath))
|
||||||
fileMask := filepath.Join(filepath.Dir(b.filePath), b.FileName+"*"+defaultExt)
|
allFileMask := filepath.Join(filepath.Dir(b.filePath), b.FileName+"*"+defaultExt)
|
||||||
|
onlyFullBackupFileMask := filepath.Join(filepath.Dir(b.filePath), b.FileName+"*f"+defaultExt)
|
||||||
|
|
||||||
|
// Get last full backup name
|
||||||
|
lastFullBackupFileName := ""
|
||||||
|
err := filepath.WalkDir(filepath.Dir(b.filePath), func(path string, info os.DirEntry, err error) error {
|
||||||
|
matched, err := filepath.Match(onlyFullBackupFileMask, path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("filepath.WalkDir: %v", err)
|
||||||
|
}
|
||||||
|
if !matched {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
lastFullBackupFileName = path
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("filepath.WalkDir: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fullIndex {
|
||||||
|
b.logf(LogLevelDebug, "Отсчёт производится от %s.", filepath.Base(lastFullBackupFileName))
|
||||||
|
}
|
||||||
|
|
||||||
var files []string
|
var files []string
|
||||||
err := filepath.WalkDir(filepath.Dir(b.filePath), func(path string, info os.DirEntry, err error) error {
|
err = filepath.WalkDir(filepath.Dir(b.filePath), func(path string, info os.DirEntry, err error) error {
|
||||||
matched, err := filepath.Match(fileMask, path)
|
matched, err := filepath.Match(allFileMask, path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("filepath.Match: %v", err)
|
return fmt.Errorf("filepath.Match: %v", err)
|
||||||
}
|
}
|
||||||
if matched {
|
if matched && path >= lastFullBackupFileName {
|
||||||
|
if fullIndex || path >= lastFullBackupFileName {
|
||||||
files = append(files, path)
|
files = append(files, path)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -409,7 +436,7 @@ func (b *Config) index() (*Index, error) {
|
|||||||
|
|
||||||
// Test осуществляет проверку архивов и возвращает первую встретившуюся ошибку
|
// Test осуществляет проверку архивов и возвращает первую встретившуюся ошибку
|
||||||
func (b *Config) Test() error {
|
func (b *Config) Test() error {
|
||||||
_, err := b.index() // TODO: улучшить реализацию
|
_, err := b.index(true) // TODO: улучшить реализацию
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -6,4 +6,6 @@ const (
|
|||||||
|
|
||||||
// Формат времени для сообщений
|
// Формат времени для сообщений
|
||||||
defaultTimeFormat = "02.01.06 15:04"
|
defaultTimeFormat = "02.01.06 15:04"
|
||||||
|
|
||||||
|
defaulFileNameTimeFormat = "2006-01-02_15-04-05"
|
||||||
)
|
)
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
type ExtractionPlan map[string][]string // filepath - array of internal paths
|
type ExtractionPlan map[string][]string // filepath - array of internal paths
|
||||||
|
|
||||||
func (b *Backuper) extractionPlan(mask string, t time.Time) (ExtractionPlan, error) {
|
func (b *Backuper) extractionPlan(mask string, t time.Time) (ExtractionPlan, error) {
|
||||||
index, err := b.Config.index()
|
index, err := b.Config.index(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("extractionPlan: %v", err)
|
return nil, fmt.Errorf("extractionPlan: %v", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user