-
Notifications
You must be signed in to change notification settings - Fork 143
/
leveldb.go
59 lines (53 loc) · 1.52 KB
/
leveldb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package playerdb
import (
"encoding/json"
"github.com/df-mc/dragonfly/server/player"
"github.com/df-mc/dragonfly/server/world"
"github.com/df-mc/goleveldb/leveldb"
"github.com/df-mc/goleveldb/leveldb/opt"
"github.com/google/uuid"
"os"
)
// Provider is a player data provider that uses a LevelDB database to store data. The data passed on
// will first be converted to make sure it can be marshaled into JSON. This JSON (in bytes) will then
// be stored in the database under a key that is the byte representation of the player's UUID.
type Provider struct {
db *leveldb.DB
}
// NewProvider creates a new player data provider that saves and loads data using
// a LevelDB database.
func NewProvider(path string) (*Provider, error) {
if _, err := os.Stat(path); os.IsNotExist(err) {
_ = os.Mkdir(path, 0777)
}
db, err := leveldb.OpenFile(path, &opt.Options{Compression: opt.SnappyCompression})
if err != nil {
return nil, err
}
return &Provider{db: db}, nil
}
// Save ...
func (p *Provider) Save(id uuid.UUID, d player.Data) error {
b, err := json.Marshal(p.toJson(d))
if err != nil {
return err
}
return p.db.Put(id[:], b, nil)
}
// Load ...
func (p *Provider) Load(id uuid.UUID, world func(world.Dimension) *world.World) (player.Data, error) {
b, err := p.db.Get(id[:], nil)
if err != nil {
return player.Data{}, err
}
var d jsonData
err = json.Unmarshal(b, &d)
if err != nil {
return player.Data{}, err
}
return p.fromJson(d, world), nil
}
// Close ...
func (p *Provider) Close() error {
return p.db.Close()
}