package dexstore import ( "context" "crypto/sha256" "fmt" "io" "entgo.io/ent/dialect" entsql "entgo.io/ent/dialect/sql" dexstorage "github.com/dexidp/dex/storage" "github.com/dexidp/dex/storage/ent/client" "github.com/dexidp/dex/storage/ent/db" "tug/internal/storage" "tug/internal/storage/internal/attach" ) func Attach(ctx context.Context, store *storage.Store) (dexstorage.Storage, error) { return attachStore(ctx, store, nil) } func attachStore(ctx context.Context, store *storage.Store, wrap func(dialect.Driver) dialect.Driver) (dexstorage.Storage, error) { a := &attacher{wrap: wrap} if err := store.Attach(ctx, a); err != nil { return nil, err } return view{a.database}, nil } type attacher struct { wrap func(dialect.Driver) dialect.Driver database *client.Database } func (a *attacher) Attach(ctx context.Context, pool attach.Pool) (io.Closer, error) { sqlDB, err := pool.Open(ctx) if err != nil { return nil, err } sqlDB.SetMaxOpenConns(0) var driver dialect.Driver = entsql.OpenDB(dialect.SQLite, sqlDB) if a.wrap != nil { driver = a.wrap(driver) } database := client.NewDatabase( client.WithClient(db.NewClient(db.Driver(driver))), client.WithHasher(sha256.New), ) if err := database.Schema().Create(ctx); err != nil { database.Close() return nil, fmt.Errorf("create dex schema: %w", err) } a.database = database return database, nil } type storageView = dexstorage.Storage type view struct { storageView } func (view) Close() error { return nil }