Skip to content

Commit

Permalink
hack to deal with snowflake including quotes in names (#29)
Browse files Browse the repository at this point in the history
hack to deal with snowflake including quotes in namesIt appears that at some point snowflake started including double-quotes in role names when you use that syntax to create role grants. It appears to be a regression, since our code used to work and no longer does (with no changes).

This hack should be safe once they fix it because double-quote is not a legal part of the name.
  • Loading branch information
ryanking authored and czimergebot committed May 20, 2019
1 parent 5dfffe3 commit fce3a63
Show file tree
Hide file tree
Showing 26 changed files with 1,635 additions and 8 deletions.
25 changes: 25 additions & 0 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 26 additions & 0 deletions pkg/db/db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package db

import (
"context"
"database/sql"
"fmt"
"regexp"

"github.com/ExpansiveWorlds/instrumentedsql"
"github.com/snowflakedb/gosnowflake"
)

func init() {
re := regexp.MustCompile(`\r?\n`)

logger := instrumentedsql.LoggerFunc(func(ctx context.Context, msg string, keyvals ...interface{}) {
s := fmt.Sprintf("[DEBUG] %s %v\n", msg, keyvals)
fmt.Println(re.ReplaceAllString(s, " "))
})

sql.Register("snowflake-instrumented", instrumentedsql.WrapDriver(&gosnowflake.SnowflakeDriver{}, instrumentedsql.WithLogger(logger)))
}

func Open(dsn string) (*sql.DB, error) {
return sql.Open("snowflake-instrumented", dsn)
}
8 changes: 2 additions & 6 deletions pkg/provider/provider.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package provider

import (
"database/sql"

"log"

"github.com/chanzuckerberg/terraform-provider-snowflake/pkg/db"
"github.com/chanzuckerberg/terraform-provider-snowflake/pkg/resources"
"github.com/hashicorp/terraform/helper/schema"
"github.com/pkg/errors"
"github.com/snowflakedb/gosnowflake"

// Used to register the snowflake sql driver.
_ "github.com/snowflakedb/gosnowflake"
)

// Provider is a provider
Expand Down Expand Up @@ -65,7 +61,7 @@ func ConfigureProvider(s *schema.ResourceData) (interface{}, error) {
return nil, errors.Wrap(err, "could not build dsn for snowflake connection")
}

db, err := sql.Open("snowflake", dsn)
db, err := db.Open(dsn)
if err != nil {
return nil, errors.Wrap(err, "Could not open snowflake database.")
}
Expand Down
13 changes: 11 additions & 2 deletions pkg/resources/role_grants.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package resources
import (
"database/sql"
"fmt"
"log"
"strings"

"github.com/chanzuckerberg/terraform-provider-snowflake/pkg/snowflake"
"github.com/hashicorp/terraform/helper/schema"
Expand Down Expand Up @@ -137,7 +137,6 @@ func readGrants(db *sql.DB, roleName string) ([]*grant, error) {
sdb := sqlx.NewDb(db, "snowflake")

stmt := fmt.Sprintf(`SHOW GRANTS OF ROLE "%s"`, roleName)
log.Printf("[DEBUG] stmt %s", stmt)
rows, err := sdb.Queryx(stmt)
defer rows.Close()

Expand All @@ -155,6 +154,16 @@ func readGrants(db *sql.DB, roleName string) ([]*grant, error) {
grants = append(grants, g)

}

for _, g := range grants {
if g.GranteeName.Valid {
s := g.GranteeName.String
s = strings.TrimPrefix(s, `"`)
s = strings.TrimSuffix(s, `"`)
g.GranteeName = sql.NullString{String: s}
}
}

return grants, nil
}

Expand Down
24 changes: 24 additions & 0 deletions vendor/github.com/ExpansiveWorlds/instrumentedsql/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 22 additions & 0 deletions vendor/github.com/ExpansiveWorlds/instrumentedsql/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions vendor/github.com/ExpansiveWorlds/instrumentedsql/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions vendor/github.com/ExpansiveWorlds/instrumentedsql/logger.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions vendor/github.com/ExpansiveWorlds/instrumentedsql/opts.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit fce3a63

Please sign in to comment.