mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 04:44:37 +03:00
Use post commit hook for post-create plugin hooks (#2920)
This commit is contained in:
@@ -70,12 +70,12 @@ func NewDeleter() *Deleter {
|
||||
|
||||
// RegisterHooks registers post-commit and post-rollback hooks.
|
||||
func (d *Deleter) RegisterHooks(ctx context.Context, mgr txn.Manager) {
|
||||
mgr.AddPostCommitHook(ctx, func(ctx context.Context) error {
|
||||
txn.AddPostCommitHook(ctx, func(ctx context.Context) error {
|
||||
d.Commit()
|
||||
return nil
|
||||
})
|
||||
|
||||
mgr.AddPostRollbackHook(ctx, func(ctx context.Context) error {
|
||||
txn.AddPostRollbackHook(ctx, func(ctx context.Context) error {
|
||||
d.Rollback()
|
||||
return nil
|
||||
})
|
||||
|
||||
@@ -68,7 +68,7 @@ func (h *ScanHandler) Handle(ctx context.Context, f file.File) error {
|
||||
return fmt.Errorf("creating new gallery: %w", err)
|
||||
}
|
||||
|
||||
h.PluginCache.ExecutePostHooks(ctx, newGallery.ID, plugin.GalleryCreatePost, nil, nil)
|
||||
h.PluginCache.RegisterPostHooks(ctx, newGallery.ID, plugin.GalleryCreatePost, nil, nil)
|
||||
|
||||
existing = []*models.Gallery{newGallery}
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ func (h *ScanHandler) Handle(ctx context.Context, f file.File) error {
|
||||
return fmt.Errorf("creating new image: %w", err)
|
||||
}
|
||||
|
||||
h.PluginCache.ExecutePostHooks(ctx, newImage.ID, plugin.ImageCreatePost, nil, nil)
|
||||
h.PluginCache.RegisterPostHooks(ctx, newImage.ID, plugin.ImageCreatePost, nil, nil)
|
||||
|
||||
existing = []*models.Image{newImage}
|
||||
}
|
||||
|
||||
@@ -200,8 +200,8 @@ func (c Cache) ExecutePostHooks(ctx context.Context, id int, hookType HookTrigge
|
||||
}
|
||||
}
|
||||
|
||||
func (c Cache) RegisterPostHooks(ctx context.Context, txnMgr txn.Manager, id int, hookType HookTriggerEnum, input interface{}, inputFields []string) {
|
||||
txnMgr.AddPostCommitHook(ctx, func(ctx context.Context) error {
|
||||
func (c Cache) RegisterPostHooks(ctx context.Context, id int, hookType HookTriggerEnum, input interface{}, inputFields []string) {
|
||||
txn.AddPostCommitHook(ctx, func(ctx context.Context) error {
|
||||
c.ExecutePostHooks(ctx, id, hookType, input, inputFields)
|
||||
return nil
|
||||
})
|
||||
|
||||
@@ -93,7 +93,7 @@ func (h *ScanHandler) Handle(ctx context.Context, f file.File) error {
|
||||
return fmt.Errorf("creating new scene: %w", err)
|
||||
}
|
||||
|
||||
h.PluginCache.ExecutePostHooks(ctx, newScene.ID, plugin.SceneCreatePost, nil, nil)
|
||||
h.PluginCache.RegisterPostHooks(ctx, newScene.ID, plugin.SceneCreatePost, nil, nil)
|
||||
|
||||
existing = []*models.Scene{newScene}
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
package sqlite
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/stashapp/stash/pkg/txn"
|
||||
)
|
||||
|
||||
type hookManager struct {
|
||||
postCommitHooks []txn.TxnFunc
|
||||
postRollbackHooks []txn.TxnFunc
|
||||
}
|
||||
|
||||
func (m *hookManager) register(ctx context.Context) context.Context {
|
||||
return context.WithValue(ctx, hookManagerKey, m)
|
||||
}
|
||||
|
||||
func (db *Database) hookManager(ctx context.Context) *hookManager {
|
||||
m, ok := ctx.Value(hookManagerKey).(*hookManager)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func (db *Database) executePostCommitHooks(ctx context.Context) {
|
||||
m := db.hookManager(ctx)
|
||||
for _, h := range m.postCommitHooks {
|
||||
// ignore errors
|
||||
_ = h(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
func (db *Database) executePostRollbackHooks(ctx context.Context) {
|
||||
m := db.hookManager(ctx)
|
||||
for _, h := range m.postRollbackHooks {
|
||||
// ignore errors
|
||||
_ = h(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
func (db *Database) AddPostCommitHook(ctx context.Context, hook txn.TxnFunc) {
|
||||
m := db.hookManager(ctx)
|
||||
m.postCommitHooks = append(m.postCommitHooks, hook)
|
||||
}
|
||||
|
||||
func (db *Database) AddPostRollbackHook(ctx context.Context, hook txn.TxnFunc) {
|
||||
m := db.hookManager(ctx)
|
||||
m.postRollbackHooks = append(m.postRollbackHooks, hook)
|
||||
}
|
||||
@@ -17,7 +17,6 @@ type key int
|
||||
const (
|
||||
txnKey key = iota + 1
|
||||
dbKey
|
||||
hookManagerKey
|
||||
)
|
||||
|
||||
func (db *Database) WithDatabase(ctx context.Context) (context.Context, error) {
|
||||
@@ -42,9 +41,6 @@ func (db *Database) Begin(ctx context.Context) (context.Context, error) {
|
||||
return nil, fmt.Errorf("beginning transaction: %w", err)
|
||||
}
|
||||
|
||||
hookMgr := &hookManager{}
|
||||
ctx = hookMgr.register(ctx)
|
||||
|
||||
return context.WithValue(ctx, txnKey, tx), nil
|
||||
}
|
||||
|
||||
@@ -58,9 +54,6 @@ func (db *Database) Commit(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// execute post-commit hooks
|
||||
db.executePostCommitHooks(ctx)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -74,9 +67,6 @@ func (db *Database) Rollback(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// execute post-rollback hooks
|
||||
db.executePostRollbackHooks(ctx)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
54
pkg/txn/hooks.go
Normal file
54
pkg/txn/hooks.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package txn
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
type key int
|
||||
|
||||
const (
|
||||
hookManagerKey key = iota + 1
|
||||
)
|
||||
|
||||
type hookManager struct {
|
||||
postCommitHooks []TxnFunc
|
||||
postRollbackHooks []TxnFunc
|
||||
}
|
||||
|
||||
func (m *hookManager) register(ctx context.Context) context.Context {
|
||||
return context.WithValue(ctx, hookManagerKey, m)
|
||||
}
|
||||
|
||||
func hookManagerCtx(ctx context.Context) *hookManager {
|
||||
m, ok := ctx.Value(hookManagerKey).(*hookManager)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func executePostCommitHooks(ctx context.Context) {
|
||||
m := hookManagerCtx(ctx)
|
||||
for _, h := range m.postCommitHooks {
|
||||
// ignore errors
|
||||
_ = h(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
func executePostRollbackHooks(ctx context.Context) {
|
||||
m := hookManagerCtx(ctx)
|
||||
for _, h := range m.postRollbackHooks {
|
||||
// ignore errors
|
||||
_ = h(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
func AddPostCommitHook(ctx context.Context, hook TxnFunc) {
|
||||
m := hookManagerCtx(ctx)
|
||||
m.postCommitHooks = append(m.postCommitHooks, hook)
|
||||
}
|
||||
|
||||
func AddPostRollbackHook(ctx context.Context, hook TxnFunc) {
|
||||
m := hookManagerCtx(ctx)
|
||||
m.postRollbackHooks = append(m.postRollbackHooks, hook)
|
||||
}
|
||||
@@ -11,9 +11,6 @@ type Manager interface {
|
||||
Rollback(ctx context.Context) error
|
||||
|
||||
IsLocked(err error) bool
|
||||
|
||||
AddPostCommitHook(ctx context.Context, hook TxnFunc)
|
||||
AddPostRollbackHook(ctx context.Context, hook TxnFunc)
|
||||
}
|
||||
|
||||
type DatabaseProvider interface {
|
||||
@@ -26,7 +23,7 @@ type TxnFunc func(ctx context.Context) error
|
||||
// the transaction is rolled back. Otherwise it is committed.
|
||||
func WithTxn(ctx context.Context, m Manager, fn TxnFunc) error {
|
||||
var err error
|
||||
ctx, err = m.Begin(ctx)
|
||||
ctx, err = begin(ctx, m)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -34,16 +31,16 @@ func WithTxn(ctx context.Context, m Manager, fn TxnFunc) error {
|
||||
defer func() {
|
||||
if p := recover(); p != nil {
|
||||
// a panic occurred, rollback and repanic
|
||||
_ = m.Rollback(ctx)
|
||||
rollback(ctx, m)
|
||||
panic(p)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
// something went wrong, rollback
|
||||
_ = m.Rollback(ctx)
|
||||
rollback(ctx, m)
|
||||
} else {
|
||||
// all good, commit
|
||||
err = m.Commit(ctx)
|
||||
err = commit(ctx, m)
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -51,6 +48,36 @@ func WithTxn(ctx context.Context, m Manager, fn TxnFunc) error {
|
||||
return err
|
||||
}
|
||||
|
||||
func begin(ctx context.Context, m Manager) (context.Context, error) {
|
||||
var err error
|
||||
ctx, err = m.Begin(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
hm := hookManager{}
|
||||
ctx = hm.register(ctx)
|
||||
|
||||
return ctx, nil
|
||||
}
|
||||
|
||||
func commit(ctx context.Context, m Manager) error {
|
||||
if err := m.Commit(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
executePostCommitHooks(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
func rollback(ctx context.Context, m Manager) {
|
||||
if err := m.Rollback(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
executePostRollbackHooks(ctx)
|
||||
}
|
||||
|
||||
// WithDatabase executes fn with the context provided by p.WithDatabase.
|
||||
// It does not run inside a transaction, so all database operations will be
|
||||
// executed in their own transaction.
|
||||
|
||||
Reference in New Issue
Block a user