db.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. innerDB := redis.NewClient(&redis.Options{
  43. Addr: dbFile,
  44. })
  45. db := redisAdapter{
  46. db: innerDB,
  47. }
  48. err := db.Init()
  49. return &db, err
  50. }
  51. // unsupported db-type
  52. return nil, fmt.Errorf("unsupported db-type: %s", dbType)
  53. }