driver.go 1.4 KB

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