sqlw.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package sqlw
  2. // TODO: rework all with context from request
  3. // https://golang.org/pkg/database/sql/
  4. import (
  5. "context"
  6. "database/sql"
  7. _ "github.com/go-sql-driver/mysql"
  8. "errors"
  9. "time"
  10. "golang-fave/consts"
  11. )
  12. type Rows = sql.Rows
  13. type DB struct {
  14. db *sql.DB
  15. }
  16. var ErrNoRows = sql.ErrNoRows
  17. func Open(driverName, dataSourceName string) (*DB, error) {
  18. db, err := sql.Open(driverName, dataSourceName)
  19. if err != nil {
  20. if consts.ParamDebug {
  21. log("[CM] OPEN", time.Now(), err, true)
  22. }
  23. return nil, err
  24. }
  25. if consts.ParamDebug {
  26. log("[CM] OPEN", time.Now(), err, true)
  27. }
  28. return &DB{db: db}, err
  29. }
  30. func (this *DB) Close() error {
  31. if consts.ParamDebug {
  32. err := this.db.Close()
  33. log("[CM] CLOSE", time.Now(), err, true)
  34. return err
  35. }
  36. return this.db.Close()
  37. }
  38. func (this *DB) Ping(ctx context.Context) error {
  39. if consts.ParamDebug {
  40. err := this.db.PingContext(ctx)
  41. log("[CM] PING", time.Now(), err, true)
  42. return err
  43. }
  44. return this.db.PingContext(ctx)
  45. }
  46. func (this *DB) SetConnMaxLifetime(d time.Duration) {
  47. this.db.SetConnMaxLifetime(d)
  48. }
  49. func (this *DB) SetMaxIdleConns(n int) {
  50. this.db.SetMaxIdleConns(n)
  51. }
  52. func (this *DB) SetMaxOpenConns(n int) {
  53. this.db.SetMaxOpenConns(n)
  54. }
  55. func (this *DB) QueryRow(ctx context.Context, query string, args ...interface{}) *sql.Row {
  56. if consts.ParamDebug {
  57. s := time.Now()
  58. r := this.db.QueryRowContext(ctx, query, args...)
  59. log(query, s, nil, false)
  60. return r
  61. }
  62. return this.db.QueryRow(query, args...)
  63. }
  64. func (this *DB) Begin() (*Tx, error) {
  65. tx, err := this.db.Begin()
  66. if err != nil {
  67. if consts.ParamDebug {
  68. log("[TX] TRANSACTION START", time.Now(), err, true)
  69. }
  70. return nil, err
  71. }
  72. if consts.ParamDebug {
  73. s := time.Now()
  74. log("[TX] TRANSACTION START", s, err, true)
  75. return &Tx{tx, s}, err
  76. }
  77. return &Tx{tx, time.Now()}, err
  78. }
  79. // TODO: func (db *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error)
  80. // https://golang.org/pkg/database/sql/
  81. func (this *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
  82. if consts.ParamDebug {
  83. s := time.Now()
  84. r, e := this.db.Query(query, args...)
  85. log(query, s, e, false)
  86. return r, e
  87. }
  88. return this.db.Query(query, args...)
  89. }
  90. // TODO: func (db *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (Result, error)
  91. // https://golang.org/pkg/database/sql/
  92. func (this *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
  93. if consts.ParamDebug {
  94. s := time.Now()
  95. r, e := this.db.Exec(query, args...)
  96. log(query, s, e, false)
  97. return r, e
  98. }
  99. return this.db.Exec(query, args...)
  100. }
  101. // TODO: review
  102. // https://golang.org/pkg/database/sql/
  103. func (this *DB) Transaction(queries func(tx *Tx) error) error {
  104. if queries == nil {
  105. return errors.New("queries is not set for transaction")
  106. }
  107. tx, err := this.Begin()
  108. if err != nil {
  109. return err
  110. }
  111. err = queries(tx)
  112. if err != nil {
  113. tx.Rollback()
  114. return err
  115. }
  116. return tx.Commit()
  117. }