-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
109 lines (88 loc) · 2.87 KB
/
config.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright 2016 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"flag"
"fmt"
"github.com/BurntSushi/toml"
"github.com/pingcap/errors"
"github.com/pingcap/tidb-tools/pkg/importer"
"github.com/pingcap/tidb-tools/pkg/utils"
)
// NewConfig creates a new config.
func NewConfig() *Config {
cfg := &Config{}
cfg.Config = &importer.Config{}
cfg.FlagSet = flag.NewFlagSet("importer", flag.ContinueOnError)
fs := cfg.FlagSet
fs.StringVar(&cfg.configFile, "config", "", "Config file")
fs.StringVar(&cfg.TableSQL, "t", "", "create table sql")
fs.StringVar(&cfg.IndexSQL, "i", "", "create index sql")
fs.IntVar(&cfg.WorkerCount, "c", 2, "parallel worker count")
fs.IntVar(&cfg.JobCount, "n", 10000, "total job count")
fs.IntVar(&cfg.Batch, "b", 1000, "insert batch commit count")
fs.StringVar(&cfg.DBCfg.Host, "h", "127.0.0.1", "set the database host ip")
fs.StringVar(&cfg.DBCfg.User, "u", "root", "set the database user")
fs.StringVar(&cfg.DBCfg.Password, "p", "", "set the database password")
fs.StringVar(&cfg.DBCfg.Schema, "D", "test", "set the database name")
fs.IntVar(&cfg.DBCfg.Port, "P", 3306, "set the database host port")
fs.StringVar(&cfg.LogLevel, "L", "info", "log level: debug, info, warn, error, fatal")
fs.BoolVar(&cfg.printVersion, "V", false, "prints version and exit")
return cfg
}
// Config is the configuration.
type Config struct {
*importer.Config
*flag.FlagSet `json:"-"`
printVersion bool
configFile string
}
// Parse parses flag definitions from the argument list.
func (c *Config) Parse(arguments []string) error {
// Parse first to get config file.
err := c.FlagSet.Parse(arguments)
if err != nil {
return errors.Trace(err)
}
if c.printVersion {
fmt.Printf(utils.GetRawInfo("importer"))
return flag.ErrHelp
}
// Load config file if specified.
if c.configFile != "" {
err = c.configFromFile(c.configFile)
if err != nil {
return errors.Trace(err)
}
}
// Parse again to replace with command line options.
err = c.FlagSet.Parse(arguments)
if err != nil {
return errors.Trace(err)
}
if len(c.FlagSet.Args()) != 0 {
return errors.Errorf("'%s' is an invalid flag", c.FlagSet.Arg(0))
}
return nil
}
func (c *Config) String() string {
if c == nil {
return "<nil>"
}
return fmt.Sprintf("Config(%+v)", *c)
}
// configFromFile loads config from file.
func (c *Config) configFromFile(path string) error {
_, err := toml.DecodeFile(path, c)
return errors.Trace(err)
}