driver.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. "bufio"
  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. mc.bufReader = bufio.NewReader(mc.netConn)
  35. // Reading Handshake Initialization Packet
  36. e = mc.readInitPacket()
  37. if e != nil {
  38. return nil, e
  39. }
  40. // Send Client Authentication Packet
  41. e = mc.writeAuthPacket()
  42. if e != nil {
  43. return nil, e
  44. }
  45. // Read Result Packet
  46. e = mc.readResultOK()
  47. if e != nil {
  48. return nil, e
  49. }
  50. // Handle DSN Params
  51. e = mc.handleParams()
  52. if e != nil {
  53. return nil, e
  54. }
  55. return mc, e
  56. }
  57. func init() {
  58. sql.Register("mysql", &mysqlDriver{})
  59. }