@@ -69,7 +69,7 @@ type conn struct {
6969}
7070
7171func (c * conn ) IsValid () bool {
72- return ! c . isClosed ()
72+ return c . isReady ()
7373}
7474
7575type currentTx interface {
8787 _ driver.QueryerContext = & conn {}
8888 _ driver.Pinger = & conn {}
8989 _ driver.NamedValueChecker = & conn {}
90- _ driver.SessionResetter = & conn {}
9190 _ driver.Validator = & conn {}
9291)
9392
@@ -109,7 +108,7 @@ func (c *conn) checkClosed(err error) error {
109108 return err
110109}
111110
112- func (c * conn ) isClosed () bool {
111+ func (c * conn ) isReady () bool {
113112 if atomic .LoadUint32 (& c .closed ) == 1 {
114113 return true
115114 }
@@ -129,8 +128,8 @@ func (c *conn) PrepareContext(ctx context.Context, query string) (_ driver.Stmt,
129128 defer func () {
130129 onDone (err )
131130 }()
132- if c . isClosed () {
133- return nil , errClosedConn
131+ if ! c . isReady () {
132+ return nil , errNotReadyConn
134133 }
135134 return & stmt {
136135 conn : c ,
@@ -203,8 +202,8 @@ func (c *conn) execContext(ctx context.Context, query string, args []driver.Name
203202}
204203
205204func (c * conn ) ExecContext (ctx context.Context , query string , args []driver.NamedValue ) (_ driver.Result , err error ) {
206- if c . isClosed () {
207- return nil , errClosedConn
205+ if ! c . isReady () {
206+ return nil , errNotReadyConn
208207 }
209208 if c .currentTx != nil {
210209 return c .currentTx .ExecContext (ctx , query , args )
@@ -213,8 +212,8 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name
213212}
214213
215214func (c * conn ) QueryContext (ctx context.Context , query string , args []driver.NamedValue ) (_ driver.Rows , err error ) {
216- if c . isClosed () {
217- return nil , errClosedConn
215+ if ! c . isReady () {
216+ return nil , errNotReadyConn
218217 }
219218 if c .currentTx != nil {
220219 return c .currentTx .QueryContext (ctx , query , args )
@@ -307,8 +306,8 @@ func (c *conn) Ping(ctx context.Context) (err error) {
307306 defer func () {
308307 onDone (err )
309308 }()
310- if c . isClosed () {
311- return errClosedConn
309+ if ! c . isReady () {
310+ return errNotReadyConn
312311 }
313312 if err = c .session .KeepAlive (ctx ); err != nil {
314313 return c .checkClosed (xerrors .WithStackTrace (err ))
@@ -317,15 +316,18 @@ func (c *conn) Ping(ctx context.Context) (err error) {
317316}
318317
319318func (c * conn ) Close () (err error ) {
320- onDone := trace .DatabaseSQLOnConnClose (c .trace )
321- defer func () {
322- onDone (err )
323- }()
324- err = c .session .Close (context .Background ())
325- if err != nil {
326- return c .checkClosed (xerrors .WithStackTrace (err ))
319+ if atomic .CompareAndSwapUint32 (& c .closed , 0 , 1 ) {
320+ onDone := trace .DatabaseSQLOnConnClose (c .trace )
321+ defer func () {
322+ onDone (err )
323+ }()
324+ err = c .session .Close (context .Background ())
325+ if err != nil {
326+ return badconn .Map (xerrors .WithStackTrace (err ))
327+ }
328+ return nil
327329 }
328- return nil
330+ return errClosedConn
329331}
330332
331333func (c * conn ) Prepare (string ) (driver.Stmt , error ) {
@@ -342,8 +344,8 @@ func (c *conn) BeginTx(ctx context.Context, txOptions driver.TxOptions) (_ drive
342344 defer func () {
343345 onDone (transaction , err )
344346 }()
345- if c . isClosed () {
346- return nil , errClosedConn
347+ if ! c . isReady () {
348+ return nil , errNotReadyConn
347349 }
348350 if c .currentTx != nil {
349351 return nil , xerrors .WithStackTrace (
@@ -366,13 +368,3 @@ func (c *conn) BeginTx(ctx context.Context, txOptions driver.TxOptions) (_ drive
366368 }
367369 return c .currentTx , nil
368370}
369-
370- func (c * conn ) ResetSession (_ context.Context ) error {
371- if c .currentTx != nil {
372- _ = c .currentTx .Rollback ()
373- }
374- if c .isClosed () {
375- return errClosedConn
376- }
377- return nil
378- }
0 commit comments