+++ /dev/null
-package asset
-
-import (
- "encoding/json"
-
- log "github.com/sirupsen/logrus"
-
- "github.com/vapor/common"
-)
-
-// Image is the struct for hold export asset data
-type Image struct {
- Assets []*Asset `json:"assets"`
-}
-
-// Backup export all the asset info into image
-func (reg *Registry) Backup() (*Image, error) {
- assetImage := &Image{
- Assets: []*Asset{},
- }
-
- assetIter := reg.db.IteratorPrefix([]byte(assetPrefix))
- defer assetIter.Release()
- for assetIter.Next() {
- asset := &Asset{}
- if err := json.Unmarshal(assetIter.Value(), asset); err != nil {
- return nil, err
- }
- assetImage.Assets = append(assetImage.Assets, asset)
- }
-
- return assetImage, nil
-}
-
-// Restore load the image data into asset manage
-func (reg *Registry) Restore(image *Image) error {
- maxAssetIndex := uint64(0)
- storeBatch := reg.db.NewBatch()
- for _, asset := range image.Assets {
- if existed := reg.db.Get(Key(&asset.AssetID)); existed != nil {
- log.WithFields(log.Fields{"alias": asset.Alias, "id": asset.AssetID}).Warning("skip restore asset due to already existed")
- continue
- }
- if existed := reg.db.Get(aliasKey(*asset.Alias)); existed != nil {
- return ErrDuplicateAlias
- }
-
- rawAsset, err := json.Marshal(asset)
- if err != nil {
- return err
- }
-
- if asset.Signer.KeyIndex > maxAssetIndex {
- maxAssetIndex = asset.Signer.KeyIndex
- }
- storeBatch.Set(aliasKey(*asset.Alias), []byte(asset.AssetID.String()))
- storeBatch.Set(Key(&asset.AssetID), rawAsset)
- }
-
- if localIndex := reg.getNextAssetIndex(); localIndex < maxAssetIndex {
- storeBatch.Set(assetIndexKey, common.Unit64ToBytes(maxAssetIndex))
- }
- storeBatch.Write()
- return nil
-}