db.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package manager
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/boltdb/bolt"
  6. "github.com/go-redis/redis/v8"
  7. . "github.com/tuna/tunasync/internal"
  8. )
  9. type dbAdapter interface {
  10. Init() error
  11. ListWorkers() ([]WorkerStatus, error)
  12. GetWorker(workerID string) (WorkerStatus, error)
  13. DeleteWorker(workerID string) error
  14. CreateWorker(w WorkerStatus) (WorkerStatus, error)
  15. RefreshWorker(workerID string) (WorkerStatus, error)
  16. UpdateMirrorStatus(workerID, mirrorID string, status MirrorStatus) (MirrorStatus, error)
  17. GetMirrorStatus(workerID, mirrorID string) (MirrorStatus, error)
  18. ListMirrorStatus(workerID string) ([]MirrorStatus, error)
  19. ListAllMirrorStatus() ([]MirrorStatus, error)
  20. FlushDisabledJobs() error
  21. Close() error
  22. }
  23. const (
  24. _workerBucketKey = "workers"
  25. _statusBucketKey = "mirror_status"
  26. )
  27. func makeDBAdapter(dbType string, dbFile string) (dbAdapter, error) {
  28. if dbType == "bolt" {
  29. innerDB, err := bolt.Open(dbFile, 0600, &bolt.Options{
  30. Timeout: 5 * time.Second,
  31. })
  32. if err != nil {
  33. return nil, err
  34. }
  35. db := boltAdapter{
  36. db: innerDB,
  37. dbFile: dbFile,
  38. }
  39. err = db.Init()
  40. return &db, err
  41. } else if dbType == "redis" {
  42. opt, err := redis.ParseURL(dbFile)
  43. if err != nil {
  44. return nil, fmt.Errorf("bad redis url: %s", err)
  45. }
  46. innerDB := redis.NewClient(opt)
  47. db := redisAdapter{
  48. db: innerDB,
  49. }
  50. err = db.Init()
  51. return &db, err
  52. }
  53. // unsupported db-type
  54. return nil, fmt.Errorf("unsupported db-type: %s", dbType)
  55. }