Add register plugin API

This commit is contained in:
Jinzhu 2020-06-23 09:38:51 +08:00
parent e77e7bb842
commit f4bfc435cc
3 changed files with 24 additions and 0 deletions

View File

@ -27,4 +27,6 @@ var (
ErrorModelValueRequired = errors.New("model value required") ErrorModelValueRequired = errors.New("model value required")
// ErrUnsupportedDriver unsupported driver // ErrUnsupportedDriver unsupported driver
ErrUnsupportedDriver = errors.New("unsupported driver") ErrUnsupportedDriver = errors.New("unsupported driver")
// ErrRegistered registered
ErrRegistered = errors.New("registered")
) )

15
gorm.go
View File

@ -39,6 +39,8 @@ type Config struct {
ConnPool ConnPool ConnPool ConnPool
// Dialector database dialector // Dialector database dialector
Dialector Dialector
// Plugins registered plugins
Plugins map[string]Plugin
callbacks *callbacks callbacks *callbacks
cacheStore *sync.Map cacheStore *sync.Map
@ -309,3 +311,16 @@ func (db *DB) SetupJoinTable(model interface{}, field string, joinTable interfac
return nil return nil
} }
func (db *DB) Use(plugin Plugin) (err error) {
name := plugin.Name()
if _, ok := db.Plugins[name]; !ok {
if err = plugin.Initialize(db); err == nil {
db.Plugins[name] = plugin
}
} else {
return ErrRegistered
}
return err
}

View File

@ -20,6 +20,12 @@ type Dialector interface {
Explain(sql string, vars ...interface{}) string Explain(sql string, vars ...interface{}) string
} }
// Plugin GORM plugin interface
type Plugin interface {
Name() string
Initialize(*DB) error
}
// ConnPool db conns pool interface // ConnPool db conns pool interface
type ConnPool interface { type ConnPool interface {
PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error)
@ -28,6 +34,7 @@ type ConnPool interface {
QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row
} }
// SavePointerDialectorInterface save pointer interface
type SavePointerDialectorInterface interface { type SavePointerDialectorInterface interface {
SavePoint(tx *DB, name string) error SavePoint(tx *DB, name string) error
RollbackTo(tx *DB, name string) error RollbackTo(tx *DB, name string) error