Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.6 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. package mysql
  2. import (
  3. "context"
  4. "database/sql"
  5. "encoding/json"
  6. "fmt"
  7. "git.aiterp.net/stufflog3/stufflog3/models"
  8. "git.aiterp.net/stufflog3/stufflog3/ports/mysql/mysqlcore"
  9. "git.aiterp.net/stufflog3/stufflog3/ports/mysql/sqltypes"
  10. "git.aiterp.net/stufflog3/stufflog3/usecases/items"
  11. "git.aiterp.net/stufflog3/stufflog3/usecases/projects"
  12. "git.aiterp.net/stufflog3/stufflog3/usecases/scopes"
  13. "git.aiterp.net/stufflog3/stufflog3/usecases/sprints"
  14. "git.aiterp.net/stufflog3/stufflog3/usecases/stats"
  15. "time"
  16. _ "github.com/go-sql-driver/mysql"
  17. )
  18. type Database struct {
  19. db *sql.DB
  20. q *mysqlcore.Queries
  21. }
  22. func (db *Database) Scopes() scopes.Repository {
  23. return &scopeRepository{
  24. db: db.db,
  25. q: db.q,
  26. }
  27. }
  28. func (db *Database) Projects() projects.Repository {
  29. return &projectRepository{
  30. db: db.db,
  31. q: db.q,
  32. }
  33. }
  34. func (db *Database) Stats() stats.Repository {
  35. return &statsRepository{
  36. db: db.db,
  37. q: db.q,
  38. }
  39. }
  40. func (db *Database) Items() items.Repository {
  41. return &itemRepository{
  42. db: db.db,
  43. q: db.q,
  44. }
  45. }
  46. func (db *Database) Sprints() sprints.Repository {
  47. return &sprintRepository{
  48. db: db.db,
  49. q: db.q,
  50. }
  51. }
  52. func Connect(host string, port int, username, password, database string) (*Database, error) {
  53. db, err := sql.Open("mysql", fmt.Sprintf(
  54. "%s:%s@(%s:%d)/%s?parseTime=true", username, password, host, port, database,
  55. ))
  56. if err != nil {
  57. return nil, err
  58. }
  59. db.SetMaxOpenConns(10)
  60. db.SetMaxIdleConns(10)
  61. db.SetConnMaxIdleTime(time.Minute)
  62. err = db.Ping()
  63. if err != nil {
  64. return nil, err
  65. }
  66. q, err := mysqlcore.Prepare(context.Background(), db)
  67. if err != nil {
  68. return nil, err
  69. }
  70. return &Database{db: db, q: q}, nil
  71. }
  72. func timePtr(nullTime sql.NullTime) *time.Time {
  73. if nullTime.Valid {
  74. return &nullTime.Time
  75. } else {
  76. return nil
  77. }
  78. }
  79. func intPtr(nullInt32 sql.NullInt32) *int {
  80. if nullInt32.Valid {
  81. v := int(nullInt32.Int32)
  82. return &v
  83. } else {
  84. return nil
  85. }
  86. }
  87. func sqlTimePtr(ptr *time.Time) sql.NullTime {
  88. if ptr != nil {
  89. return sql.NullTime{Time: *ptr, Valid: true}
  90. } else {
  91. return sql.NullTime{Valid: false}
  92. }
  93. }
  94. func sqlDatePtr(ptr *models.Date) sqltypes.NullDate {
  95. if ptr != nil {
  96. return sqltypes.NullDate{Date: *ptr, Valid: true}
  97. } else {
  98. return sqltypes.NullDate{Valid: false}
  99. }
  100. }
  101. func sqlIntPtr(ptr *int) sql.NullInt32 {
  102. if ptr != nil {
  103. return sql.NullInt32{Int32: int32(*ptr), Valid: true}
  104. } else {
  105. return sql.NullInt32{Valid: false}
  106. }
  107. }
  108. func sqlJsonPtr(ptr interface{}) sqltypes.NullRawMessage {
  109. if ptr != nil {
  110. j, err := json.Marshal(ptr)
  111. return sqltypes.NullRawMessage{RawMessage: j, Valid: err == nil}
  112. } else {
  113. return sqltypes.NullRawMessage{Valid: false}
  114. }
  115. }