Skip to content

Commit a7ad129

Browse files
committed
driver: Don't waste resources setting/being-notified up in progress handler if context cannot be canceled
Please see mattn/go-sqlite3#530 for similar change. Here it is not additional goroutine but a callback setup which will be called ever 100 ops. We can avoid that if we know that ctx cannot be canceled.
1 parent 79ff27e commit a7ad129

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

driver.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,10 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name
140140
if c.c.IsClosed() {
141141
return nil, driver.ErrBadConn
142142
}
143-
c.c.ProgressHandler(progressHandler, 100, ctx)
144-
defer c.c.ProgressHandler(nil, 0, nil)
143+
if ctx.Done() != nil {
144+
c.c.ProgressHandler(progressHandler, 100, ctx)
145+
defer c.c.ProgressHandler(nil, 0, nil)
146+
}
145147
if len(args) == 0 {
146148
if query == "unwrap" {
147149
return nil, ConnError{c: c.c}
@@ -254,8 +256,10 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive
254256
if err := s.s.bindNamedValue(args); err != nil {
255257
return nil, err
256258
}
257-
s.s.c.ProgressHandler(progressHandler, 100, ctx)
258-
defer s.s.c.ProgressHandler(nil, 0, nil)
259+
if ctx.Done() != nil {
260+
s.s.c.ProgressHandler(progressHandler, 100, ctx)
261+
defer s.s.c.ProgressHandler(nil, 0, nil)
262+
}
259263
if err := s.s.exec(); err != nil {
260264
return nil, ctxError(ctx, err)
261265
}
@@ -270,7 +274,9 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv
270274
return nil, err
271275
}
272276
s.rowsRef = true
273-
s.s.c.ProgressHandler(progressHandler, 100, ctx)
277+
if ctx.Done() != nil {
278+
s.s.c.ProgressHandler(progressHandler, 100, ctx)
279+
}
274280
return &rowsImpl{s, nil, ctx}, nil
275281
}
276282

@@ -308,7 +314,9 @@ func (r *rowsImpl) Next(dest []driver.Value) error {
308314
}
309315

310316
func (r *rowsImpl) Close() error {
311-
r.s.s.c.ProgressHandler(nil, 0, nil)
317+
if r.ctx.Done() != nil {
318+
r.s.s.c.ProgressHandler(nil, 0, nil)
319+
}
312320
r.s.rowsRef = false
313321
if r.s.pendingClose {
314322
return r.s.Close()

0 commit comments

Comments
 (0)