driver.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. "database/sql"
  12. "database/sql/driver"
  13. "errors"
  14. "net"
  15. )
  16. type mysqlDriver struct{}
  17. // Open new Connection.
  18. // See http://code.google.com/p/go-mysql-driver/#DSN_(Data_Source_Name) for how
  19. // the DSN string is formated
  20. func (d *mysqlDriver) Open(dsn string) (driver.Conn, error) {
  21. var e error
  22. // New mysqlConn
  23. mc := new(mysqlConn)
  24. mc.cfg = parseDSN(dsn)
  25. if mc.cfg.dbname == "" {
  26. e = errors.New("Incomplete or invalid DSN")
  27. return nil, e
  28. }
  29. // Connect to Server
  30. mc.netConn, e = net.Dial(mc.cfg.net, mc.cfg.addr)
  31. if e != nil {
  32. return nil, e
  33. }
  34. // Reading Handshake Initialization Packet
  35. e = mc.readInitPacket()
  36. if e != nil {
  37. return nil, e
  38. }
  39. // Send Client Authentication Packet
  40. e = mc.writeAuthPacket()
  41. if e != nil {
  42. return nil, e
  43. }
  44. // Read Result Packet
  45. e = mc.readResultOK()
  46. if e != nil {
  47. return nil, e
  48. }
  49. // Handle DSN Params
  50. e = mc.handleParams()
  51. if e != nil {
  52. return nil, e
  53. }
  54. return mc, e
  55. }
  56. func init() {
  57. sql.Register("mysql", &mysqlDriver{})
  58. }