From c3b709d1e3a918944625845e35053cd241177e7d Mon Sep 17 00:00:00 2001 From: kim Date: Fri, 19 Apr 2024 09:32:20 +0100 Subject: [PATCH 1/2] export the database/sql driver type and global instance --- driver/driver.go | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/driver/driver.go b/driver/driver.go index 19f5001c..3264392d 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -63,39 +63,52 @@ var driverName = "sqlite3" func init() { if driverName != "" { - sql.Register(driverName, sqlite{}) + sql.Register(driverName, &SQLiteDriver) } } +// SQLiteDriver is a global Driver{} instance +// registered under [database/sql] as "sqlite3". +var SQLiteDriver = Driver{} + // Open opens the SQLite database specified by dataSourceName as a [database/sql.DB]. // // The init function is called by the driver on new connections. // The conn can be used to execute queries, register functions, etc. // Any error return closes the conn and passes the error to [database/sql]. func Open(dataSourceName string, init func(*sqlite3.Conn) error) (*sql.DB, error) { - c, err := newConnector(dataSourceName, init) + d := Driver{Init: init} + c, err := d.OpenConnector(dataSourceName) if err != nil { return nil, err } return sql.OpenDB(c), nil } -type sqlite struct{} +type Driver struct { + + // The init function is called by the driver on new connections. + // The conn can be used to execute queries, register functions, etc. + // Any error return closes the conn and passes the error to [database/sql]. + Init func(*sqlite3.Conn) error +} -func (sqlite) Open(name string) (driver.Conn, error) { - c, err := newConnector(name, nil) +// Open: implements [database/sql.Driver]. +func (d *Driver) Open(name string) (driver.Conn, error) { + c, err := d.newConnector(name) if err != nil { return nil, err } return c.Connect(context.Background()) } -func (sqlite) OpenConnector(name string) (driver.Connector, error) { - return newConnector(name, nil) +// OpenConnector: implements [database/sql.DriverContext]. +func (d *Driver) OpenConnector(name string) (driver.Connector, error) { + return d.newConnector(name) } -func newConnector(name string, init func(*sqlite3.Conn) error) (*connector, error) { - c := connector{name: name, init: init} +func (d *Driver) newConnector(name string) (*connector, error) { + c := connector{driver: d, name: name} var txlock, timefmt string if strings.HasPrefix(name, "file:") { @@ -137,7 +150,7 @@ func newConnector(name string, init func(*sqlite3.Conn) error) (*connector, erro } type connector struct { - init func(*sqlite3.Conn) error + driver *Driver name string txBegin string tmRead sqlite3.TimeFormat @@ -146,7 +159,7 @@ type connector struct { } func (n *connector) Driver() driver.Driver { - return sqlite{} + return n.driver } 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) { return nil, err } } - if n.init != nil { - err = n.init(c.Conn) + if n.driver.Init != nil { + err = n.driver.Init(c.Conn) if err != nil { return nil, err } } - if n.pragmas || n.init != nil { + if n.pragmas || n.driver.Init != nil { s, _, err := c.Conn.Prepare(`PRAGMA query_only`) if err != nil { return nil, err From 451da4c7c598c97056d0aa67a961f78ca66c38bf Mon Sep 17 00:00:00 2001 From: kim Date: Mon, 22 Apr 2024 13:39:42 +0100 Subject: [PATCH 2/2] change driver name to SQLite{}, remove global variable --- driver/driver.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/driver/driver.go b/driver/driver.go index 3264392d..f7dc6fe2 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -63,29 +63,24 @@ var driverName = "sqlite3" func init() { if driverName != "" { - sql.Register(driverName, &SQLiteDriver) + sql.Register(driverName, &SQLite{}) } } -// SQLiteDriver is a global Driver{} instance -// registered under [database/sql] as "sqlite3". -var SQLiteDriver = Driver{} - // Open opens the SQLite database specified by dataSourceName as a [database/sql.DB]. // // The init function is called by the driver on new connections. // The conn can be used to execute queries, register functions, etc. // Any error return closes the conn and passes the error to [database/sql]. func Open(dataSourceName string, init func(*sqlite3.Conn) error) (*sql.DB, error) { - d := Driver{Init: init} - c, err := d.OpenConnector(dataSourceName) + c, err := (&SQLite{Init: init}).OpenConnector(dataSourceName) if err != nil { return nil, err } return sql.OpenDB(c), nil } -type Driver struct { +type SQLite struct { // The init function is called by the driver on new connections. // The conn can be used to execute queries, register functions, etc. @@ -94,7 +89,7 @@ type Driver struct { } // Open: implements [database/sql.Driver]. -func (d *Driver) Open(name string) (driver.Conn, error) { +func (d *SQLite) Open(name string) (driver.Conn, error) { c, err := d.newConnector(name) if err != nil { return nil, err @@ -103,11 +98,11 @@ func (d *Driver) Open(name string) (driver.Conn, error) { } // OpenConnector: implements [database/sql.DriverContext]. -func (d *Driver) OpenConnector(name string) (driver.Connector, error) { +func (d *SQLite) OpenConnector(name string) (driver.Connector, error) { return d.newConnector(name) } -func (d *Driver) newConnector(name string) (*connector, error) { +func (d *SQLite) newConnector(name string) (*connector, error) { c := connector{driver: d, name: name} var txlock, timefmt string @@ -150,7 +145,7 @@ func (d *Driver) newConnector(name string) (*connector, error) { } type connector struct { - driver *Driver + driver *SQLite name string txBegin string tmRead sqlite3.TimeFormat