functional option for gorm Config and add OpenWithOption create *db.DB with ConfigOption
This commit is contained in:
parent
3d3208ed60
commit
95fff37f1a
147
config_option.go
Normal file
147
config_option.go
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
package gorm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gorm.io/gorm/clause"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
|
"gorm.io/gorm/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConfigOption use functional option for gorm Config.
|
||||||
|
type ConfigOption func(c *Config)
|
||||||
|
|
||||||
|
// WithSkipDefaultTransaction enable SkipDefaultTransaction.
|
||||||
|
func WithSkipDefaultTransaction() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.SkipDefaultTransaction = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNameStrategy set shema namer.
|
||||||
|
func WithNameStrategy(namer schema.Namer) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.NamingStrategy = namer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFullSaveAssociations set FullSaveAssociations = true.
|
||||||
|
func WithFullSaveAssociations() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.FullSaveAssociations = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithLogger set logger.
|
||||||
|
func WithLogger(logger logger.Interface) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.Logger = logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNowFunc set now func.
|
||||||
|
func WithNowFunc(fn func() time.Time) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.NowFunc = fn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEnableDryRun enable dry run.
|
||||||
|
func WithEnableDryRun() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.DryRun = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithPrepareStmt enable PrepareStmt.
|
||||||
|
func WithPrepareStmt() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.PrepareStmt = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEnableAutomaticPing enable ping.
|
||||||
|
func WithEnableAutomaticPing() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.DisableAutomaticPing = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEnableForeignKeyConstraintWhenMigrating
|
||||||
|
// ForeignKeyConstraintWhenMigrating config.
|
||||||
|
func WithEnableForeignKeyConstraintWhenMigrating() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.DisableForeignKeyConstraintWhenMigrating = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEnableNestedTransaction enable NestedTransaction.
|
||||||
|
func WithEnableNestedTransaction() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.DisableNestedTransaction = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAllowGlobalUpdate allow global update.
|
||||||
|
func WithAllowGlobalUpdate() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.AllowGlobalUpdate = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithEnableQueryFields open QueryFields.
|
||||||
|
func WithEnableQueryFields() ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.QueryFields = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCreateBatchSize set batch size.
|
||||||
|
func WithCreateBatchSize(size int) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.CreateBatchSize = size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithClauseBuilders set clause builder.
|
||||||
|
func WithClauseBuilders(m map[string]clause.ClauseBuilder) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.ClauseBuilders = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithConnPool set conn pool.
|
||||||
|
func WithConnPool(connPool ConnPool) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.ConnPool = connPool
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDialector set dialector.
|
||||||
|
func WithDialector(dialector Dialector) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.Dialector = dialector
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithConfigPlugins set config plugins.
|
||||||
|
func WithConfigPlugins(m map[string]Plugin) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.Plugins = m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithConfigCallbacks set cb for Config entry.
|
||||||
|
func WithConfigCallbacks(cb *callbacks) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.callbacks = cb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCacheStore set cacheStore for Config entry.
|
||||||
|
func WithCacheStore(s *sync.Map) ConfigOption {
|
||||||
|
return func(c *Config) {
|
||||||
|
c.cacheStore = s
|
||||||
|
}
|
||||||
|
}
|
74
gorm.go
74
gorm.go
@ -164,6 +164,80 @@ func Open(dialector Dialector, config *Config) (db *DB, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DefaultConfig default config.
|
||||||
|
func DefaultConfig() *Config {
|
||||||
|
c := &Config{
|
||||||
|
NamingStrategy: schema.NamingStrategy{},
|
||||||
|
Logger: logger.Default,
|
||||||
|
NowFunc: func() time.Time { return time.Now().Local() },
|
||||||
|
ClauseBuilders: map[string]clause.ClauseBuilder{},
|
||||||
|
Plugins: map[string]Plugin{},
|
||||||
|
cacheStore: &sync.Map{},
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply apply option for Config.
|
||||||
|
func (config *Config) Apply(opts ...ConfigOption) {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenWithOption create *db.DB with ConfigOption
|
||||||
|
// return *db.DB,error.
|
||||||
|
func OpenWithOption(dialector Dialector,
|
||||||
|
opts ...ConfigOption) (db *DB, err error) {
|
||||||
|
config := DefaultConfig()
|
||||||
|
|
||||||
|
// apply config option
|
||||||
|
config.Apply(opts...)
|
||||||
|
|
||||||
|
if dialector != nil {
|
||||||
|
config.Dialector = dialector
|
||||||
|
}
|
||||||
|
|
||||||
|
// create DB entry
|
||||||
|
db = &DB{Config: config, clone: 1}
|
||||||
|
db.callbacks = initializeCallbacks(db)
|
||||||
|
if config.Dialector != nil {
|
||||||
|
err = config.Dialector.Initialize(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
preparedStmt := &PreparedStmtDB{
|
||||||
|
ConnPool: db.ConnPool,
|
||||||
|
Stmts: map[string]Stmt{},
|
||||||
|
Mux: &sync.RWMutex{},
|
||||||
|
PreparedSQL: make([]string, 0, 100),
|
||||||
|
}
|
||||||
|
db.cacheStore.Store("preparedStmt", preparedStmt)
|
||||||
|
|
||||||
|
if config.PrepareStmt {
|
||||||
|
db.ConnPool = preparedStmt
|
||||||
|
}
|
||||||
|
|
||||||
|
db.Statement = &Statement{
|
||||||
|
DB: db,
|
||||||
|
ConnPool: db.ConnPool,
|
||||||
|
Context: context.Background(),
|
||||||
|
Clauses: map[string]clause.Clause{},
|
||||||
|
}
|
||||||
|
|
||||||
|
if err == nil && !config.DisableAutomaticPing {
|
||||||
|
if pinger, ok := db.ConnPool.(interface{ Ping() error }); ok {
|
||||||
|
err = pinger.Ping()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
config.Logger.Error(context.Background(),
|
||||||
|
"failed to initialize database, got error %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Session create new db session
|
// Session create new db session
|
||||||
func (db *DB) Session(config *Session) *DB {
|
func (db *DB) Session(config *Session) *DB {
|
||||||
var (
|
var (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user