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
|
||||
}
|
||||
|
||||
// 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
|
||||
func (db *DB) Session(config *Session) *DB {
|
||||
var (
|
||||
|
Loading…
x
Reference in New Issue
Block a user