@@ -107,28 +107,25 @@ func init() {
107
107
// The second callback is called before the driver closes a connection.
108
108
// The [sqlite3.Conn] can be used to execute queries, register functions, etc.
109
109
func Open (dataSourceName string , fn ... func (* sqlite3.Conn ) error ) (* sql.DB , error ) {
110
- var drv SQLite
111
110
if len (fn ) > 2 {
112
111
return nil , sqlite3 .MISUSE
113
112
}
113
+ var init , term func (* sqlite3.Conn ) error
114
114
if len (fn ) > 1 {
115
- drv . term = fn [1 ]
115
+ term = fn [1 ]
116
116
}
117
117
if len (fn ) > 0 {
118
- drv . init = fn [0 ]
118
+ init = fn [0 ]
119
119
}
120
- c , err := drv . OpenConnector (dataSourceName )
120
+ c , err := newConnector (dataSourceName , init , term )
121
121
if err != nil {
122
122
return nil , err
123
123
}
124
124
return sql .OpenDB (c ), nil
125
125
}
126
126
127
127
// SQLite implements [database/sql/driver.Driver].
128
- type SQLite struct {
129
- init func (* sqlite3.Conn ) error
130
- term func (* sqlite3.Conn ) error
131
- }
128
+ type SQLite struct {}
132
129
133
130
var (
134
131
// Ensure these interfaces are implemented:
@@ -137,7 +134,7 @@ var (
137
134
138
135
// Open implements [database/sql/driver.Driver].
139
136
func (d * SQLite ) Open (name string ) (driver.Conn , error ) {
140
- c , err := d . newConnector (name )
137
+ c , err := newConnector (name , nil , nil )
141
138
if err != nil {
142
139
return nil , err
143
140
}
@@ -146,11 +143,11 @@ func (d *SQLite) Open(name string) (driver.Conn, error) {
146
143
147
144
// OpenConnector implements [database/sql/driver.DriverContext].
148
145
func (d * SQLite ) OpenConnector (name string ) (driver.Connector , error ) {
149
- return d . newConnector (name )
146
+ return newConnector (name , nil , nil )
150
147
}
151
148
152
- func ( d * SQLite ) newConnector (name string ) (* connector , error ) {
153
- c := connector {driver : d , name : name }
149
+ func newConnector (name string , init , term func ( * sqlite3. Conn ) error ) (* connector , error ) {
150
+ c := connector {name : name , init : init , term : term }
154
151
155
152
var txlock , timefmt string
156
153
if strings .HasPrefix (name , "file:" ) {
@@ -190,7 +187,8 @@ func (d *SQLite) newConnector(name string) (*connector, error) {
190
187
}
191
188
192
189
type connector struct {
193
- driver * SQLite
190
+ init func (* sqlite3.Conn ) error
191
+ term func (* sqlite3.Conn ) error
194
192
name string
195
193
txLock string
196
194
tmRead sqlite3.TimeFormat
@@ -199,7 +197,7 @@ type connector struct {
199
197
}
200
198
201
199
func (n * connector ) Driver () driver.Driver {
202
- return n . driver
200
+ return & SQLite {}
203
201
}
204
202
205
203
func (n * connector ) Connect (ctx context.Context ) (res driver.Conn , err error ) {
@@ -228,13 +226,13 @@ func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) {
228
226
return nil , err
229
227
}
230
228
}
231
- if n .driver . init != nil {
232
- err = n .driver . init (c .Conn )
229
+ if n .init != nil {
230
+ err = n .init (c .Conn )
233
231
if err != nil {
234
232
return nil , err
235
233
}
236
234
}
237
- if n .pragmas || n .driver . init != nil {
235
+ if n .pragmas || n .init != nil {
238
236
s , _ , err := c .Conn .Prepare (`PRAGMA query_only` )
239
237
if err != nil {
240
238
return nil , err
@@ -250,9 +248,9 @@ func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) {
250
248
return nil , err
251
249
}
252
250
}
253
- if n .driver . term != nil {
251
+ if n .term != nil {
254
252
err = c .Conn .Trace (sqlite3 .TRACE_CLOSE , func (sqlite3.TraceEvent , any , any ) error {
255
- return n .driver . term (c .Conn )
253
+ return n .term (c .Conn )
256
254
})
257
255
if err != nil {
258
256
return nil , err
@@ -288,6 +286,8 @@ func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) {
288
286
type Conn interface {
289
287
Raw () * sqlite3.Conn
290
288
driver.Conn
289
+ driver.ConnBeginTx
290
+ driver.ConnPrepareContext
291
291
}
292
292
293
293
type conn struct {
@@ -301,10 +301,8 @@ type conn struct {
301
301
302
302
var (
303
303
// Ensure these interfaces are implemented:
304
- _ Conn = & conn {}
305
- _ driver.ConnBeginTx = & conn {}
306
- _ driver.ConnPrepareContext = & conn {}
307
- _ driver.ExecerContext = & conn {}
304
+ _ Conn = & conn {}
305
+ _ driver.ExecerContext = & conn {}
308
306
)
309
307
310
308
func (c * conn ) Raw () * sqlite3.Conn {
0 commit comments