47 lines
1.0 KiB
Go
47 lines
1.0 KiB
Go
package database
|
|
|
|
import (
|
|
domain "RenewCMS/internal/domain/update"
|
|
"errors"
|
|
"os"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var errBackupExists = errors.New("a backup with this name already exists")
|
|
|
|
const (
|
|
backupsToKeep = 3
|
|
backupFileExtension = ".db"
|
|
backupFilePrefix = "renewcms-"
|
|
backupTimeLayout = "20060102T150405.000000000Z"
|
|
)
|
|
|
|
type SQLiteBackup struct {
|
|
db *gorm.DB
|
|
directory string
|
|
now func() time.Time
|
|
}
|
|
|
|
var _ domain.DatabaseBackup = &SQLiteBackup{}
|
|
|
|
func NewSQLiteBackup(db *gorm.DB, directory string, now func() time.Time) *SQLiteBackup {
|
|
return &SQLiteBackup{db: db, directory: directory, now: now}
|
|
}
|
|
|
|
func (b *SQLiteBackup) Backup() (string, error) {
|
|
target, err := newBackupTarget(b.directory, b.now(), backupFileExtension)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if err := b.db.Exec("VACUUM INTO ?", target).Error; err != nil {
|
|
_ = os.Remove(target)
|
|
return "", err
|
|
}
|
|
if err := pruneBackups(b.directory, backupFileExtension); err != nil {
|
|
return "", err
|
|
}
|
|
return target, nil
|
|
}
|