Upgrade xorm to v1.0.3 (#12210)
Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: techknowlogick <techknowlogick@gitea.io>tokarchuk/v1.17
parent
3973a4609e
commit
d08996c7b9
@ -1,6 +1,8 @@ |
|||||||
module github.com/PuerkitoBio/goquery |
module github.com/PuerkitoBio/goquery |
||||||
|
|
||||||
require ( |
require ( |
||||||
github.com/andybalholm/cascadia v1.0.0 |
github.com/andybalholm/cascadia v1.1.0 |
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a |
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 |
||||||
) |
) |
||||||
|
|
||||||
|
go 1.13 |
||||||
|
@ -1,5 +1,8 @@ |
|||||||
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= |
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= |
||||||
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= |
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= |
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= |
||||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= |
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= |
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U= |
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= |
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= |
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= |
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= |
||||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@ |
|||||||
|
package cascadia |
||||||
|
|
||||||
|
// Specificity is the CSS specificity as defined in
|
||||||
|
// https://www.w3.org/TR/selectors/#specificity-rules
|
||||||
|
// with the convention Specificity = [A,B,C].
|
||||||
|
type Specificity [3]int |
||||||
|
|
||||||
|
// returns `true` if s < other (strictly), false otherwise
|
||||||
|
func (s Specificity) Less(other Specificity) bool { |
||||||
|
for i := range s { |
||||||
|
if s[i] < other[i] { |
||||||
|
return true |
||||||
|
} |
||||||
|
if s[i] > other[i] { |
||||||
|
return false |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
func (s Specificity) Add(other Specificity) Specificity { |
||||||
|
for i, sp := range other { |
||||||
|
s[i] += sp |
||||||
|
} |
||||||
|
return s |
||||||
|
} |
@ -1,23 +0,0 @@ |
|||||||
# Contributing Guidelines |
|
||||||
|
|
||||||
## Reporting Issues |
|
||||||
|
|
||||||
Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed). |
|
||||||
|
|
||||||
## Contributing Code |
|
||||||
|
|
||||||
By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file. |
|
||||||
Don't forget to add yourself to the AUTHORS file. |
|
||||||
|
|
||||||
### Code Review |
|
||||||
|
|
||||||
Everyone is invited to review and comment on pull requests. |
|
||||||
If it looks fine to you, comment with "LGTM" (Looks good to me). |
|
||||||
|
|
||||||
If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. |
|
||||||
|
|
||||||
Before merging the Pull Request, at least one [team member](https://github.com/go-sql-driver?tab=members) must have commented with "LGTM". |
|
||||||
|
|
||||||
## Development Ideas |
|
||||||
|
|
||||||
If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/go-sql-driver/mysql/wiki/Development-Ideas) Wiki page. |
|
@ -0,0 +1,54 @@ |
|||||||
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
|
//
|
||||||
|
// Copyright 2019 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/.
|
||||||
|
|
||||||
|
// +build linux darwin dragonfly freebsd netbsd openbsd solaris illumos
|
||||||
|
|
||||||
|
package mysql |
||||||
|
|
||||||
|
import ( |
||||||
|
"errors" |
||||||
|
"io" |
||||||
|
"net" |
||||||
|
"syscall" |
||||||
|
) |
||||||
|
|
||||||
|
var errUnexpectedRead = errors.New("unexpected read from socket") |
||||||
|
|
||||||
|
func connCheck(conn net.Conn) error { |
||||||
|
var sysErr error |
||||||
|
|
||||||
|
sysConn, ok := conn.(syscall.Conn) |
||||||
|
if !ok { |
||||||
|
return nil |
||||||
|
} |
||||||
|
rawConn, err := sysConn.SyscallConn() |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
err = rawConn.Read(func(fd uintptr) bool { |
||||||
|
var buf [1]byte |
||||||
|
n, err := syscall.Read(int(fd), buf[:]) |
||||||
|
switch { |
||||||
|
case n == 0 && err == nil: |
||||||
|
sysErr = io.EOF |
||||||
|
case n > 0: |
||||||
|
sysErr = errUnexpectedRead |
||||||
|
case err == syscall.EAGAIN || err == syscall.EWOULDBLOCK: |
||||||
|
sysErr = nil |
||||||
|
default: |
||||||
|
sysErr = err |
||||||
|
} |
||||||
|
return true |
||||||
|
}) |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
return sysErr |
||||||
|
} |
@ -1,19 +1,17 @@ |
|||||||
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
//
|
//
|
||||||
// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved.
|
// Copyright 2019 The Go-MySQL-Driver Authors. All rights reserved.
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
// 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,
|
// 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/.
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
// +build appengine
|
// +build !linux,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!illumos
|
||||||
|
|
||||||
package mysql |
package mysql |
||||||
|
|
||||||
import ( |
import "net" |
||||||
"google.golang.org/appengine/cloudsql" |
|
||||||
) |
|
||||||
|
|
||||||
func init() { |
func connCheck(conn net.Conn) error { |
||||||
RegisterDial("cloudsql", cloudsql.Dial) |
return nil |
||||||
} |
} |
@ -1,207 +0,0 @@ |
|||||||
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
|
||||||
//
|
|
||||||
// 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/.
|
|
||||||
|
|
||||||
// +build go1.8
|
|
||||||
|
|
||||||
package mysql |
|
||||||
|
|
||||||
import ( |
|
||||||
"context" |
|
||||||
"database/sql" |
|
||||||
"database/sql/driver" |
|
||||||
) |
|
||||||
|
|
||||||
// Ping implements driver.Pinger interface
|
|
||||||
func (mc *mysqlConn) Ping(ctx context.Context) (err error) { |
|
||||||
if mc.closed.IsSet() { |
|
||||||
errLog.Print(ErrInvalidConn) |
|
||||||
return driver.ErrBadConn |
|
||||||
} |
|
||||||
|
|
||||||
if err = mc.watchCancel(ctx); err != nil { |
|
||||||
return |
|
||||||
} |
|
||||||
defer mc.finish() |
|
||||||
|
|
||||||
if err = mc.writeCommandPacket(comPing); err != nil { |
|
||||||
return |
|
||||||
} |
|
||||||
|
|
||||||
return mc.readResultOK() |
|
||||||
} |
|
||||||
|
|
||||||
// BeginTx implements driver.ConnBeginTx interface
|
|
||||||
func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { |
|
||||||
if err := mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
defer mc.finish() |
|
||||||
|
|
||||||
if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { |
|
||||||
level, err := mapIsolationLevel(opts.Isolation) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return mc.begin(opts.ReadOnly) |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { |
|
||||||
dargs, err := namedValueToValue(args) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
if err := mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
rows, err := mc.query(query, dargs) |
|
||||||
if err != nil { |
|
||||||
mc.finish() |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
rows.finish = mc.finish |
|
||||||
return rows, err |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { |
|
||||||
dargs, err := namedValueToValue(args) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
if err := mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
defer mc.finish() |
|
||||||
|
|
||||||
return mc.Exec(query, dargs) |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { |
|
||||||
if err := mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
stmt, err := mc.Prepare(query) |
|
||||||
mc.finish() |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
select { |
|
||||||
default: |
|
||||||
case <-ctx.Done(): |
|
||||||
stmt.Close() |
|
||||||
return nil, ctx.Err() |
|
||||||
} |
|
||||||
return stmt, nil |
|
||||||
} |
|
||||||
|
|
||||||
func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { |
|
||||||
dargs, err := namedValueToValue(args) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
if err := stmt.mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
rows, err := stmt.query(dargs) |
|
||||||
if err != nil { |
|
||||||
stmt.mc.finish() |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
rows.finish = stmt.mc.finish |
|
||||||
return rows, err |
|
||||||
} |
|
||||||
|
|
||||||
func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { |
|
||||||
dargs, err := namedValueToValue(args) |
|
||||||
if err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
|
|
||||||
if err := stmt.mc.watchCancel(ctx); err != nil { |
|
||||||
return nil, err |
|
||||||
} |
|
||||||
defer stmt.mc.finish() |
|
||||||
|
|
||||||
return stmt.Exec(dargs) |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) watchCancel(ctx context.Context) error { |
|
||||||
if mc.watching { |
|
||||||
// Reach here if canceled,
|
|
||||||
// so the connection is already invalid
|
|
||||||
mc.cleanup() |
|
||||||
return nil |
|
||||||
} |
|
||||||
// When ctx is already cancelled, don't watch it.
|
|
||||||
if err := ctx.Err(); err != nil { |
|
||||||
return err |
|
||||||
} |
|
||||||
// When ctx is not cancellable, don't watch it.
|
|
||||||
if ctx.Done() == nil { |
|
||||||
return nil |
|
||||||
} |
|
||||||
// When watcher is not alive, can't watch it.
|
|
||||||
if mc.watcher == nil { |
|
||||||
return nil |
|
||||||
} |
|
||||||
|
|
||||||
mc.watching = true |
|
||||||
mc.watcher <- ctx |
|
||||||
return nil |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) startWatcher() { |
|
||||||
watcher := make(chan mysqlContext, 1) |
|
||||||
mc.watcher = watcher |
|
||||||
finished := make(chan struct{}) |
|
||||||
mc.finished = finished |
|
||||||
go func() { |
|
||||||
for { |
|
||||||
var ctx mysqlContext |
|
||||||
select { |
|
||||||
case ctx = <-watcher: |
|
||||||
case <-mc.closech: |
|
||||||
return |
|
||||||
} |
|
||||||
|
|
||||||
select { |
|
||||||
case <-ctx.Done(): |
|
||||||
mc.cancel(ctx.Err()) |
|
||||||
case <-finished: |
|
||||||
case <-mc.closech: |
|
||||||
return |
|
||||||
} |
|
||||||
} |
|
||||||
}() |
|
||||||
} |
|
||||||
|
|
||||||
func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { |
|
||||||
nv.Value, err = converter{}.ConvertValue(nv.Value) |
|
||||||
return |
|
||||||
} |
|
||||||
|
|
||||||
// ResetSession implements driver.SessionResetter.
|
|
||||||
// (From Go 1.10)
|
|
||||||
func (mc *mysqlConn) ResetSession(ctx context.Context) error { |
|
||||||
if mc.closed.IsSet() { |
|
||||||
return driver.ErrBadConn |
|
||||||
} |
|
||||||
return nil |
|
||||||
} |
|
@ -0,0 +1,146 @@ |
|||||||
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
|
//
|
||||||
|
// Copyright 2018 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 |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"database/sql/driver" |
||||||
|
"net" |
||||||
|
) |
||||||
|
|
||||||
|
type connector struct { |
||||||
|
cfg *Config // immutable private copy.
|
||||||
|
} |
||||||
|
|
||||||
|
// Connect implements driver.Connector interface.
|
||||||
|
// Connect returns a connection to the database.
|
||||||
|
func (c *connector) Connect(ctx context.Context) (driver.Conn, error) { |
||||||
|
var err error |
||||||
|
|
||||||
|
// New mysqlConn
|
||||||
|
mc := &mysqlConn{ |
||||||
|
maxAllowedPacket: maxPacketSize, |
||||||
|
maxWriteSize: maxPacketSize - 1, |
||||||
|
closech: make(chan struct{}), |
||||||
|
cfg: c.cfg, |
||||||
|
} |
||||||
|
mc.parseTime = mc.cfg.ParseTime |
||||||
|
|
||||||
|
// Connect to Server
|
||||||
|
dialsLock.RLock() |
||||||
|
dial, ok := dials[mc.cfg.Net] |
||||||
|
dialsLock.RUnlock() |
||||||
|
if ok { |
||||||
|
dctx := ctx |
||||||
|
if mc.cfg.Timeout > 0 { |
||||||
|
var cancel context.CancelFunc |
||||||
|
dctx, cancel = context.WithTimeout(ctx, c.cfg.Timeout) |
||||||
|
defer cancel() |
||||||
|
} |
||||||
|
mc.netConn, err = dial(dctx, mc.cfg.Addr) |
||||||
|
} else { |
||||||
|
nd := net.Dialer{Timeout: mc.cfg.Timeout} |
||||||
|
mc.netConn, err = nd.DialContext(ctx, mc.cfg.Net, mc.cfg.Addr) |
||||||
|
} |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
// Enable TCP Keepalives on TCP connections
|
||||||
|
if tc, ok := mc.netConn.(*net.TCPConn); ok { |
||||||
|
if err := tc.SetKeepAlive(true); err != nil { |
||||||
|
// Don't send COM_QUIT before handshake.
|
||||||
|
mc.netConn.Close() |
||||||
|
mc.netConn = nil |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Call startWatcher for context support (From Go 1.8)
|
||||||
|
mc.startWatcher() |
||||||
|
if err := mc.watchCancel(ctx); err != nil { |
||||||
|
mc.cleanup() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
defer mc.finish() |
||||||
|
|
||||||
|
mc.buf = newBuffer(mc.netConn) |
||||||
|
|
||||||
|
// Set I/O timeouts
|
||||||
|
mc.buf.timeout = mc.cfg.ReadTimeout |
||||||
|
mc.writeTimeout = mc.cfg.WriteTimeout |
||||||
|
|
||||||
|
// Reading Handshake Initialization Packet
|
||||||
|
authData, plugin, err := mc.readHandshakePacket() |
||||||
|
if err != nil { |
||||||
|
mc.cleanup() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
if plugin == "" { |
||||||
|
plugin = defaultAuthPlugin |
||||||
|
} |
||||||
|
|
||||||
|
// Send Client Authentication Packet
|
||||||
|
authResp, err := mc.auth(authData, plugin) |
||||||
|
if err != nil { |
||||||
|
// try the default auth plugin, if using the requested plugin failed
|
||||||
|
errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) |
||||||
|
plugin = defaultAuthPlugin |
||||||
|
authResp, err = mc.auth(authData, plugin) |
||||||
|
if err != nil { |
||||||
|
mc.cleanup() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
} |
||||||
|
if err = mc.writeHandshakeResponsePacket(authResp, plugin); err != nil { |
||||||
|
mc.cleanup() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
// Handle response to auth packet, switch methods if possible
|
||||||
|
if err = mc.handleAuthResult(authData, plugin); err != nil { |
||||||
|
// Authentication failed and MySQL has already closed the connection
|
||||||
|
// (https://dev.mysql.com/doc/internals/en/authentication-fails.html).
|
||||||
|
// Do not send COM_QUIT, just cleanup and return the error.
|
||||||
|
mc.cleanup() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
if mc.cfg.MaxAllowedPacket > 0 { |
||||||
|
mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket |
||||||
|
} else { |
||||||
|
// Get max allowed packet size
|
||||||
|
maxap, err := mc.getSystemVar("max_allowed_packet") |
||||||
|
if err != nil { |
||||||
|
mc.Close() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
mc.maxAllowedPacket = stringToInt(maxap) - 1 |
||||||
|
} |
||||||
|
if mc.maxAllowedPacket < maxPacketSize { |
||||||
|
mc.maxWriteSize = mc.maxAllowedPacket |
||||||
|
} |
||||||
|
|
||||||
|
// Handle DSN Params
|
||||||
|
err = mc.handleParams() |
||||||
|
if err != nil { |
||||||
|
mc.Close() |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
return mc, nil |
||||||
|
} |
||||||
|
|
||||||
|
// Driver implements driver.Connector interface.
|
||||||
|
// Driver returns &MySQLDriver{}.
|
||||||
|
func (c *connector) Driver() driver.Driver { |
||||||
|
return &MySQLDriver{} |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
module github.com/go-sql-driver/mysql |
||||||
|
|
||||||
|
go 1.10 |
@ -0,0 +1,50 @@ |
|||||||
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
|
//
|
||||||
|
// Copyright 2013 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 |
||||||
|
|
||||||
|
import ( |
||||||
|
"database/sql/driver" |
||||||
|
"fmt" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
// Scan implements the Scanner interface.
|
||||||
|
// The value type must be time.Time or string / []byte (formatted time-string),
|
||||||
|
// otherwise Scan fails.
|
||||||
|
func (nt *NullTime) Scan(value interface{}) (err error) { |
||||||
|
if value == nil { |
||||||
|
nt.Time, nt.Valid = time.Time{}, false |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
switch v := value.(type) { |
||||||
|
case time.Time: |
||||||
|
nt.Time, nt.Valid = v, true |
||||||
|
return |
||||||
|
case []byte: |
||||||
|
nt.Time, err = parseDateTime(string(v), time.UTC) |
||||||
|
nt.Valid = (err == nil) |
||||||
|
return |
||||||
|
case string: |
||||||
|
nt.Time, err = parseDateTime(v, time.UTC) |
||||||
|
nt.Valid = (err == nil) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
nt.Valid = false |
||||||
|
return fmt.Errorf("Can't convert %T to time.Time", value) |
||||||
|
} |
||||||
|
|
||||||
|
// Value implements the driver Valuer interface.
|
||||||
|
func (nt NullTime) Value() (driver.Value, error) { |
||||||
|
if !nt.Valid { |
||||||
|
return nil, nil |
||||||
|
} |
||||||
|
return nt.Time, nil |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
|
//
|
||||||
|
// Copyright 2013 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/.
|
||||||
|
|
||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
package mysql |
||||||
|
|
||||||
|
import ( |
||||||
|
"database/sql" |
||||||
|
) |
||||||
|
|
||||||
|
// NullTime represents a time.Time that may be NULL.
|
||||||
|
// NullTime implements the Scanner interface so
|
||||||
|
// it can be used as a scan destination:
|
||||||
|
//
|
||||||
|
// var nt NullTime
|
||||||
|
// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt)
|
||||||
|
// ...
|
||||||
|
// if nt.Valid {
|
||||||
|
// // use nt.Time
|
||||||
|
// } else {
|
||||||
|
// // NULL value
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This NullTime implementation is not driver-specific
|
||||||
|
type NullTime sql.NullTime |
@ -0,0 +1,34 @@ |
|||||||
|
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
||||||
|
//
|
||||||
|
// Copyright 2013 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/.
|
||||||
|
|
||||||
|
// +build !go1.13
|
||||||
|
|
||||||
|
package mysql |
||||||
|
|
||||||
|
import ( |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
// NullTime represents a time.Time that may be NULL.
|
||||||
|
// NullTime implements the Scanner interface so
|
||||||
|
// it can be used as a scan destination:
|
||||||
|
//
|
||||||
|
// var nt NullTime
|
||||||
|
// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt)
|
||||||
|
// ...
|
||||||
|
// if nt.Valid {
|
||||||
|
// // use nt.Time
|
||||||
|
// } else {
|
||||||
|
// // NULL value
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This NullTime implementation is not driver-specific
|
||||||
|
type NullTime struct { |
||||||
|
Time time.Time |
||||||
|
Valid bool // Valid is true if Time is not NULL
|
||||||
|
} |
@ -1,40 +0,0 @@ |
|||||||
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
|
||||||
//
|
|
||||||
// Copyright 2017 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/.
|
|
||||||
|
|
||||||
// +build go1.7
|
|
||||||
// +build !go1.8
|
|
||||||
|
|
||||||
package mysql |
|
||||||
|
|
||||||
import "crypto/tls" |
|
||||||
|
|
||||||
func cloneTLSConfig(c *tls.Config) *tls.Config { |
|
||||||
return &tls.Config{ |
|
||||||
Rand: c.Rand, |
|
||||||
Time: c.Time, |
|
||||||
Certificates: c.Certificates, |
|
||||||
NameToCertificate: c.NameToCertificate, |
|
||||||
GetCertificate: c.GetCertificate, |
|
||||||
RootCAs: c.RootCAs, |
|
||||||
NextProtos: c.NextProtos, |
|
||||||
ServerName: c.ServerName, |
|
||||||
ClientAuth: c.ClientAuth, |
|
||||||
ClientCAs: c.ClientCAs, |
|
||||||
InsecureSkipVerify: c.InsecureSkipVerify, |
|
||||||
CipherSuites: c.CipherSuites, |
|
||||||
PreferServerCipherSuites: c.PreferServerCipherSuites, |
|
||||||
SessionTicketsDisabled: c.SessionTicketsDisabled, |
|
||||||
SessionTicketKey: c.SessionTicketKey, |
|
||||||
ClientSessionCache: c.ClientSessionCache, |
|
||||||
MinVersion: c.MinVersion, |
|
||||||
MaxVersion: c.MaxVersion, |
|
||||||
CurvePreferences: c.CurvePreferences, |
|
||||||
DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, |
|
||||||
Renegotiation: c.Renegotiation, |
|
||||||
} |
|
||||||
} |
|
@ -1,50 +0,0 @@ |
|||||||
// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
|
|
||||||
//
|
|
||||||
// Copyright 2017 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/.
|
|
||||||
|
|
||||||
// +build go1.8
|
|
||||||
|
|
||||||
package mysql |
|
||||||
|
|
||||||
import ( |
|
||||||
"crypto/tls" |
|
||||||
"database/sql" |
|
||||||
"database/sql/driver" |
|
||||||
"errors" |
|
||||||
"fmt" |
|
||||||
) |
|
||||||
|
|
||||||
func cloneTLSConfig(c *tls.Config) *tls.Config { |
|
||||||
return c.Clone() |
|
||||||
} |
|
||||||
|
|
||||||
func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { |
|
||||||
dargs := make([]driver.Value, len(named)) |
|
||||||
for n, param := range named { |
|
||||||
if len(param.Name) > 0 { |
|
||||||
// TODO: support the use of Named Parameters #561
|
|
||||||
return nil, errors.New("mysql: driver does not support the use of Named Parameters") |
|
||||||
} |
|
||||||
dargs[n] = param.Value |
|
||||||
} |
|
||||||
return dargs, nil |
|
||||||
} |
|
||||||
|
|
||||||
func mapIsolationLevel(level driver.IsolationLevel) (string, error) { |
|
||||||
switch sql.IsolationLevel(level) { |
|
||||||
case sql.LevelRepeatableRead: |
|
||||||
return "REPEATABLE READ", nil |
|
||||||
case sql.LevelReadCommitted: |
|
||||||
return "READ COMMITTED", nil |
|
||||||
case sql.LevelReadUncommitted: |
|
||||||
return "READ UNCOMMITTED", nil |
|
||||||
case sql.LevelSerializable: |
|
||||||
return "SERIALIZABLE", nil |
|
||||||
default: |
|
||||||
return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) |
|
||||||
} |
|
||||||
} |
|
@ -1,62 +0,0 @@ |
|||||||
// Copyright 2013 Google Inc. All rights reserved.
|
|
||||||
// Use of this source code is governed by the Apache 2.0
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
/* |
|
||||||
Package cloudsql exposes access to Google Cloud SQL databases. |
|
||||||
|
|
||||||
This package does not work in App Engine "flexible environment". |
|
||||||
|
|
||||||
This package is intended for MySQL drivers to make App Engine-specific |
|
||||||
connections. Applications should use this package through database/sql: |
|
||||||
Select a pure Go MySQL driver that supports this package, and use sql.Open |
|
||||||
with protocol "cloudsql" and an address of the Cloud SQL instance. |
|
||||||
|
|
||||||
A Go MySQL driver that has been tested to work well with Cloud SQL |
|
||||||
is the go-sql-driver: |
|
||||||
import "database/sql" |
|
||||||
import _ "github.com/go-sql-driver/mysql" |
|
||||||
|
|
||||||
db, err := sql.Open("mysql", "user@cloudsql(project-id:instance-name)/dbname") |
|
||||||
|
|
||||||
|
|
||||||
Another driver that works well with Cloud SQL is the mymysql driver: |
|
||||||
import "database/sql" |
|
||||||
import _ "github.com/ziutek/mymysql/godrv" |
|
||||||
|
|
||||||
db, err := sql.Open("mymysql", "cloudsql:instance-name*dbname/user/password") |
|
||||||
|
|
||||||
|
|
||||||
Using either of these drivers, you can perform a standard SQL query. |
|
||||||
This example assumes there is a table named 'users' with |
|
||||||
columns 'first_name' and 'last_name': |
|
||||||
|
|
||||||
rows, err := db.Query("SELECT first_name, last_name FROM users") |
|
||||||
if err != nil { |
|
||||||
log.Errorf(ctx, "db.Query: %v", err) |
|
||||||
} |
|
||||||
defer rows.Close() |
|
||||||
|
|
||||||
for rows.Next() { |
|
||||||
var firstName string |
|
||||||
var lastName string |
|
||||||
if err := rows.Scan(&firstName, &lastName); err != nil { |
|
||||||
log.Errorf(ctx, "rows.Scan: %v", err) |
|
||||||
continue |
|
||||||
} |
|
||||||
log.Infof(ctx, "First: %v - Last: %v", firstName, lastName) |
|
||||||
} |
|
||||||
if err := rows.Err(); err != nil { |
|
||||||
log.Errorf(ctx, "Row error: %v", err) |
|
||||||
} |
|
||||||
*/ |
|
||||||
package cloudsql |
|
||||||
|
|
||||||
import ( |
|
||||||
"net" |
|
||||||
) |
|
||||||
|
|
||||||
// Dial connects to the named Cloud SQL instance.
|
|
||||||
func Dial(instance string) (net.Conn, error) { |
|
||||||
return connect(instance) |
|
||||||
} |
|
@ -1,17 +0,0 @@ |
|||||||
// Copyright 2013 Google Inc. All rights reserved.
|
|
||||||
// Use of this source code is governed by the Apache 2.0
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build appengine
|
|
||||||
|
|
||||||
package cloudsql |
|
||||||
|
|
||||||
import ( |
|
||||||
"net" |
|
||||||
|
|
||||||
"appengine/cloudsql" |
|
||||||
) |
|
||||||
|
|
||||||
func connect(instance string) (net.Conn, error) { |
|
||||||
return cloudsql.Dial(instance) |
|
||||||
} |
|
@ -1,16 +0,0 @@ |
|||||||
// Copyright 2013 Google Inc. All rights reserved.
|
|
||||||
// Use of this source code is governed by the Apache 2.0
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !appengine
|
|
||||||
|
|
||||||
package cloudsql |
|
||||||
|
|
||||||
import ( |
|
||||||
"errors" |
|
||||||
"net" |
|
||||||
) |
|
||||||
|
|
||||||
func connect(instance string) (net.Conn, error) { |
|
||||||
return nil, errors.New(`cloudsql: not supported in App Engine "flexible environment"`) |
|
||||||
} |
|
Loading…
Reference in new issue