package database import ( domainUpdate "RenewCMS/internal/domain/update" "fmt" "time" "gorm.io/gorm" ) type Config struct { Driver string Source string } type Driver interface { Open(source string) (*gorm.DB, error) NewBackup(db *gorm.DB, directory string, now func() time.Time) domainUpdate.DatabaseBackup } var drivers = map[string]Driver{ DriverSQLite: sqliteDriver{}, } type Connection struct { DB *gorm.DB driver Driver } func Connect(config Config) (*Connection, error) { driver, ok := drivers[config.Driver] if !ok { return nil, fmt.Errorf("unsupported database driver %q", config.Driver) } db, err := driver.Open(config.Source) if err != nil { return nil, err } return &Connection{DB: db, driver: driver}, nil } func (c *Connection) NewBackup(directory string, now func() time.Time) domainUpdate.DatabaseBackup { return c.driver.NewBackup(c.DB, directory, now) } func (c *Connection) Close() error { sqlDb, err := c.DB.DB() if err != nil { return err } return sqlDb.Close() }