mirror of
https://github.com/iyear/tdl
synced 2025-01-08 11:57:55 +08:00
47 lines
939 B
Go
47 lines
939 B
Go
package migrate
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"os"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/go-faster/errors"
|
|
"github.com/klauspost/compress/zstd"
|
|
"go.uber.org/multierr"
|
|
|
|
"github.com/iyear/tdl/pkg/kv"
|
|
)
|
|
|
|
func Recover(ctx context.Context, file string) (rerr error) {
|
|
f, err := os.Open(file)
|
|
if err != nil {
|
|
return errors.Wrap(err, "open file")
|
|
}
|
|
defer multierr.AppendInvoke(&rerr, multierr.Close(f))
|
|
|
|
dec, err := zstd.NewReader(f)
|
|
if err != nil {
|
|
return errors.Wrap(err, "create zstd decoder")
|
|
}
|
|
defer dec.Close()
|
|
|
|
metaB := bytes.NewBuffer(nil)
|
|
if _, err = dec.WriteTo(metaB); err != nil {
|
|
return err
|
|
}
|
|
|
|
var meta kv.Meta
|
|
if err = json.Unmarshal(metaB.Bytes(), &meta); err != nil {
|
|
return errors.Wrap(err, "unmarshal metadata")
|
|
}
|
|
|
|
if err = kv.From(ctx).MigrateFrom(meta); err != nil {
|
|
return errors.Wrap(err, "migrate from")
|
|
}
|
|
|
|
color.Green("Recover successfully, file: %s", file)
|
|
return nil
|
|
}
|