Skip to content

Commit 493a4c0

Browse files
author
Sergey Petrunin
committed
Add stmt cache for transactions
1 parent e13dbac commit 493a4c0

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

stmtcacher.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,67 @@ func NewStmtCacheProxy(db *sql.DB) DBProxyBeginner {
8888
func (sp *stmtCacheProxy) Begin() (*sql.Tx, error) {
8989
return sp.db.Begin()
9090
}
91+
92+
// DBTransactionProxy wraps transaction and includes DBProxy interface
93+
type DBTransactionProxy interface {
94+
DBProxy
95+
Begin() error
96+
Commit() error
97+
Rollback() error
98+
}
99+
100+
type stmtCacheTransactionProxy struct {
101+
DBProxy
102+
db *sql.DB
103+
transaction *sql.Tx
104+
}
105+
106+
// NewStmtCacheTransactionProxy returns a DBTransactionProxy
107+
// wrapping an open transaction in stmtCacher.
108+
// You should use Begin() each time you want a new transaction and
109+
// cache will be valid only for that transaction.
110+
// By default without calling Begin proxy will use simple stmtCacher
111+
//
112+
// Usage example:
113+
// proxy := sq.NewStmtCacheTransactionProxy(db)
114+
// mydb := sq.StatementBuilder.RunWith(proxy)
115+
// insertUsers := mydb.Insert("users").Columns("name")
116+
// insertUsers.Values("username1").Exec()
117+
// insertUsers.Values("username2").Exec()
118+
// proxy.Commit()
119+
//
120+
// proxy.Begin()
121+
// insertPets := mydb.Insert("pets").Columns("name", "username")
122+
// insertPets.Values("petname1", "username1").Exec()
123+
// insertPets.Values("petname2", "username1").Exec()
124+
// proxy.Commit()
125+
func NewStmtCacheTransactionProxy(db *sql.DB) (proxy DBTransactionProxy) {
126+
return &stmtCacheTransactionProxy{DBProxy: NewStmtCacher(db), db: db}
127+
}
128+
129+
func (s *stmtCacheTransactionProxy) Begin() (err error) {
130+
tr, err := s.db.Begin()
131+
132+
if err != nil {
133+
return
134+
}
135+
136+
s.DBProxy = NewStmtCacher(tr)
137+
s.transaction = tr
138+
139+
return
140+
}
141+
142+
func (s *stmtCacheTransactionProxy) Commit() error {
143+
defer s.resetProxy()
144+
return s.transaction.Commit()
145+
}
146+
147+
func (s *stmtCacheTransactionProxy) Rollback() error {
148+
defer s.resetProxy()
149+
return s.transaction.Rollback()
150+
}
151+
152+
func (s *stmtCacheTransactionProxy) resetProxy() {
153+
s.DBProxy = NewStmtCacher(s.db)
154+
}

0 commit comments

Comments
 (0)