Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
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.
107 lines
3.2 KiB
107 lines
3.2 KiB
// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. |
|
// |
|
// This Source Code Form is subject to the terms of the Mozilla Public |
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
// You can obtain one at http://mozilla.org/MPL/2.0/. |
|
|
|
// Package mysql provides a MySQL driver for Go's database/sql package. |
|
// |
|
// The driver should be used via the database/sql package: |
|
// |
|
// import "database/sql" |
|
// import _ "github.com/go-sql-driver/mysql" |
|
// |
|
// db, err := sql.Open("mysql", "user:password@/dbname") |
|
// |
|
// See https://github.com/go-sql-driver/mysql#usage for details |
|
package mysql |
|
|
|
import ( |
|
"context" |
|
"database/sql" |
|
"database/sql/driver" |
|
"net" |
|
"sync" |
|
) |
|
|
|
// MySQLDriver is exported to make the driver directly accessible. |
|
// In general the driver is used via the database/sql package. |
|
type MySQLDriver struct{} |
|
|
|
// DialFunc is a function which can be used to establish the network connection. |
|
// Custom dial functions must be registered with RegisterDial |
|
// |
|
// Deprecated: users should register a DialContextFunc instead |
|
type DialFunc func(addr string) (net.Conn, error) |
|
|
|
// DialContextFunc is a function which can be used to establish the network connection. |
|
// Custom dial functions must be registered with RegisterDialContext |
|
type DialContextFunc func(ctx context.Context, addr string) (net.Conn, error) |
|
|
|
var ( |
|
dialsLock sync.RWMutex |
|
dials map[string]DialContextFunc |
|
) |
|
|
|
// RegisterDialContext registers a custom dial function. It can then be used by the |
|
// network address mynet(addr), where mynet is the registered new network. |
|
// The current context for the connection and its address is passed to the dial function. |
|
func RegisterDialContext(net string, dial DialContextFunc) { |
|
dialsLock.Lock() |
|
defer dialsLock.Unlock() |
|
if dials == nil { |
|
dials = make(map[string]DialContextFunc) |
|
} |
|
dials[net] = dial |
|
} |
|
|
|
// RegisterDial registers a custom dial function. It can then be used by the |
|
// network address mynet(addr), where mynet is the registered new network. |
|
// addr is passed as a parameter to the dial function. |
|
// |
|
// Deprecated: users should call RegisterDialContext instead |
|
func RegisterDial(network string, dial DialFunc) { |
|
RegisterDialContext(network, func(_ context.Context, addr string) (net.Conn, error) { |
|
return dial(addr) |
|
}) |
|
} |
|
|
|
// Open new Connection. |
|
// See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how |
|
// the DSN string is formatted |
|
func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { |
|
cfg, err := ParseDSN(dsn) |
|
if err != nil { |
|
return nil, err |
|
} |
|
c := &connector{ |
|
cfg: cfg, |
|
} |
|
return c.Connect(context.Background()) |
|
} |
|
|
|
func init() { |
|
sql.Register("mysql", &MySQLDriver{}) |
|
} |
|
|
|
// NewConnector returns new driver.Connector. |
|
func NewConnector(cfg *Config) (driver.Connector, error) { |
|
cfg = cfg.Clone() |
|
// normalize the contents of cfg so calls to NewConnector have the same |
|
// behavior as MySQLDriver.OpenConnector |
|
if err := cfg.normalize(); err != nil { |
|
return nil, err |
|
} |
|
return &connector{cfg: cfg}, nil |
|
} |
|
|
|
// OpenConnector implements driver.DriverContext. |
|
func (d MySQLDriver) OpenConnector(dsn string) (driver.Connector, error) { |
|
cfg, err := ParseDSN(dsn) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return &connector{ |
|
cfg: cfg, |
|
}, nil |
|
}
|
|
|