| 35 | var _ Storage = (*Badger)(nil) |
| 36 | |
| 37 | func NewBadger(config *Config) (*Badger, error) { |
| 38 | var ( |
| 39 | dir = config.Dir |
| 40 | ) |
| 41 | |
| 42 | log.Infof("opening database %q", dir) |
| 43 | |
| 44 | // Make sure database directory exists |
| 45 | if err := os.MkdirAll(dir, 0755); err != nil { |
| 46 | return nil, errors.Wrap(err, "could not mkdir database dir") |
| 47 | } |
| 48 | |
| 49 | opts := badger.DefaultOptions(dir). |
| 50 | WithLogger(log.StandardLogger()). |
| 51 | WithTruncate(true) |
| 52 | |
| 53 | if config.Badger != nil { |
| 54 | opts.Truncate = config.Badger.Truncate |
| 55 | if config.Badger.FileIO { |
| 56 | opts.ValueLogLoadingMode = options.FileIO |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | db, err := badger.Open(opts) |
| 61 | if err != nil { |
| 62 | return nil, errors.Wrap(err, "failed to open database") |
| 63 | } |
| 64 | |
| 65 | storage := &Badger{db: db} |
| 66 | |
| 67 | if err := db.Update(func(txn *badger.Txn) error { |
| 68 | if err := storage.setObj(txn, []byte(versionPath), CurrentVersion, false); err != nil && err != model.ErrAlreadyExists { |
| 69 | return err |
| 70 | } |
| 71 | return nil |
| 72 | }); err != nil { |
| 73 | return nil, errors.Wrap(err, "failed to read database version") |
| 74 | } |
| 75 | |
| 76 | return &Badger{db: db}, nil |
| 77 | } |
| 78 | |
| 79 | func (b *Badger) Close() error { |
| 80 | log.Debug("closing database") |