bolt.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package bolt
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "time"
  6. "go.etcd.io/bbolt"
  7. "backend/database/schema"
  8. _ "github.com/go-sql-driver/mysql"
  9. log "github.com/sirupsen/logrus"
  10. )
  11. const (
  12. bucketName = `speedtest`
  13. )
  14. type Bolt struct {
  15. db *bbolt.DB
  16. }
  17. func Open(databaseFile string) *Bolt {
  18. db, err := bbolt.Open(databaseFile, 0666, nil)
  19. if err != nil {
  20. log.Fatalf("Cannot open BoltDB database file: %s", err)
  21. }
  22. return &Bolt{db: db}
  23. }
  24. func (p *Bolt) Insert(data *schema.TelemetryData) error {
  25. return p.db.Update(func(tx *bbolt.Tx) error {
  26. data.Timestamp = time.Now()
  27. b, _ := json.Marshal(data)
  28. bucket, err := tx.CreateBucketIfNotExists([]byte(bucketName))
  29. if err != nil {
  30. return err
  31. }
  32. return bucket.Put([]byte(data.UUID), b)
  33. })
  34. }
  35. func (p *Bolt) FetchByUUID(uuid string) (*schema.TelemetryData, error) {
  36. var record schema.TelemetryData
  37. err := p.db.View(func(tx *bbolt.Tx) error {
  38. bucket := tx.Bucket([]byte(bucketName))
  39. if bucket == nil {
  40. return errors.New("data bucket doesn't exist yet")
  41. }
  42. b := bucket.Get([]byte(uuid))
  43. return json.Unmarshal(b, &record)
  44. })
  45. return &record, err
  46. }
  47. func (p *Bolt) FetchLast100() ([]schema.TelemetryData, error) {
  48. var records []schema.TelemetryData
  49. err := p.db.View(func(tx *bbolt.Tx) error {
  50. var record schema.TelemetryData
  51. bucket := tx.Bucket([]byte(bucketName))
  52. if bucket == nil {
  53. return errors.New("data bucket doesn't exist yet")
  54. }
  55. cursor := bucket.Cursor()
  56. _, b := cursor.Last()
  57. for len(records) < 100 {
  58. if err := json.Unmarshal(b, &record); err != nil {
  59. return err
  60. }
  61. records = append(records, record)
  62. _, b = cursor.Prev()
  63. if b == nil {
  64. break
  65. }
  66. }
  67. return nil
  68. })
  69. return records, err
  70. }