File tree 2 files changed +23
-22
lines changed
2 files changed +23
-22
lines changed Original file line number Diff line number Diff line change @@ -1782,26 +1782,20 @@ func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) {
1782
1782
}
1783
1783
1784
1784
// Close the connection.
1785
- func (c * SQLiteConn ) Close () error {
1785
+ func (c * SQLiteConn ) Close () (err error ) {
1786
+ c .mu .Lock ()
1787
+ defer c .mu .Unlock ()
1788
+ if c .db == nil {
1789
+ return nil // Already closed
1790
+ }
1791
+ runtime .SetFinalizer (c , nil )
1786
1792
rv := C .sqlite3_close_v2 (c .db )
1787
1793
if rv != C .SQLITE_OK {
1788
- return c .lastError ()
1794
+ err = c .lastError ()
1789
1795
}
1790
1796
deleteHandles (c )
1791
- c .mu .Lock ()
1792
1797
c .db = nil
1793
- c .mu .Unlock ()
1794
- runtime .SetFinalizer (c , nil )
1795
- return nil
1796
- }
1797
-
1798
- func (c * SQLiteConn ) dbConnOpen () bool {
1799
- if c == nil {
1800
- return false
1801
- }
1802
- c .mu .Lock ()
1803
- defer c .mu .Unlock ()
1804
- return c .db != nil
1798
+ return err
1805
1799
}
1806
1800
1807
1801
// Prepare the query string. Return a new statement.
@@ -1901,16 +1895,15 @@ func (s *SQLiteStmt) Close() error {
1901
1895
return nil
1902
1896
}
1903
1897
s .closed = true
1904
- if ! s .c .dbConnOpen () {
1905
- return errors .New ("sqlite statement with already closed database connection" )
1906
- }
1907
- rv := C .sqlite3_finalize (s .s )
1898
+ conn := s .c
1899
+ stmt := s .s
1900
+ s .c = nil
1908
1901
s .s = nil
1902
+ runtime .SetFinalizer (s , nil )
1903
+ rv := C .sqlite3_finalize (stmt )
1909
1904
if rv != C .SQLITE_OK {
1910
- return s . c .lastError ()
1905
+ return conn .lastError ()
1911
1906
}
1912
- s .c = nil
1913
- runtime .SetFinalizer (s , nil )
1914
1907
return nil
1915
1908
}
1916
1909
Original file line number Diff line number Diff line change @@ -338,6 +338,14 @@ func TestClose(t *testing.T) {
338
338
if err == nil {
339
339
t .Fatal ("Failed to operate closed statement" )
340
340
}
341
+ // Closing a statement should not error even if the db is closed.
342
+ if err := stmt .Close (); err != nil {
343
+ t .Fatal (err )
344
+ }
345
+ // Second close should be a no-op
346
+ if err := stmt .Close (); err != nil {
347
+ t .Fatal (err )
348
+ }
341
349
}
342
350
343
351
func TestInsert (t * testing.T ) {
You can’t perform that action at this time.
0 commit comments