@@ -3,32 +3,65 @@ package internal
33import (
44 "errors"
55 "fmt"
6+ "github.com/spf13/cobra"
7+ "github.com/spf13/viper"
8+ "gopkg.in/yaml.v3"
9+ "log"
10+ "os"
611 "strings"
712)
813
914type DbqApp interface {
1015 PingDataSource (srcId string ) error
1116 ImportDatasets (srcId string , filter string ) ([]string , error )
1217 GetDbqConfig () * DbqConfig
18+ SaveDbqConfig () error
19+ FindDataSourceById (srcId string ) * DataSource
1320}
1421
1522type DbqAppImpl struct {
16- dbqConfig * DbqConfig
23+ dbqConfigPath string
24+ dbqConfig * DbqConfig
1725}
1826
19- func NewDbqApp (dbqConfig * DbqConfig ) DbqApp {
20- return & DbqAppImpl {dbqConfig : dbqConfig }
27+ func NewDbqApp (dbqConfigPath string ) DbqApp {
28+ v := viper .New ()
29+
30+ if dbqConfigPath != "" {
31+ v .SetConfigFile (dbqConfigPath )
32+ } else {
33+ home , err := os .UserHomeDir ()
34+ cobra .CheckErr (err )
35+ v .AddConfigPath (home )
36+ v .SetConfigType ("yaml" )
37+ v .SetConfigName (".dbq.yaml" )
38+ }
39+
40+ v .AutomaticEnv ()
41+ if err := v .ReadInConfig (); err != nil {
42+ cobra .CheckErr (err )
43+ }
44+
45+ var dbqConfig DbqConfig
46+ if err := v .Unmarshal (& dbqConfig ); err != nil {
47+ cobra .CheckErr (err )
48+ }
49+
50+ return & DbqAppImpl {
51+ dbqConfigPath : dbqConfigPath ,
52+ dbqConfig : & dbqConfig ,
53+ }
2154}
2255
2356func (app * DbqAppImpl ) PingDataSource (srcId string ) error {
24- var dataSource = findDataSourceById ( srcId , app .dbqConfig . DataSources )
57+ var dataSource = app .FindDataSourceById ( srcId )
2558
2659 cnn , err := getDbqConnector (* dataSource )
2760 if err != nil {
2861 return err
2962 }
3063
31- fmt .Println ("Pinging datasource: " + dataSource .ID )
64+ log .Println ("Pinging datasource: " + dataSource .ID )
3265 err = cnn .Ping ()
3366 if err != nil {
3467 return err
@@ -38,7 +71,7 @@ func (app *DbqAppImpl) PingDataSource(srcId string) error {
3871}
3972
4073func (app * DbqAppImpl ) ImportDatasets (srcId string , filter string ) ([]string , error ) {
41- var dataSource = findDataSourceById ( srcId , app .dbqConfig . DataSources )
74+ var dataSource = app .FindDataSourceById ( srcId )
4275 cnn , err := getDbqConnector (* dataSource )
4376 if err != nil {
4477 return []string {}, err
@@ -51,6 +84,29 @@ func (app *DbqAppImpl) GetDbqConfig() *DbqConfig {
5184 return app .dbqConfig
5285}
5386
87+ func (app * DbqAppImpl ) SaveDbqConfig () error {
88+ updatedYaml , err := yaml .Marshal (app .dbqConfig )
89+ if err != nil {
90+ return err
91+ }
92+
93+ err = os .WriteFile (app .dbqConfigPath , updatedYaml , 0644 )
94+ if err != nil {
95+ return err
96+ }
97+
98+ return nil
99+ }
100+
101+ func (app * DbqAppImpl ) FindDataSourceById (srcId string ) * DataSource {
102+ for i := range app .dbqConfig .DataSources {
103+ if app .dbqConfig .DataSources [i ].ID == srcId {
104+ return & app .dbqConfig .DataSources [i ]
105+ }
106+ }
107+ return nil
108+ }
109+
54110func getDbqConnector (ds DataSource ) (DbqConnector , error ) {
55111 dsType := strings .ToLower (ds .Type )
56112 switch dsType {
@@ -60,12 +116,3 @@ func getDbqConnector(ds DataSource) (DbqConnector, error) {
60116 return nil , errors .New (fmt .Sprintf ("Data source type '%s' is not supported." , dsType ))
61117 }
62118}
63-
64- func findDataSourceById (srcId string , dataSources []DataSource ) * DataSource {
65- for _ , src := range dataSources {
66- if src .ID == srcId {
67- return & src
68- }
69- }
70- return nil
71- }
0 commit comments