func (s *SQLiteStmt) query(ctx context.Context, args []namedValue) (driver.Rows, error) { if err := s.bind(args); err != nil { return nil, err } 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 }
func (s *SQLiteStmt) exec(ctx context.Context, args []namedValue) (driver.Result, error) { if err := s.bind(args); err != nil { C.sqlite3_reset(s.s) C.sqlite3_clear_bindings(s.s) return nil, err } done := make(chan struct{}) defer close(done) go func() { select { case <-ctx.Done(): C.sqlite3_interrupt(s.c.db) case <-done: } }() var rowid, changes C.longlong rv := C._sqlite3_step(s.s, &rowid, &changes) if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE { err := s.c.lastError() C.sqlite3_reset(s.s) C.sqlite3_clear_bindings(s.s) return nil, err } return &SQLiteResult{id: int64(rowid), changes: int64(changes)}, nil }
// Interrupt interrupts a long-running query. // (See http://sqlite.org/c3ref/interrupt.html) func (c *Conn) Interrupt() { C.sqlite3_interrupt(c.db) }
// Interrupt causes any pending database operation to abort and return at its // earliest opportunity. It is safe to call this method from a goroutine // different from the one that is currently running the database operation, but // it is not safe to call this method on a connection that might close before // the call returns. // [http://www.sqlite.org/c3ref/interrupt.html] func (c *Conn) Interrupt() { if db := c.db; db != nil { C.sqlite3_interrupt(db) } }