Files
RenewCMS/internal/infrastructure/persistence/database/sqlite.go
T

49 lines
1.1 KiB
Go

package database
import (
domainUpdate "RenewCMS/internal/domain/update"
"errors"
"fmt"
"os"
"path/filepath"
"time"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
const DriverSQLite = "sqlite"
const (
sqliteBusyTimeoutMs = 5000
sqliteResultBusy = 5
sqliteResultLocked = 6
sqlitePrimaryMask = 0xff
)
type sqliteDriver struct{}
func SQLiteDSN(dbName string) string {
return fmt.Sprintf("%s?_pragma=busy_timeout(%d)", dbName, sqliteBusyTimeoutMs)
}
func (sqliteDriver) Open(file string) (*gorm.DB, error) {
if err := os.MkdirAll(filepath.Dir(file), os.ModePerm); err != nil {
return nil, fmt.Errorf("unable to create necessary subdirectories: %w", err)
}
return gorm.Open(sqlite.Open(SQLiteDSN(file)), &gorm.Config{})
}
func (sqliteDriver) NewBackup(db *gorm.DB, directory string, now func() time.Time) domainUpdate.DatabaseBackup {
return NewSQLiteBackup(db, directory, now)
}
func (sqliteDriver) IsLockContention(err error) bool {
var coded interface{ Code() int }
if !errors.As(err, &coded) {
return false
}
primary := coded.Code() & sqlitePrimaryMask
return primary == sqliteResultBusy || primary == sqliteResultLocked
}