@@ -3,8 +3,10 @@ package main
33import (
44 "database/sql"
55 "fmt"
6+ "io"
67 "log"
78 "net/http"
9+ "os"
810 "slices"
911 "strconv"
1012 "strings"
@@ -268,6 +270,36 @@ func (r *Router) adminUsers(w http.ResponseWriter, req *http.Request) {
268270 }
269271}
270272
273+ const databaseFile = "backup.db"
274+
275+ func (r * Router ) adminDownloadDatabase (w http.ResponseWriter , req * http.Request ) {
276+ _ , err := r .db .ExecContext (req .Context (), "VACUUM" )
277+ if err != nil {
278+ log .Println ("Failed to vacuum database:" , err )
279+ http .Error (w , "Failed to vacuum database" , http .StatusInternalServerError )
280+ return
281+ }
282+ _ = os .Remove (databaseFile )
283+ _ , err = r .db .ExecContext (req .Context (), "VACUUM main INTO ?" , databaseFile )
284+ if err != nil {
285+ log .Println ("Failed to backup database to file:" , err )
286+ http .Error (w , "Failed to backup database to file" , http .StatusInternalServerError )
287+ return
288+ }
289+ f , err := os .Open (databaseFile )
290+ if err != nil {
291+ log .Println ("Failed to open database file:" , err )
292+ http .Error (w , "Failed to open database file" , http .StatusInternalServerError )
293+ return
294+ }
295+ _ , err = io .Copy (w , f )
296+ if err != nil {
297+ log .Println ("Failed to write database to writer:" , err )
298+ http .Error (w , "Failed to write database to writer" , http .StatusInternalServerError )
299+ return
300+ }
301+ }
302+
271303func (r * Router ) adminUserEdit (w http.ResponseWriter , req * http.Request ) {
272304 ny , _ := time .LoadLocation ("America/New_York" )
273305
0 commit comments