Skip to content

Commit c72fa19

Browse files
authored
Merge pull request #26 from ConductorOne/jirwin/user-password-config
Allow setting the username and password separately from the DSN
2 parents ef77200 + 4530aef commit c72fa19

File tree

4 files changed

+31
-11
lines changed

4 files changed

+31
-11
lines changed

pkg/bsql/config.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ type Config struct {
1616
}
1717

1818
type DatabaseConfig struct {
19-
DSN string `yaml:"dsn" json:"dsn"` // DSN connection string
19+
DSN string `yaml:"dsn" json:"dsn"` // DSN connection string
20+
User string `yaml:"user" json:"user"`
21+
Password string `yaml:"password" json:"password"`
2022
}
2123

2224
type ResourceType struct {

pkg/connector/connector.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func New(ctx context.Context, configFilePath string) (*Connector, error) {
8383
}
8484

8585
func newConnector(ctx context.Context, c *bsql.Config) (*Connector, error) {
86-
db, dbEngine, err := database.Connect(ctx, c.Connect.DSN)
86+
db, dbEngine, err := database.Connect(ctx, c.Connect.DSN, c.Connect.User, c.Connect.Password)
8787
if err != nil {
8888
return nil, err
8989
}

pkg/database/database.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const (
2727
Oracle
2828
)
2929

30-
func updateDSNFromEnv(ctx context.Context, dsn string) (string, error) {
30+
func updateFromEnv(ctx context.Context, dsn string) (string, error) {
3131
var err error
3232

3333
result := DSNREnvRegex.ReplaceAllStringFunc(dsn, func(match string) string {
@@ -47,8 +47,8 @@ func updateDSNFromEnv(ctx context.Context, dsn string) (string, error) {
4747
return result, nil
4848
}
4949

50-
func Connect(ctx context.Context, dsn string) (*sql.DB, DbEngine, error) {
51-
populatedDSN, err := updateDSNFromEnv(ctx, dsn)
50+
func Connect(ctx context.Context, dsn string, user string, password string) (*sql.DB, DbEngine, error) {
51+
populatedDSN, err := updateFromEnv(ctx, dsn)
5252
if err != nil {
5353
return nil, Unknown, err
5454
}
@@ -58,23 +58,41 @@ func Connect(ctx context.Context, dsn string) (*sql.DB, DbEngine, error) {
5858
return nil, Unknown, err
5959
}
6060

61+
if parsedDsn.User == nil {
62+
if user == "" || password == "" {
63+
return nil, Unknown, errors.New("user and password must be set in DSN or in the configuration")
64+
}
65+
66+
populatedUser, err := updateFromEnv(ctx, user)
67+
if err != nil {
68+
return nil, Unknown, err
69+
}
70+
71+
populatedPassword, err := updateFromEnv(ctx, password)
72+
if err != nil {
73+
return nil, Unknown, err
74+
}
75+
76+
parsedDsn.User = url.UserPassword(populatedUser, populatedPassword)
77+
}
78+
6179
switch parsedDsn.Scheme {
6280
case "mysql":
63-
db, err := mysql.Connect(ctx, populatedDSN)
81+
db, err := mysql.Connect(ctx, parsedDsn.String())
6482
if err != nil {
6583
return nil, Unknown, err
6684
}
6785
return db, MySQL, nil
6886

6987
case "oracle":
70-
db, err := oracle.Connect(ctx, populatedDSN)
88+
db, err := oracle.Connect(ctx, parsedDsn.String())
7189
if err != nil {
7290
return nil, Unknown, err
7391
}
7492
return db, Oracle, nil
7593

7694
case "sqlserver":
77-
db, err := sqlserver.Connect(ctx, populatedDSN)
95+
db, err := sqlserver.Connect(ctx, parsedDsn.String())
7896
if err != nil {
7997
return nil, Unknown, err
8098
}

pkg/database/database_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ func Test_updateDSNFromEnv(t *testing.T) {
6868
t.Fatalf("failed to set env var %s: %v", k, err)
6969
}
7070
}
71-
got, err := updateDSNFromEnv(tt.args.ctx, tt.args.dsn)
71+
got, err := updateFromEnv(tt.args.ctx, tt.args.dsn)
7272
if (err != nil) != tt.wantErr {
73-
t.Errorf("updateDSNFromEnv() error = %v, wantErr %v", err, tt.wantErr)
73+
t.Errorf("updateFromEnv() error = %v, wantErr %v", err, tt.wantErr)
7474
return
7575
}
7676
if got != tt.want {
77-
t.Errorf("updateDSNFromEnv() got = %v, want %v", got, tt.want)
77+
t.Errorf("updateFromEnv() got = %v, want %v", got, tt.want)
7878
}
7979
for k := range tt.env {
8080
if err := os.Unsetenv(k); err != nil {

0 commit comments

Comments
 (0)