55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
|
// +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
|
||
|
}
|