diff --git a/sqlite3.go b/sqlite3.go index ce985ec8..227fe791 100644 --- a/sqlite3.go +++ b/sqlite3.go @@ -1782,17 +1782,20 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { } // Close the connection. -func (c *SQLiteConn) Close() error { +func (c *SQLiteConn) Close() (err error) { + c.mu.Lock() + defer c.mu.Unlock() + if c.db == nil { + return nil // Already closed + } + runtime.SetFinalizer(c, nil) rv := C.sqlite3_close_v2(c.db) if rv != C.SQLITE_OK { - return c.lastError() + err = c.lastError() } deleteHandles(c) - c.mu.Lock() c.db = nil - c.mu.Unlock() - runtime.SetFinalizer(c, nil) - return nil + return err } func (c *SQLiteConn) dbConnOpen() bool { @@ -1901,16 +1904,18 @@ func (s *SQLiteStmt) Close() error { return nil } s.closed = true - if !s.c.dbConnOpen() { + conn := s.c + stmt := s.s + s.c = nil + s.s = nil + runtime.SetFinalizer(s, nil) + if !conn.dbConnOpen() { return errors.New("sqlite statement with already closed database connection") } - rv := C.sqlite3_finalize(s.s) - s.s = nil + rv := C.sqlite3_finalize(stmt) if rv != C.SQLITE_OK { - return s.c.lastError() + return conn.lastError() } - s.c = nil - runtime.SetFinalizer(s, nil) return nil }