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 }