53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
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()
|
|
}
|