diff options
author | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2016-11-06 20:43:53 +0900 |
---|---|---|
committer | Yasuhiro Matsumoto <mattn.jp@gmail.com> | 2016-11-06 20:43:53 +0900 |
commit | 605d9d08513fd3936c3d4a8631abd1db14136074 (patch) | |
tree | 950f6457471b92fdd9436ec2b683deed37416261 | |
parent | go vet && golint (diff) | |
download | golite-605d9d08513fd3936c3d4a8631abd1db14136074.tar.gz golite-605d9d08513fd3936c3d4a8631abd1db14136074.tar.xz |
cancel
-rw-r--r-- | sqlite3.go | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -190,6 +190,7 @@ type SQLiteRows struct { cols []string decltype []string cls bool + done chan struct{} } type functionInfo struct { @@ -766,7 +767,26 @@ func (s *SQLiteStmt) query(ctx context.Context, args []namedValue) (driver.Rows, if err := s.bind(args); err != nil { return nil, err } - return &SQLiteRows{s, int(C.sqlite3_column_count(s.s)), nil, nil, s.cls}, nil + + rows := &SQLiteRows{ + s: s, + nc: int(C.sqlite3_column_count(s.s)), + cols: nil, + decltype: nil, + cls: s.cls, + done: make(chan struct{}), + } + + go func() { + select { + case <-ctx.Done(): + C.sqlite3_interrupt(s.c.db) + rows.Close() + case <-rows.done: + } + }() + + return rows, nil } // LastInsertId teturn last inserted ID. @@ -813,6 +833,10 @@ func (rc *SQLiteRows) Close() error { if rc.s.closed { return nil } + if rc.done != nil { + close(rc.done) + rc.done = nil + } if rc.cls { return rc.s.Close() } |