diff --git a/storage/sql/config.go b/storage/sql/config.go index fc9dca1b..0ce0f117 100644 --- a/storage/sql/config.go +++ b/storage/sql/config.go @@ -14,7 +14,6 @@ import ( "github.com/go-sql-driver/mysql" "github.com/lib/pq" - sqlite3 "github.com/mattn/go-sqlite3" "github.com/dexidp/dex/pkg/log" "github.com/dexidp/dex/storage" @@ -32,47 +31,6 @@ const ( mysqlErrUnknownSysVar = 1193 ) -// SQLite3 options for creating an SQL db. -type SQLite3 struct { - // File to - File string `json:"file"` -} - -// Open creates a new storage implementation backed by SQLite3 -func (s *SQLite3) Open(logger log.Logger) (storage.Storage, error) { - conn, err := s.open(logger) - if err != nil { - return nil, err - } - return conn, nil -} - -func (s *SQLite3) open(logger log.Logger) (*conn, error) { - db, err := sql.Open("sqlite3", s.File) - if err != nil { - return nil, err - } - if s.File == ":memory:" { - // sqlite3 uses file locks to coordinate concurrent access. In memory - // doesn't support this, so limit the number of connections to 1. - db.SetMaxOpenConns(1) - } - - errCheck := func(err error) bool { - sqlErr, ok := err.(sqlite3.Error) - if !ok { - return false - } - return sqlErr.ExtendedCode == sqlite3.ErrConstraintPrimaryKey - } - - c := &conn{db, &flavorSQLite3, logger, errCheck} - if _, err := c.migrate(); err != nil { - return nil, fmt.Errorf("failed to perform migrations: %v", err) - } - return c, nil -} - // nolint const ( // postgres SSL modes diff --git a/storage/sql/config_test.go b/storage/sql/config_test.go index 2085bc88..5fc45848 100644 --- a/storage/sql/config_test.go +++ b/storage/sql/config_test.go @@ -85,10 +85,6 @@ func testDB(t *testing.T, o opener, withTransactions bool) { } } -func TestSQLite3(t *testing.T) { - testDB(t, &SQLite3{":memory:"}, false) -} - func getenv(key, defaultVal string) string { if val := os.Getenv(key); val != "" { return val diff --git a/storage/sql/crud_test.go b/storage/sql/crud_test.go index d6682e17..9e3282e5 100644 --- a/storage/sql/crud_test.go +++ b/storage/sql/crud_test.go @@ -1,3 +1,5 @@ +// +build cgo + package sql import ( diff --git a/storage/sql/migrate_test.go b/storage/sql/migrate_test.go index a528aa7e..7ec6d957 100644 --- a/storage/sql/migrate_test.go +++ b/storage/sql/migrate_test.go @@ -1,3 +1,5 @@ +// +build cgo + package sql import ( diff --git a/storage/sql/sqlite.go b/storage/sql/sqlite.go new file mode 100644 index 00000000..faefd89a --- /dev/null +++ b/storage/sql/sqlite.go @@ -0,0 +1,54 @@ +// +build cgo + +package sql + +import ( + "database/sql" + "fmt" + + sqlite3 "github.com/mattn/go-sqlite3" + + "github.com/dexidp/dex/pkg/log" + "github.com/dexidp/dex/storage" +) + +// SQLite3 options for creating an SQL db. +type SQLite3 struct { + // File to + File string `json:"file"` +} + +// Open creates a new storage implementation backed by SQLite3 +func (s *SQLite3) Open(logger log.Logger) (storage.Storage, error) { + conn, err := s.open(logger) + if err != nil { + return nil, err + } + return conn, nil +} + +func (s *SQLite3) open(logger log.Logger) (*conn, error) { + db, err := sql.Open("sqlite3", s.File) + if err != nil { + return nil, err + } + if s.File == ":memory:" { + // sqlite3 uses file locks to coordinate concurrent access. In memory + // doesn't support this, so limit the number of connections to 1. + db.SetMaxOpenConns(1) + } + + errCheck := func(err error) bool { + sqlErr, ok := err.(sqlite3.Error) + if !ok { + return false + } + return sqlErr.ExtendedCode == sqlite3.ErrConstraintPrimaryKey + } + + c := &conn{db, &flavorSQLite3, logger, errCheck} + if _, err := c.migrate(); err != nil { + return nil, fmt.Errorf("failed to perform migrations: %v", err) + } + return c, nil +} diff --git a/storage/sql/sqlite_test.go b/storage/sql/sqlite_test.go new file mode 100644 index 00000000..8be99390 --- /dev/null +++ b/storage/sql/sqlite_test.go @@ -0,0 +1,11 @@ +// +build cgo + +package sql + +import ( + "testing" +) + +func TestSQLite3(t *testing.T) { + testDB(t, &SQLite3{":memory:"}, false) +}