sqlite.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package repository
  2. import (
  3. "database/sql"
  4. "time"
  5. "job-cheng-xing/model"
  6. _ "github.com/mattn/go-sqlite3"
  7. )
  8. type SQLiteRepo struct {
  9. db *sql.DB
  10. }
  11. func NewSQLiteRepo(dbPath string) (*SQLiteRepo, error) {
  12. db, err := sql.Open("sqlite3", dbPath)
  13. if err != nil {
  14. return nil, err
  15. }
  16. _, err = db.Exec(`
  17. CREATE TABLE IF NOT EXISTS orders (
  18. id TEXT PRIMARY KEY,
  19. status TEXT NOT NULL,
  20. service_time TEXT NOT NULL,
  21. duration INTEGER NOT NULL,
  22. address TEXT NOT NULL,
  23. provider_id TEXT,
  24. created_at TEXT NOT NULL,
  25. updated_at TEXT NOT NULL
  26. )
  27. `)
  28. if err != nil {
  29. db.Close()
  30. return nil, err
  31. }
  32. return &SQLiteRepo{db: db}, nil
  33. }
  34. func (r *SQLiteRepo) Close() error {
  35. return r.db.Close()
  36. }
  37. func (r *SQLiteRepo) Create(order *model.Order) error {
  38. _, err := r.db.Exec(
  39. `INSERT INTO orders (id, status, service_time, duration, address, provider_id, created_at, updated_at)
  40. VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
  41. order.ID, string(order.Status), order.ServiceTime.Format(time.RFC3339),
  42. order.Duration, order.Address, order.ProviderID,
  43. order.CreatedAt.Format(time.RFC3339), order.UpdatedAt.Format(time.RFC3339),
  44. )
  45. return err
  46. }
  47. func (r *SQLiteRepo) FindByID(id string) (*model.Order, error) {
  48. row := r.db.QueryRow(
  49. `SELECT id, status, service_time, duration, address, provider_id, created_at, updated_at
  50. FROM orders WHERE id = ?`, id,
  51. )
  52. var order model.Order
  53. var serviceTimeStr, createdAtStr, updatedAtStr string
  54. var providerID sql.NullString
  55. err := row.Scan(
  56. &order.ID, &order.Status, &serviceTimeStr,
  57. &order.Duration, &order.Address, &providerID,
  58. &createdAtStr, &updatedAtStr,
  59. )
  60. if err == sql.ErrNoRows {
  61. return nil, model.ErrNotFound
  62. }
  63. if err != nil {
  64. return nil, err
  65. }
  66. order.ServiceTime, _ = time.Parse(time.RFC3339, serviceTimeStr)
  67. order.CreatedAt, _ = time.Parse(time.RFC3339, createdAtStr)
  68. order.UpdatedAt, _ = time.Parse(time.RFC3339, updatedAtStr)
  69. if providerID.Valid {
  70. order.ProviderID = &providerID.String
  71. }
  72. return &order, nil
  73. }
  74. func (r *SQLiteRepo) Update(id string, oldStatus model.OrderStatus, newOrder *model.Order) error {
  75. now := time.Now().Format(time.RFC3339)
  76. var providerID interface{}
  77. if newOrder.ProviderID != nil {
  78. providerID = *newOrder.ProviderID
  79. }
  80. result, err := r.db.Exec(
  81. `UPDATE orders SET status = ?, provider_id = ?, updated_at = ? WHERE id = ? AND status = ?`,
  82. string(newOrder.Status), providerID, now, id, string(oldStatus),
  83. )
  84. if err != nil {
  85. return err
  86. }
  87. rowsAffected, _ := result.RowsAffected()
  88. if rowsAffected == 0 {
  89. _, err := r.FindByID(id)
  90. if err == model.ErrNotFound {
  91. return model.ErrNotFound
  92. }
  93. return model.ErrStatusConflict
  94. }
  95. return nil
  96. }