in go/adbc/driver/snowflake/driver.go [212:422]
func (d *database) SetOptions(cnOptions map[string]string) error {
uri, ok := cnOptions[adbc.OptionKeyURI]
if ok {
cfg, err := gosnowflake.ParseDSN(uri)
if err != nil {
return errToAdbcErr(adbc.StatusInvalidArgument, err)
}
d.cfg = cfg
delete(cnOptions, adbc.OptionKeyURI)
} else {
d.cfg = &gosnowflake.Config{
Params: make(map[string]*string),
}
}
var err error
for k, v := range cnOptions {
switch k {
case adbc.OptionKeyUsername:
d.cfg.User = v
case adbc.OptionKeyPassword:
d.cfg.Password = v
case OptionDatabase:
d.cfg.Database = v
case OptionSchema:
d.cfg.Schema = v
case OptionWarehouse:
d.cfg.Warehouse = v
case OptionRole:
d.cfg.Role = v
case OptionRegion:
d.cfg.Region = v
case OptionAccount:
d.cfg.Account = v
case OptionProtocol:
d.cfg.Protocol = v
case OptionHost:
d.cfg.Host = v
case OptionPort:
d.cfg.Port, err = strconv.Atoi(v)
if err != nil {
return adbc.Error{
Msg: "error encountered parsing Port option: " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
case OptionAuthType:
d.cfg.Authenticator, ok = authTypeMap[v]
if !ok {
return adbc.Error{
Msg: "invalid option value for " + OptionAuthType + ": '" + v + "'",
Code: adbc.StatusInvalidArgument,
}
}
case OptionLoginTimeout:
dur, err := time.ParseDuration(v)
if err != nil {
return adbc.Error{
Msg: "could not parse duration for '" + OptionLoginTimeout + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
if dur < 0 {
dur = -dur
}
d.cfg.LoginTimeout = dur
case OptionRequestTimeout:
dur, err := time.ParseDuration(v)
if err != nil {
return adbc.Error{
Msg: "could not parse duration for '" + OptionRequestTimeout + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
if dur < 0 {
dur = -dur
}
d.cfg.RequestTimeout = dur
case OptionJwtExpireTimeout:
dur, err := time.ParseDuration(v)
if err != nil {
return adbc.Error{
Msg: "could not parse duration for '" + OptionJwtExpireTimeout + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
if dur < 0 {
dur = -dur
}
d.cfg.JWTExpireTimeout = dur
case OptionClientTimeout:
dur, err := time.ParseDuration(v)
if err != nil {
return adbc.Error{
Msg: "could not parse duration for '" + OptionClientTimeout + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
if dur < 0 {
dur = -dur
}
d.cfg.ClientTimeout = dur
case OptionApplicationName:
d.cfg.Application = v
case OptionSSLSkipVerify:
switch v {
case adbc.OptionValueEnabled:
d.cfg.InsecureMode = true
case adbc.OptionValueDisabled:
d.cfg.InsecureMode = false
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionOCSPFailOpenMode:
switch v {
case adbc.OptionValueEnabled:
d.cfg.OCSPFailOpen = gosnowflake.OCSPFailOpenTrue
case adbc.OptionValueDisabled:
d.cfg.OCSPFailOpen = gosnowflake.OCSPFailOpenFalse
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionAuthToken:
d.cfg.Token = v
case OptionAuthOktaUrl:
d.cfg.OktaURL, err = url.Parse(v)
if err != nil {
return adbc.Error{
Msg: fmt.Sprintf("error parsing URL for database option '%s': '%s'", k, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionKeepSessionAlive:
switch v {
case adbc.OptionValueEnabled:
d.cfg.KeepSessionAlive = true
case adbc.OptionValueDisabled:
d.cfg.KeepSessionAlive = false
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionDisableTelemetry:
switch v {
case adbc.OptionValueEnabled:
d.cfg.DisableTelemetry = true
case adbc.OptionValueDisabled:
d.cfg.DisableTelemetry = false
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionJwtPrivateKey:
data, err := os.ReadFile(v)
if err != nil {
return adbc.Error{
Msg: "could not read private key file '" + v + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
d.cfg.PrivateKey, err = x509.ParsePKCS1PrivateKey(data)
if err != nil {
return adbc.Error{
Msg: "failed parsing private key file '" + v + "': " + err.Error(),
Code: adbc.StatusInvalidArgument,
}
}
case OptionClientRequestMFAToken:
switch v {
case adbc.OptionValueEnabled:
d.cfg.ClientRequestMfaToken = gosnowflake.ConfigBoolTrue
case adbc.OptionValueDisabled:
d.cfg.ClientRequestMfaToken = gosnowflake.ConfigBoolFalse
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionClientStoreTempCred:
switch v {
case adbc.OptionValueEnabled:
d.cfg.ClientStoreTemporaryCredential = gosnowflake.ConfigBoolTrue
case adbc.OptionValueDisabled:
d.cfg.ClientStoreTemporaryCredential = gosnowflake.ConfigBoolFalse
default:
return adbc.Error{
Msg: fmt.Sprintf("Invalid value for database option '%s': '%s'", OptionSSLSkipVerify, v),
Code: adbc.StatusInvalidArgument,
}
}
case OptionLogTracing:
d.cfg.Tracing = v
default:
d.cfg.Params[k] = &v
}
}
return nil
}