driver.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2012 Julien Schmidt. All rights reserved.
  2. // http://www.julienschmidt.com
  3. //
  4. // This Source Code Form is subject to the terms of the Mozilla Public
  5. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  6. // You can obtain one at http://mozilla.org/MPL/2.0/.
  7. // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
  8. package mysql
  9. import (
  10. "database/sql"
  11. "database/sql/driver"
  12. "net"
  13. "time"
  14. )
  15. type mysqlDriver struct{}
  16. // Open new Connection.
  17. // See https://github.com/Go-SQL-Driver/MySQL#dsn-data-source-name for how
  18. // the DSN string is formated
  19. func (d *mysqlDriver) Open(dsn string) (driver.Conn, error) {
  20. var err error
  21. // New mysqlConn
  22. mc := new(mysqlConn)
  23. mc.cfg = parseDSN(dsn)
  24. // Connect to Server
  25. if _, ok := mc.cfg.params["timeout"]; ok { // with timeout
  26. var timeout time.Duration
  27. timeout, err = time.ParseDuration(mc.cfg.params["timeout"])
  28. if err == nil {
  29. mc.netConn, err = net.DialTimeout(mc.cfg.net, mc.cfg.addr, timeout)
  30. }
  31. } else { // no timeout
  32. mc.netConn, err = net.Dial(mc.cfg.net, mc.cfg.addr)
  33. }
  34. if err != nil {
  35. return nil, err
  36. }
  37. mc.buf = newBuffer(mc.netConn)
  38. // Reading Handshake Initialization Packet
  39. err = mc.readInitPacket()
  40. if err != nil {
  41. return nil, err
  42. }
  43. // Send Client Authentication Packet
  44. err = mc.writeAuthPacket()
  45. if err != nil {
  46. return nil, err
  47. }
  48. // Read Result Packet
  49. err = mc.readResultOK()
  50. if err != nil {
  51. return nil, err
  52. }
  53. // Handle DSN Params
  54. err = mc.handleParams()
  55. if err != nil {
  56. return nil, err
  57. }
  58. return mc, err
  59. }
  60. func init() {
  61. sql.Register("mysql", &mysqlDriver{})
  62. }