2017-10-31 00:57:57 +00:00
package qgen
import "database/sql"
type transactionStmt struct {
stmt * sql . Stmt
firstErr error // This'll let us chain the methods to reduce boilerplate
}
func newTransactionStmt ( stmt * sql . Stmt , err error ) * transactionStmt {
return & transactionStmt { stmt , err }
}
func ( stmt * transactionStmt ) Exec ( args ... interface { } ) ( * sql . Result , error ) {
if stmt . firstErr != nil {
return nil , stmt . firstErr
}
return stmt . Exec ( args ... )
}
type TransactionBuilder struct {
tx * sql . Tx
2017-11-12 05:25:04 +00:00
adapter Adapter
2017-10-31 00:57:57 +00:00
textToStmt map [ string ] * transactionStmt
}
2019-10-29 01:58:04 +00:00
func ( b * TransactionBuilder ) SimpleDelete ( table string , where string ) ( stmt * sql . Stmt , err error ) {
res , err := b . adapter . SimpleDelete ( "" , table , where )
2017-10-31 00:57:57 +00:00
if err != nil {
return stmt , err
}
2019-10-29 01:58:04 +00:00
return b . tx . Prepare ( res )
2017-10-31 00:57:57 +00:00
}
// Quick* versions refer to it being quick to type not the performance. For performance critical transactions, you might want to use the Simple* methods or the *Tx methods on the main builder. Alternate suggestions for names are welcome :)
2019-10-29 01:58:04 +00:00
func ( b * TransactionBuilder ) QuickDelete ( table string , where string ) * transactionStmt {
res , err := b . adapter . SimpleDelete ( "" , table , where )
2017-10-31 00:57:57 +00:00
if err != nil {
return newTransactionStmt ( nil , err )
}
2019-10-29 01:58:04 +00:00
stmt , ok := b . textToStmt [ res ]
2017-10-31 00:57:57 +00:00
if ok {
return stmt
}
2019-10-29 01:58:04 +00:00
stmt = newTransactionStmt ( b . tx . Prepare ( res ) )
b . textToStmt [ res ] = stmt
2017-10-31 00:57:57 +00:00
return stmt
}
2019-10-29 01:58:04 +00:00
func ( b * TransactionBuilder ) SimpleInsert ( table string , columns string , fields string ) ( stmt * sql . Stmt , err error ) {
res , err := b . adapter . SimpleInsert ( "" , table , columns , fields )
2017-10-31 00:57:57 +00:00
if err != nil {
return stmt , err
}
2019-10-29 01:58:04 +00:00
return b . tx . Prepare ( res )
2017-10-31 00:57:57 +00:00
}
2019-10-29 01:58:04 +00:00
func ( b * TransactionBuilder ) QuickInsert ( table string , where string ) * transactionStmt {
res , err := b . adapter . SimpleDelete ( "" , table , where )
2017-10-31 00:57:57 +00:00
if err != nil {
return newTransactionStmt ( nil , err )
}
2019-10-29 01:58:04 +00:00
stmt , ok := b . textToStmt [ res ]
2017-10-31 00:57:57 +00:00
if ok {
return stmt
}
2019-10-29 01:58:04 +00:00
stmt = newTransactionStmt ( b . tx . Prepare ( res ) )
b . textToStmt [ res ] = stmt
2017-10-31 00:57:57 +00:00
return stmt
}