diff options
| author | James Mills <prologic@shortcircuit.net.au> | 2020-03-25 12:40:00 +1000 |
|---|---|---|
| committer | James Mills <prologic@shortcircuit.net.au> | 2020-03-25 12:40:00 +1000 |
| commit | 7113a7bd05c72406fc971fa720b05bb934732c04 (patch) | |
| tree | 5275cce369c47d2163292705cdfe47575af7c4b8 /app/bitcask_store.go | |
| parent | 6fa6432090b4878701ff05cebd4f25658c761288 (diff) | |
Add support for keeping trakc of and viewing no. of views per video
Diffstat (limited to 'app/bitcask_store.go')
| -rw-r--r-- | app/bitcask_store.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/app/bitcask_store.go b/app/bitcask_store.go new file mode 100644 index 0000000..7289b35 --- /dev/null +++ b/app/bitcask_store.go @@ -0,0 +1,66 @@ +package app + +import ( + "encoding/binary" + "fmt" + + log "github.com/sirupsen/logrus" + + "github.com/prologic/bitcask" +) + +// BitcaskStore ... +type BitcaskStore struct { + db *bitcask.Bitcask +} + +// NewBitcaskStore ... +func NewBitcaskStore(path string, options ...bitcask.Option) (Store, error) { + db, err := bitcask.Open(path, options...) + if err != nil { + return nil, err + } + return &BitcaskStore{db: db}, nil +} + +// Close ... +func (s *BitcaskStore) Close() error { + return s.db.Close() +} + +// GetViews ... +func (s *BitcaskStore) GetViews(collection, id string) (int64, error) { + var views uint64 + rawViews, err := s.db.Get([]byte(fmt.Sprintf("/views/%s/%s", collection, id))) + if err != nil { + if err != bitcask.ErrKeyNotFound { + err := fmt.Errorf("error getting views for %s %s: %w", collection, id, err) + log.Error(err) + return 0, err + } + } else { + views = binary.BigEndian.Uint64(rawViews) + } + + return int64(views), nil +} + +// IncView ... +func (s *BitcaskStore) IncView(collection, id string) error { + views, err := s.GetViews(collection, id) + if err != nil { + err := fmt.Errorf("error getting existing views for %s %s: %w", collection, id, err) + return err + } + + buf := make([]byte, 8) + views++ + binary.BigEndian.PutUint64(buf, uint64(views)) + err = s.db.Put([]byte(fmt.Sprintf("/views/%s/%s", collection, id)), buf) + if err != nil { + err := fmt.Errorf("error storing updated views for %s %s: %w", collection, id, err) + return err + } + + return nil +} |
