feat: Hooks 新增 UseTx,Before/After 改用类型化的 HookError
之前 Hooks.Before/After 返回裸 error,调用方没法区分"钩子本身失败"和"SQL 执行失败"。改成返回 *HookError(包一层 exec.HookError),配合 errors.As 能精确识别。 同时给 Hooks 加一个 UseTx(dataset) (QueryFactory, error) 方法,在 Before 之前调用,允许钩子在写操作真正执行前替换掉默认连接(比如需要自动开事务包住 写操作和写后回调的场景),返回 nil, nil 表示沿用默认连接。目前只有 InsertDataset/UpdateDataset/DeleteDataset 会调用 UseTx,SelectDataset (只读)不需要。
This commit is contained in:
+12
-2
@@ -236,12 +236,22 @@ func (ud *UpdateDataset) ReturnsColumns() bool {
|
||||
// db.Update("test").Set(Record{"name":"Bob", update: time.Now()}).Executor()
|
||||
func (ud *UpdateDataset) Executor() (executor exec.QueryExecutor) {
|
||||
if ud.hooks != nil {
|
||||
ud.SetError(ud.hooks.Before(ud))
|
||||
if qf, err := ud.hooks.UseTx(ud); err != nil {
|
||||
ud.SetError(err)
|
||||
} else if qf != nil {
|
||||
ud.queryFactory = qf
|
||||
}
|
||||
if herr := ud.hooks.Before(ud); herr != nil {
|
||||
ud.SetError(herr)
|
||||
}
|
||||
}
|
||||
executor = ud.queryFactory.FromSQLBuilder(ud.updateSQLBuilder())
|
||||
if ud.hooks != nil {
|
||||
executor.Hook(func(result interface{}) error {
|
||||
return ud.hooks.After(ud, result)
|
||||
if herr := ud.hooks.After(ud, result); herr != nil {
|
||||
return herr
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
return executor
|
||||
|
||||
Reference in New Issue
Block a user