@@ -63,39 +63,52 @@ var driverName = "sqlite3"
6363
6464func init () {
6565 if driverName != "" {
66- sql .Register (driverName , sqlite {} )
66+ sql .Register (driverName , & SQLiteDriver )
6767 }
6868}
6969
70+ // SQLiteDriver is a global Driver{} instance
71+ // registered under [database/sql] as "sqlite3".
72+ var SQLiteDriver = Driver {}
73+
7074// Open opens the SQLite database specified by dataSourceName as a [database/sql.DB].
7175//
7276// The init function is called by the driver on new connections.
7377// The conn can be used to execute queries, register functions, etc.
7478// Any error return closes the conn and passes the error to [database/sql].
7579func 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 )
7782 if err != nil {
7883 return nil , err
7984 }
8085 return sql .OpenDB (c ), nil
8186}
8287
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+ }
8495
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 )
8799 if err != nil {
88100 return nil , err
89101 }
90102 return c .Connect (context .Background ())
91103}
92104
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 )
95108}
96109
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 }
99112
100113 var txlock , timefmt string
101114 if strings .HasPrefix (name , "file:" ) {
@@ -137,7 +150,7 @@ func newConnector(name string, init func(*sqlite3.Conn) error) (*connector, erro
137150}
138151
139152type connector struct {
140- init func ( * sqlite3. Conn ) error
153+ driver * Driver
141154 name string
142155 txBegin string
143156 tmRead sqlite3.TimeFormat
@@ -146,7 +159,7 @@ type connector struct {
146159}
147160
148161func (n * connector ) Driver () driver.Driver {
149- return sqlite {}
162+ return n . driver
150163}
151164
152165func (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) {
175188 return nil , err
176189 }
177190 }
178- if n .init != nil {
179- err = n .init (c .Conn )
191+ if n .driver . Init != nil {
192+ err = n .driver . Init (c .Conn )
180193 if err != nil {
181194 return nil , err
182195 }
183196 }
184- if n .pragmas || n .init != nil {
197+ if n .pragmas || n .driver . Init != nil {
185198 s , _ , err := c .Conn .Prepare (`PRAGMA query_only` )
186199 if err != nil {
187200 return nil , err
0 commit comments