driver.go 1.4 KB

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