OSDN Git Service

rename to assetStore
[bytom/vapor.git] / federation / database / asset_store.go
1 package database
2
3 import (
4         "github.com/golang/groupcache/lru"
5         "github.com/jinzhu/gorm"
6
7         "github.com/vapor/errors"
8         "github.com/vapor/federation/database/orm"
9 )
10
11 const maxAssetCached = 1024
12
13 type AssetStore struct {
14         cache *lru.Cache
15         db    *gorm.DB
16 }
17
18 func NewAssetStore(db *gorm.DB) *AssetStore {
19         return &AssetStore{
20                 cache: lru.New(maxAssetCached),
21                 db:    db,
22         }
23 }
24
25 func (a *AssetStore) GetByOrmID(id uint64) (*orm.Asset, error) {
26         asset := &orm.Asset{ID: id}
27         if err := a.db.Where(asset).First(asset).Error; err != nil {
28                 return nil, errors.Wrap(err, "asset not found by orm id")
29         }
30
31         return asset, nil
32 }
33
34 func (a *AssetStore) Get(assetID string) (*orm.Asset, error) {
35         if v, ok := a.cache.Get(assetID); ok {
36                 return v.(*orm.Asset), nil
37         }
38
39         asset := &orm.Asset{AssetID: assetID}
40         if err := a.db.Where(asset).First(asset).Error; err != nil {
41                 return nil, errors.Wrap(err, "asset not found in memory and mysql")
42         }
43
44         a.cache.Add(assetID, asset)
45         return asset, nil
46 }
47
48 func (a *AssetStore) Add(asset *orm.Asset) error {
49         if err := a.db.Create(asset).Error; err != nil {
50                 return err
51         }
52
53         a.cache.Add(asset.AssetID, asset)
54         return nil
55 }