@@ -46,9 +46,42 @@ func init() {
46
46
47
47
type sqlite struct {}
48
48
49
- func (sqlite ) Open (name string ) (_ driver.Conn , err error ) {
49
+ func (sqlite ) Open (name string ) (driver.Conn , error ) {
50
+ c , err := sqlite {}.OpenConnector (name )
51
+ if err != nil {
52
+ return nil , err
53
+ }
54
+ return c .Connect (context .Background ())
55
+ }
56
+
57
+ func (sqlite ) OpenConnector (name string ) (driver.Connector , error ) {
58
+ c := connector {name : name }
59
+ if strings .HasPrefix (name , "file:" ) {
60
+ if _ , after , ok := strings .Cut (name , "?" ); ok {
61
+ query , err := url .ParseQuery (after )
62
+ if err != nil {
63
+ return nil , err
64
+ }
65
+ c .txlock = query .Get ("_txlock" )
66
+ c .pragmas = len (query ["_pragma" ]) > 0
67
+ }
68
+ }
69
+ return & c , nil
70
+ }
71
+
72
+ type connector struct {
73
+ name string
74
+ txlock string
75
+ pragmas bool
76
+ }
77
+
78
+ func (n * connector ) Driver () driver.Driver {
79
+ return sqlite {}
80
+ }
81
+
82
+ func (n * connector ) Connect (ctx context.Context ) (_ driver.Conn , err error ) {
50
83
var c conn
51
- c .Conn , err = sqlite3 .Open (name )
84
+ c .Conn , err = sqlite3 .Open (n . name )
52
85
if err != nil {
53
86
return nil , err
54
87
}
@@ -58,25 +91,18 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) {
58
91
}
59
92
}()
60
93
61
- var pragmas bool
62
- c .txBegin = "BEGIN"
63
- if strings .HasPrefix (name , "file:" ) {
64
- if _ , after , ok := strings .Cut (name , "?" ); ok {
65
- query , _ := url .ParseQuery (after )
66
-
67
- switch s := query .Get ("_txlock" ); s {
68
- case "" :
69
- c .txBegin = "BEGIN"
70
- case "deferred" , "immediate" , "exclusive" :
71
- c .txBegin = "BEGIN " + s
72
- default :
73
- return nil , fmt .Errorf ("sqlite3: invalid _txlock: %s" , s )
74
- }
94
+ old := c .Conn .SetInterrupt (ctx )
95
+ defer c .Conn .SetInterrupt (old )
75
96
76
- pragmas = len (query ["_pragma" ]) > 0
77
- }
97
+ switch n .txlock {
98
+ case "" :
99
+ c .txBegin = "BEGIN"
100
+ case "deferred" , "immediate" , "exclusive" :
101
+ c .txBegin = "BEGIN " + n .txlock
102
+ default :
103
+ return nil , fmt .Errorf ("sqlite3: invalid _txlock: %s" , n .txlock )
78
104
}
79
- if ! pragmas {
105
+ if ! n . pragmas {
80
106
err = c .Conn .Exec (`PRAGMA busy_timeout=60000` )
81
107
if err != nil {
82
108
return nil , err
@@ -256,11 +282,14 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) {
256
282
}
257
283
258
284
func (s * stmt ) ExecContext (ctx context.Context , args []driver.NamedValue ) (driver.Result , error ) {
259
- err := s .setupBindings (ctx , args )
285
+ err := s .setupBindings (args )
260
286
if err != nil {
261
287
return nil , err
262
288
}
263
289
290
+ old := s .Conn .SetInterrupt (ctx )
291
+ defer s .Conn .SetInterrupt (old )
292
+
264
293
err = s .Stmt .Exec ()
265
294
if err != nil {
266
295
return nil , err
@@ -270,15 +299,14 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive
270
299
}
271
300
272
301
func (s * stmt ) QueryContext (ctx context.Context , args []driver.NamedValue ) (driver.Rows , error ) {
273
- err := s .setupBindings (ctx , args )
302
+ err := s .setupBindings (args )
274
303
if err != nil {
275
304
return nil , err
276
305
}
277
-
278
306
return & rows {ctx , s .Stmt , s .Conn }, nil
279
307
}
280
308
281
- func (s * stmt ) setupBindings (ctx context. Context , args []driver.NamedValue ) error {
309
+ func (s * stmt ) setupBindings (args []driver.NamedValue ) error {
282
310
err := s .Stmt .ClearBindings ()
283
311
if err != nil {
284
312
return err
0 commit comments