mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-04 07:06:36 +08:00
77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"github.com/pressly/goose/v3"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/schema"
|
|
)
|
|
|
|
func gooseDialectForBackend(backend string) (goose.Dialect, error) {
|
|
switch backend {
|
|
case "postgres":
|
|
return goose.DialectPostgres, nil
|
|
case "sqlite":
|
|
return goose.DialectSQLite3, nil
|
|
default:
|
|
return "", fmt.Errorf("unsupported database backend: %s", backend)
|
|
}
|
|
}
|
|
|
|
func getGORMDBFromSQLDB(db *sql.DB, backend string) (*gorm.DB, error) {
|
|
var dialector gorm.Dialector
|
|
switch backend {
|
|
case "postgres":
|
|
dialector = postgres.New(postgres.Config{Conn: db})
|
|
case "sqlite":
|
|
dialector = &sqlite.Dialector{Conn: db}
|
|
default:
|
|
return nil, fmt.Errorf("unsupported database backend: %s", backend)
|
|
}
|
|
|
|
gormDB, err := gorm.Open(dialector, &gorm.Config{
|
|
NamingStrategy: schema.NamingStrategy{},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := registerSharding(gormDB, backend); err != nil {
|
|
return nil, err
|
|
}
|
|
return gormDB, nil
|
|
}
|
|
|
|
func buildGooseProvider(db *gorm.DB, backend string) (*goose.Provider, error) {
|
|
sqlDB, err := db.DB()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dialect, err := gooseDialectForBackend(backend)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return goose.NewProvider(
|
|
dialect,
|
|
sqlDB,
|
|
nil,
|
|
goose.WithDisableGlobalRegistry(true),
|
|
goose.WithGoMigrations(buildGooseMigrations(backend)...),
|
|
)
|
|
}
|
|
|
|
func runGooseMigrations(db *gorm.DB, backend string) error {
|
|
provider, err := buildGooseProvider(db, backend)
|
|
if err != nil {
|
|
return fmt.Errorf("build goose provider: %w", err)
|
|
}
|
|
if _, err := provider.Up(context.Background()); err != nil {
|
|
return fmt.Errorf("goose up failed: %w", err)
|
|
}
|
|
return nil
|
|
}
|