Skip to content

Commit d4027b0

Browse files
NyaaaWhatsUpDocncruces
authored andcommitted
export the database/sql driver type and global instance
1 parent 62b79d2 commit d4027b0

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

driver/driver.go

+27-14
Original file line numberDiff line numberDiff line change
@@ -63,39 +63,52 @@ var driverName = "sqlite3"
6363

6464
func 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].
7579
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)
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

139152
type 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

148161
func (n *connector) Driver() driver.Driver {
149-
return sqlite{}
162+
return n.driver
150163
}
151164

152165
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) {
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

Comments
 (0)