(log zerolog.Logger, cfg *vo.AppConfig)
| 19 | ) |
| 20 | |
| 21 | func backupDatabase(log zerolog.Logger, cfg *vo.AppConfig) { |
| 22 | if !fs_util.Exists(cfg.DB) { |
| 23 | log.Debug().Msgf("原数据库不存在, 所以无需备份数据库") |
| 24 | return |
| 25 | } |
| 26 | |
| 27 | db, err := gorm.Open(sqlite.Open(cfg.DB)) |
| 28 | if err != nil { |
| 29 | log.Fatal().Msgf("打开原数据库出错, err: %v", err) |
| 30 | return |
| 31 | } |
| 32 | |
| 33 | var sysConfig string |
| 34 | db.Raw("SELECT content FROM SysConfig").Scan(&sysConfig) |
| 35 | |
| 36 | var config map[string]any |
| 37 | err = json.Unmarshal([]byte(sysConfig), &config) |
| 38 | if err != nil { |
| 39 | log.Fatal().Msgf("反序列化原配置出错, err: %v", err) |
| 40 | return |
| 41 | } |
| 42 | |
| 43 | version, ok := config["version"].(string) |
| 44 | if !ok { |
| 45 | version = "unknown" |
| 46 | } |
| 47 | |
| 48 | commitId, ok = config["commitId"].(string) |
| 49 | if !ok { |
| 50 | commitId = "unknown" |
| 51 | } |
| 52 | |
| 53 | if version == cfg.Version && commitId == cfg.CommitId { |
| 54 | log.Debug().Msgf("当前版本和上次启动时的版本一致, 所以无需备份数据库, version: %s, commitId: %s", version, commitId) |
| 55 | return |
| 56 | } |
| 57 | |
| 58 | log.Info().Msgf("开始备份数据库") |
| 59 | |
| 60 | sourceFile, err := os.Open(cfg.DB) |
| 61 | if err != nil { |
| 62 | log.Error().Msgf("打开原数据库文件出错, err: %v", err) |
| 63 | return |
| 64 | } |
| 65 | defer sourceFile.Close() |
| 66 | |
| 67 | now := time.Now() |
| 68 | datetime := now.Format("2006-01-02-15-04-05") |
| 69 | destinationFileName := fmt.Sprintf("backup-%s-%s-%s.sqlite3", datetime, version, commitId) |
| 70 | |
| 71 | destinationFile, err := os.Create(path.Join(path.Dir(cfg.DB), destinationFileName)) |
| 72 | if err != nil { |
| 73 | log.Error().Msgf("创建备份数据库文件失败, err: %v", err) |
| 74 | return |
| 75 | } |
| 76 | defer destinationFile.Close() |
| 77 | |
| 78 | _, err = io.Copy(destinationFile, sourceFile) |
no test coverage detected