driver.go 2.0 KB

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