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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Cr
						Cr