You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package sqlexp
|
|
|
|
import (
|
|
"context"
|
|
"database/sql/driver"
|
|
"errors"
|
|
"reflect"
|
|
)
|
|
|
|
const (
|
|
DialectPostgres = "postgres"
|
|
DialectTSQL = "tsql"
|
|
DialectMySQL = "mysql"
|
|
DialectSQLite = "sqlite"
|
|
DialectOracle = "oracle"
|
|
)
|
|
|
|
// Namer returns the name of the database and the SQL dialect it
|
|
// uses.
|
|
type Namer interface {
|
|
// Name of the database management system.
|
|
//
|
|
// Examples:
|
|
// "posgresql-9.6"
|
|
// "sqlserver-10.54.32"
|
|
// "cockroachdb-1.0"
|
|
Name() string
|
|
|
|
// Dialect of SQL used in the database.
|
|
Dialect() string
|
|
}
|
|
|
|
// DriverNamer may be implemented on the driver.Driver interface.
|
|
// It may need to request information from the server to return
|
|
// the correct information.
|
|
type DriverNamer interface {
|
|
Namer(ctx context.Context) (Namer, error)
|
|
}
|
|
|
|
// NamerFromDriver returns the DriverNamer from the DB if
|
|
// it is implemented.
|
|
func NamerFromDriver(d driver.Driver, ctx context.Context) (Namer, error) {
|
|
if q, is := d.(DriverNamer); is {
|
|
return q.Namer(ctx)
|
|
}
|
|
dv := reflect.ValueOf(d)
|
|
|
|
d, found := internalDrivers[dv.Type().String()]
|
|
if found {
|
|
if q, is := d.(DriverNamer); is {
|
|
return q.Namer(ctx)
|
|
}
|
|
}
|
|
return nil, errors.New("namer not found")
|
|
}
|