driver.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 := &mysqlConn{
  23. cfg: parseDSN(dsn),
  24. maxPacketAllowed: maxPacketSize,
  25. maxWriteSize: maxPacketSize - 1,
  26. }
  27. // Connect to Server
  28. if _, ok := mc.cfg.params["timeout"]; ok { // with timeout
  29. var timeout time.Duration
  30. timeout, err = time.ParseDuration(mc.cfg.params["timeout"])
  31. if err == nil {
  32. mc.netConn, err = net.DialTimeout(mc.cfg.net, mc.cfg.addr, timeout)
  33. }
  34. } else { // no timeout
  35. mc.netConn, err = net.Dial(mc.cfg.net, mc.cfg.addr)
  36. }
  37. if err != nil {
  38. return nil, err
  39. }
  40. mc.buf = newBuffer(mc.netConn)
  41. // Reading Handshake Initialization Packet
  42. err = mc.readInitPacket()
  43. if err != nil {
  44. return nil, err
  45. }
  46. // Send Client Authentication Packet
  47. err = mc.writeAuthPacket()
  48. if err != nil {
  49. return nil, err
  50. }
  51. // Read Result Packet
  52. err = mc.readResultOK()
  53. if err != nil {
  54. return nil, err
  55. }
  56. // Get max allowed packet size
  57. maxap, err := mc.getSystemVar("max_allowed_packet")
  58. if err != nil {
  59. return nil, err
  60. }
  61. mc.maxPacketAllowed = stringToInt(maxap) - 1
  62. if mc.maxPacketAllowed < maxPacketSize {
  63. mc.maxWriteSize = mc.maxPacketAllowed
  64. }
  65. // Handle DSN Params
  66. err = mc.handleParams()
  67. if err != nil {
  68. return nil, err
  69. }
  70. return mc, err
  71. }
  72. func init() {
  73. sql.Register("mysql", &mysqlDriver{})
  74. }