in lib/configfx/module.go [101:232]
func new(p Params) (Result, error) {
var mc = AthenaDriverConfig{
QueryString: make([]string, 0),
}
var (
provider *config.YAML
err error
)
p.LC.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
return nil
},
OnStop: func(ctx context.Context) error {
os.Unsetenv("AWS_SDK_LOAD_CONFIG")
return nil
},
})
var bucket = flag.String("b", secret.OutputBucket, "Athena resultset output bucket")
var database = flag.String("d", "default", "The database you want to query")
var query = flag.String("q", "select 1", "The SQL query string or a file containing SQL string")
var rowOnly = flag.Bool("r", false, "Display rows only, don't show the first row as columninfo")
var moneyWise = flag.Bool("m", false, "Enable moneywise mode to display the query cost as the first line of the output")
var versionFlag = flag.Bool("v", false, "Print the current version and exit")
var admin = flag.Bool("a", false, "Enable admin mode, so database write(create/drop) is allowed at athenadriver level")
var style = flag.String("y", "default", "Output rendering style")
var format = flag.String("o", "csv", "Output format(options: table, markdown, csv, html)")
var fastFail = flag.Bool("f", true, "fast fail when where are multiple queries")
flag.Parse()
switch {
case *versionFlag:
println("Current build version: v" + drv.DriverVersion)
os.Exit(0)
return Result{}, fmt.Errorf("no")
}
// How to install a config file from a library
if _, err = os.Stat(homeDir() + "/athenareader.config"); err == nil {
provider, err = config.NewYAML(config.File(homeDir() + "/athenareader.config"))
} else if _, err = os.Stat("athenareader.config"); err == nil {
provider, err = config.NewYAML(config.File("athenareader.config"))
} else {
goPath := os.Getenv("GOPATH")
if goPath == "" {
goPath = homeDir() + "/go"
if _, err = os.Stat(goPath); err != nil {
d, _ := os.Getwd()
println("could not find athenareader.config in home directory or current directory " + d)
os.Exit(1)
}
}
path := goPath + "/src/github.com/uber/athenadriver/athenareader/athenareader.config"
if _, err = os.Stat(path); err == nil {
copyFile(path, homeDir()+"/athenareader.config")
provider, err = config.NewYAML(config.File(path))
} else {
err = downloadFile(homeDir()+"/athenareader.config",
"https://raw.githubusercontent.com/uber/athenadriver/master/athenareader/athenareader.config")
if err != nil {
d, _ := os.Getwd()
println("could not find athenareader.config in home directory or current directory " + d)
os.Exit(1)
} else {
provider, err = config.NewYAML(config.File(homeDir() + "/athenareader.config"))
}
}
}
if err != nil {
return Result{}, err
}
provider.Get("athenareader.output").Populate(&mc.OutputConfig)
provider.Get("athenareader.input").Populate(&mc.InputConfig)
filePath := expand(*query)
if _, err := os.Stat(filePath); err == nil {
b, err := ioutil.ReadFile(filePath)
if err == nil {
mc.QueryString = strings.Split(string(b), "\n\n") // convert content to a '[]string'
}
} else {
mc.QueryString = append(mc.QueryString, *query)
}
mc.DrvConfig, err = drv.NewDefaultConfig(mc.InputConfig.Bucket, mc.InputConfig.Region, secret.AccessID, secret.SecretAccessKey)
if err != nil {
return Result{}, err
}
if isFlagPassed("b") {
mc.InputConfig.Bucket = *bucket
mc.DrvConfig.SetOutputBucket(mc.InputConfig.Bucket)
}
if isFlagPassed("d") {
mc.InputConfig.Database = *database
}
if isFlagPassed("r") {
mc.OutputConfig.Rowonly = *rowOnly
}
if isFlagPassed("m") {
mc.OutputConfig.Moneywise = *moneyWise
}
if isFlagPassed("f") {
mc.OutputConfig.Fastfail = *fastFail
} else {
mc.OutputConfig.Fastfail = true
}
if isFlagPassed("a") {
mc.InputConfig.Admin = *admin
}
if isFlagPassed("y") {
mc.OutputConfig.Style = *style
}
if isFlagPassed("o") {
mc.OutputConfig.Render = *format
}
if mc.OutputConfig.Moneywise {
mc.DrvConfig.SetMoneyWise(true)
}
mc.DrvConfig.SetDB(mc.InputConfig.Database)
if !mc.InputConfig.Admin {
mc.DrvConfig.SetReadOnly(true)
}
if err != nil {
return Result{}, err
}
return Result{
MyConfig: mc,
}, nil
}