db.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package db
  2. import (
  3. "context"
  4. "database/sql"
  5. "time"
  6. _ "github.com/go-sql-driver/mysql"
  7. )
  8. var (
  9. _db *sql.DB
  10. )
  11. type dbCfg struct {
  12. DriveName string
  13. Dsn string
  14. MaxIdleConnection int
  15. MaxOpenConnection int
  16. MaxQueryTime time.Duration
  17. }
  18. // GetConn from db conn pool
  19. func GetConn(ctx context.Context) (*sql.Conn, error) {
  20. return _db.Conn(ctx)
  21. }
  22. // Option is function option
  23. type Option func(*dbCfg)
  24. // Drivename Set mysql or sqlite
  25. func Drivename(drivename string) Option {
  26. return func(dbcfg *dbCfg) {
  27. dbcfg.DriveName = drivename
  28. }
  29. }
  30. // Dsn set dbCfg conn addr
  31. func Dsn(dsn string) func(*dbCfg) {
  32. return func(dbcfg *dbCfg) {
  33. dbcfg.Dsn = dsn
  34. }
  35. }
  36. // MaxIdleConnection set sql db max idle conn
  37. func MaxIdleConnection(idle int) Option {
  38. return func(dbcfg *dbCfg) {
  39. dbcfg.MaxIdleConnection = idle
  40. }
  41. }
  42. // MaxOpenConnection set sql db max open conn
  43. func MaxOpenConnection(open int) Option {
  44. return func(dbcfg *dbCfg) {
  45. dbcfg.MaxOpenConnection = open
  46. }
  47. }
  48. // MaxQueryTime set sql conn exec max timeout
  49. func MaxQueryTime(query time.Duration) Option {
  50. return func(dbcfg *dbCfg) {
  51. dbcfg.MaxQueryTime = query
  52. }
  53. }
  54. // NewDb create new db
  55. func NewDb(opts ...Option) (err error) {
  56. dbcfg := &dbCfg{}
  57. for _, opt := range opts {
  58. opt(dbcfg)
  59. }
  60. _db, err = sql.Open(dbcfg.DriveName, dbcfg.Dsn)
  61. if err != nil {
  62. return err
  63. }
  64. _db.SetMaxOpenConns(dbcfg.MaxOpenConnection)
  65. _db.SetMaxIdleConns(dbcfg.MaxIdleConnection)
  66. err = _db.Ping()
  67. return err
  68. }