diff --git a/model/database.go b/model/database.go index 06675dc..b813ab6 100644 --- a/model/database.go +++ b/model/database.go @@ -96,18 +96,23 @@ func (database *Database) Backup(eventName, reason string) error { } filename := fmt.Sprintf("%s/%s_%s_%s.db", backupsPath, strings.Replace(eventName, " ", "_", -1), time.Now().Format("20060102150405"), reason) - src, err := os.Open(database.Path) - if err != nil { - return err - } - defer src.Close() + dest, err := os.Create(filename) if err != nil { return err } defer dest.Close() - if _, err := io.Copy(dest, src); err != nil { + + if err = database.WriteBackup(dest); err != nil { return err } return nil } + +// Takes a snapshot of Bolt database and writes it to the given writer. +func (database *Database) WriteBackup(writer io.Writer) error { + return database.bolt.View(func(tx *bbolt.Tx) error { + _, err := tx.WriteTo(writer) + return err + }) +} diff --git a/web/setup_settings.go b/web/setup_settings.go index 8076a5d..078e1cb 100755 --- a/web/setup_settings.go +++ b/web/setup_settings.go @@ -111,16 +111,14 @@ func (web *Web) saveDbHandler(w http.ResponseWriter, r *http.Request) { return } - dbFile, err := os.Open(web.arena.Database.Path) - defer dbFile.Close() - if err != nil { - handleWebErr(w, err) - return - } filename := fmt.Sprintf("%s-%s.db", strings.Replace(web.arena.EventSettings.Name, " ", "_", -1), time.Now().Format("20060102150405")) w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - http.ServeContent(w, r, "", time.Now(), dbFile) + + if err := web.arena.Database.WriteBackup(w); err != nil { + handleWebErr(w, err) + return + } } // Accepts an event database file as an upload and loads it.