driver.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. )
  14. type mysqlDriver struct{}
  15. // Open new Connection.
  16. // See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how
  17. // the DSN string is formated
  18. func (d *mysqlDriver) Open(dsn string) (driver.Conn, error) {
  19. var err error
  20. // New mysqlConn
  21. mc := &mysqlConn{
  22. maxPacketAllowed: maxPacketSize,
  23. maxWriteSize: maxPacketSize - 1,
  24. }
  25. mc.cfg, err = parseDSN(dsn)
  26. if err != nil {
  27. return nil, err
  28. }
  29. // Connect to Server
  30. nd := net.Dialer{Timeout: mc.cfg.timeout}
  31. mc.netConn, err = nd.Dial(mc.cfg.net, mc.cfg.addr)
  32. if err != nil {
  33. return nil, err
  34. }
  35. mc.buf = newBuffer(mc.netConn)
  36. // Reading Handshake Initialization Packet
  37. err = mc.readInitPacket()
  38. if err != nil {
  39. return nil, err
  40. }
  41. // Send Client Authentication Packet
  42. err = mc.writeAuthPacket()
  43. if err != nil {
  44. return nil, err
  45. }
  46. // Read Result Packet
  47. err = mc.readResultOK()
  48. if err != nil {
  49. return nil, err
  50. }
  51. // Get max allowed packet size
  52. maxap, err := mc.getSystemVar("max_allowed_packet")
  53. if err != nil {
  54. return nil, err
  55. }
  56. mc.maxPacketAllowed = stringToInt(maxap) - 1
  57. if mc.maxPacketAllowed < maxPacketSize {
  58. mc.maxWriteSize = mc.maxPacketAllowed
  59. }
  60. // Handle DSN Params
  61. err = mc.handleParams()
  62. if err != nil {
  63. return nil, err
  64. }
  65. return mc, err
  66. }
  67. func init() {
  68. sql.Register("mysql", &mysqlDriver{})
  69. }