forked from mirror/gorm
feat(PreparedStmtDB): support reset (#5782)
* feat(PreparedStmtDB): support reset * fix: close all stmt * test: fix test * fix: delete one by one
This commit is contained in:
parent
3f20a543fa
commit
5dd2bb4827
|
@ -44,6 +44,18 @@ func (db *PreparedStmtDB) Close() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *PreparedStmtDB) Reset() {
|
||||||
|
db.Mux.Lock()
|
||||||
|
defer db.Mux.Unlock()
|
||||||
|
for query, stmt := range db.Stmts {
|
||||||
|
delete(db.Stmts, query)
|
||||||
|
go stmt.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
db.PreparedSQL = make([]string, 0, 100)
|
||||||
|
db.Stmts = map[string](*Stmt){}
|
||||||
|
}
|
||||||
|
|
||||||
func (db *PreparedStmtDB) prepare(ctx context.Context, conn ConnPool, isTransaction bool, query string) (Stmt, error) {
|
func (db *PreparedStmtDB) prepare(ctx context.Context, conn ConnPool, isTransaction bool, query string) (Stmt, error) {
|
||||||
db.Mux.RLock()
|
db.Mux.RLock()
|
||||||
if stmt, ok := db.Stmts[query]; ok && (!stmt.Transaction || isTransaction) {
|
if stmt, ok := db.Stmts[query]; ok && (!stmt.Transaction || isTransaction) {
|
||||||
|
|
|
@ -2,8 +2,8 @@ package tests_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync"
|
|
||||||
"errors"
|
"errors"
|
||||||
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -168,3 +168,29 @@ func TestPreparedStmtInTransaction(t *testing.T) {
|
||||||
t.Errorf("Failed, got error: %v", err)
|
t.Errorf("Failed, got error: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPreparedStmtReset(t *testing.T) {
|
||||||
|
tx := DB.Session(&gorm.Session{PrepareStmt: true})
|
||||||
|
|
||||||
|
user := *GetUser("prepared_stmt_reset", Config{})
|
||||||
|
tx = tx.Create(&user)
|
||||||
|
|
||||||
|
pdb, ok := tx.ConnPool.(*gorm.PreparedStmtDB)
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("should assign PreparedStatement Manager back to database when using PrepareStmt mode")
|
||||||
|
}
|
||||||
|
|
||||||
|
pdb.Mux.Lock()
|
||||||
|
if len(pdb.Stmts) == 0 {
|
||||||
|
pdb.Mux.Unlock()
|
||||||
|
t.Fatalf("prepared stmt can not be empty")
|
||||||
|
}
|
||||||
|
pdb.Mux.Unlock()
|
||||||
|
|
||||||
|
pdb.Reset()
|
||||||
|
pdb.Mux.Lock()
|
||||||
|
defer pdb.Mux.Unlock()
|
||||||
|
if len(pdb.Stmts) != 0 {
|
||||||
|
t.Fatalf("prepared stmt should be empty")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue