@@ -63,39 +63,52 @@ var driverName = "sqlite3"
63
63
64
64
func init () {
65
65
if driverName != "" {
66
- sql .Register (driverName , sqlite {} )
66
+ sql .Register (driverName , & SQLiteDriver )
67
67
}
68
68
}
69
69
70
+ // SQLiteDriver is a global Driver{} instance
71
+ // registered under [database/sql] as "sqlite3".
72
+ var SQLiteDriver = Driver {}
73
+
70
74
// Open opens the SQLite database specified by dataSourceName as a [database/sql.DB].
71
75
//
72
76
// The init function is called by the driver on new connections.
73
77
// The conn can be used to execute queries, register functions, etc.
74
78
// Any error return closes the conn and passes the error to [database/sql].
75
79
func Open (dataSourceName string , init func (* sqlite3.Conn ) error ) (* sql.DB , error ) {
76
- c , err := newConnector (dataSourceName , init )
80
+ d := Driver {Init : init }
81
+ c , err := d .OpenConnector (dataSourceName )
77
82
if err != nil {
78
83
return nil , err
79
84
}
80
85
return sql .OpenDB (c ), nil
81
86
}
82
87
83
- type sqlite struct {}
88
+ type Driver struct {
89
+
90
+ // The init function is called by the driver on new connections.
91
+ // The conn can be used to execute queries, register functions, etc.
92
+ // Any error return closes the conn and passes the error to [database/sql].
93
+ Init func (* sqlite3.Conn ) error
94
+ }
84
95
85
- func (sqlite ) Open (name string ) (driver.Conn , error ) {
86
- c , err := newConnector (name , nil )
96
+ // Open: implements [database/sql.Driver].
97
+ func (d * Driver ) Open (name string ) (driver.Conn , error ) {
98
+ c , err := d .newConnector (name )
87
99
if err != nil {
88
100
return nil , err
89
101
}
90
102
return c .Connect (context .Background ())
91
103
}
92
104
93
- func (sqlite ) OpenConnector (name string ) (driver.Connector , error ) {
94
- return newConnector (name , nil )
105
+ // OpenConnector: implements [database/sql.DriverContext].
106
+ func (d * Driver ) OpenConnector (name string ) (driver.Connector , error ) {
107
+ return d .newConnector (name )
95
108
}
96
109
97
- func newConnector ( name string , init func ( * sqlite3. Conn ) error ) (* connector , error ) {
98
- c := connector {name : name , init : init }
110
+ func ( d * Driver ) newConnector ( name string ) (* connector , error ) {
111
+ c := connector {driver : d , name : name }
99
112
100
113
var txlock , timefmt string
101
114
if strings .HasPrefix (name , "file:" ) {
@@ -137,7 +150,7 @@ func newConnector(name string, init func(*sqlite3.Conn) error) (*connector, erro
137
150
}
138
151
139
152
type connector struct {
140
- init func ( * sqlite3. Conn ) error
153
+ driver * Driver
141
154
name string
142
155
txBegin string
143
156
tmRead sqlite3.TimeFormat
@@ -146,7 +159,7 @@ type connector struct {
146
159
}
147
160
148
161
func (n * connector ) Driver () driver.Driver {
149
- return sqlite {}
162
+ return n . driver
150
163
}
151
164
152
165
func (n * connector ) Connect (ctx context.Context ) (_ driver.Conn , err error ) {
@@ -175,13 +188,13 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
175
188
return nil , err
176
189
}
177
190
}
178
- if n .init != nil {
179
- err = n .init (c .Conn )
191
+ if n .driver . Init != nil {
192
+ err = n .driver . Init (c .Conn )
180
193
if err != nil {
181
194
return nil , err
182
195
}
183
196
}
184
- if n .pragmas || n .init != nil {
197
+ if n .pragmas || n .driver . Init != nil {
185
198
s , _ , err := c .Conn .Prepare (`PRAGMA query_only` )
186
199
if err != nil {
187
200
return nil , err
0 commit comments