forked from mirror/go-sqlite3
cancel
This commit is contained in:
parent
15491aeb9c
commit
605d9d0851
26
sqlite3.go
26
sqlite3.go
|
@ -190,6 +190,7 @@ type SQLiteRows struct {
|
||||||
cols []string
|
cols []string
|
||||||
decltype []string
|
decltype []string
|
||||||
cls bool
|
cls bool
|
||||||
|
done chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type functionInfo 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 {
|
if err := s.bind(args); err != nil {
|
||||||
return nil, err
|
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.
|
// LastInsertId teturn last inserted ID.
|
||||||
|
@ -813,6 +833,10 @@ func (rc *SQLiteRows) Close() error {
|
||||||
if rc.s.closed {
|
if rc.s.closed {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if rc.done != nil {
|
||||||
|
close(rc.done)
|
||||||
|
rc.done = nil
|
||||||
|
}
|
||||||
if rc.cls {
|
if rc.cls {
|
||||||
return rc.s.Close()
|
return rc.s.Close()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue