-
Notifications
You must be signed in to change notification settings - Fork 0
/
dumper.go
60 lines (52 loc) · 956 Bytes
/
dumper.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
60
package dumper
import (
"context"
"cloud.google.com/go/datastore"
)
type Encoder interface {
Encode(v any) error
}
type Dumper struct {
encoder Encoder
client *datastore.Client
batchSize int
entityName string
}
type Config struct {
Client *datastore.Client
Encoder Encoder
BatchSize int
EntityName string
}
func New(cfg Config) *Dumper {
return &Dumper{
encoder: cfg.Encoder,
client: cfg.Client,
batchSize: cfg.BatchSize,
entityName: cfg.EntityName,
}
}
func (d *Dumper) Dump(ctx context.Context) error {
var offset int
for {
q := datastore.NewQuery(d.entityName).
Limit(d.batchSize).
Offset(offset)
var requests []Entity
keys, err := d.client.GetAll(ctx, q, &requests)
if err != nil {
return err
}
for _, r := range requests {
err := d.encoder.Encode(r)
if err != nil {
return err
}
}
if len(keys) < d.batchSize {
break
}
offset += d.batchSize
}
return nil
}