Driver name issue: https://golang.org/issue/12600
But I think I would prefer to solve: https://golang.org/issue/18080

Now with connectors (sql.OpenDB) drivers may not have a "name".

I would love a working proposal that would take the place of ocsql, or at 
least provide it hooks to work without wrapping it.

On Friday, September 21, 2018 at 6:32:40 AM UTC-7, Bas Van Beek wrote:
>
>
> The preferred method of working with database/sql is to use registered 
> driver names to identify which driver to use for connecting to the database.
>
> OpenCensus <https://opencensus.io> now has instrumentation for 
> database/sql by allowing database drivers to be wrapped with the ocsql 
> <https://github.com/opencensus-integrations/ocsql> package.
>
> The most idiomatic way to set-up ocsql 
> <https://github.com/opencensus-integrations/ocsql> is to do something 
> like this:
>
> import (
>     _ "github.com/mattn/go-sqlite3"
>     "github.com/opencensus-integrations/ocsql"
> )
>
> var (
>     driverName string
>     err        error
>     db         *sql.DB
> )
>
> // Register our ocsql wrapper for the provided SQLite3 driver.
> driverName, err = ocsql.Register("sqlite3", ocsql.WithAllTraceOptions())
> if err != nil {
>     log.Fatalf("unable to register our ocsql driver: %v\n", err)
> }
>
> // Connect to a SQLite3 database using the ocsql driver wrapper.
> db, err = sql.Open(driverName, "resource.db")
>
> Unfortunately database/sql does not have a function to retrieve the 
> registered driver.Driver by its driver name, which could look like this:
>
> // DriverByName showsn an example of a function to retrieve a registered 
> driver by its name.
> func DriverByName(name string) driver.Driver {
> driversMu.Lock()
> defer driversMu.Unlock()
>
> return drivers[name]
> }
>
> So underwater ocsql <https://github.com/opencensus-integrations/ocsql> 
> does the following dirty trick to retrieve the driver.Driver:
>
> func Register(driverName string, options ...TraceOption) (string, error) { 
> // retrieve the driver implementation we need to wrap with instrumentation
> db, err := sql.Open(driverName, "")
> if err != nil {
> return "", err
> }
> dri := db.Driver()
> if err = db.Close(); err != nil {
> return "", err
> }
>
> ...
>
> }
>
> The problem however is that Go 1.10 introduced the new interface 
> DriverContext which, if implemented by a database driver, will make the 
> call to sql.Open to retrieve the driver.Driver fail as it can error on the 
> call to OpenConnector:
>
> // If a Driver implements DriverContext, then sql.DB will call
> // OpenConnector to obtain a Connector and then invoke
> // that Connector's Conn method to obtain each needed connection,
> // instead of invoking the Driver's Open method for each connection.
> // The two-step sequence allows drivers to parse the name just once
> // and also provides access to per-Conn contexts.
> type DriverContext interface {
> // OpenConnector must parse the name in the same format that Driver.Open
> // parses the name parameter.
> OpenConnector(name string) (Connector, error)
> }
>
>
> If the database driver to wrap with ocsql also does not export its 
> driver.Driver implementation it will be not possible to use ocsql.
>
> Would like to hear from the Go team and community if adding a DriverByName 
> type function is acceptable given the use case presented above. It would 
> surely make ocsql less brittle and better supported.
>
> Cheers,
>
> Bas van Beek
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to