forked from romanyx/polluter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpolluter.go
74 lines (61 loc) · 1.37 KB
/
polluter.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package polluter
import (
"github.com/quen2404/polluter/parser"
"io"
"github.com/pkg/errors"
"github.com/romanyx/jwalk"
)
type (
Execer interface {
Exec(Commands) error
}
Commands []Command
Command struct {
Q string
Args []interface{}
}
Builder interface {
Build(jwalk.ObjectWalker) (Commands, error)
}
BuilderFct func(jwalk.ObjectWalker) (Commands, error)
DbEngine interface {
Builder
Execer
}
// Polluter pollutes database with given input.
Polluter struct {
DbEngine
parser.Parser
}
)
// Pollute parses input from the reader and
// tries to exec generated commands on a database.
// Use New factory function to generate.
func (p *Polluter) Pollute(r io.Reader) error {
obj, err := p.Parser.Parse(r)
if err != nil {
return errors.Wrap(err, "parse failed")
}
commands, err := p.DbEngine.Build(obj)
if err != nil {
return errors.Wrap(err, "Build commands failed")
}
if err := p.DbEngine.Exec(commands); err != nil {
return errors.Wrap(err, "exec failed")
}
return nil
}
// New factory method returns initialized
// Polluter.
// For example to seed MySQL database with
// JSON input use:
// p := New(MySQLEngine(db))
// To seed Postgres database with YAML input
// use:
// p := New(PostgresEngine(db), YAMLParser)
func New(engine DbEngine, parser parser.Parser) *Polluter {
return &Polluter{
Parser: parser,
DbEngine: engine,
}
}