package main import ( "fmt" "log" "log/slog" "os" "time" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func NewDatabase(path string) *gorm.DB { sl := slog.With("source", "database") l := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: time.Second, Colorful: false, }, ) db, err := gorm.Open(sqlite.Open(path), &gorm.Config{ Logger: l, }) if err != nil { sl.Error("failed to open database", "err", err) } db.Exec("PRAGMA journal_mode=WAL") return db } func (b *Backend) CleanlyClose() error { closeDb := func(db *gorm.DB) error { if err := db.Exec("PRAGMA wal_checkpoint(TRUNCATE)").Error; err != nil { return fmt.Errorf("failed checkpointing the WAL: %w", err) } rawDb, err := db.DB() if err != nil { return fmt.Errorf("failed getting underlying DB connection: %w", err) } if err := rawDb.Close(); err != nil { return fmt.Errorf("failed closing underlying DB connection: %w", err) } return nil } if err := closeDb(b.state); err != nil { return fmt.Errorf("failed to close state database: %w", err) } if err := closeDb(b.data); err != nil { return fmt.Errorf("failed to close content database: %w", err) } return nil }