From 3da4a600fad650b0cc17a76c26844fa727e87674 Mon Sep 17 00:00:00 2001 From: Viktor Torstensson Date: Tue, 12 May 2026 12:43:52 +0200 Subject: [PATCH] terminal: add `NewStores` to the `Config` struct Make the `NewStores` function into a struct member of the `Config` struct, as the choice of database backend is now part of the production configuration. --- config.go | 289 ++++++++++++++++++++++++++-------------------------- terminal.go | 4 +- 2 files changed, 147 insertions(+), 146 deletions(-) diff --git a/config.go b/config.go index 5b68f34f..8f4fdaf5 100644 --- a/config.go +++ b/config.go @@ -283,6 +283,151 @@ type Config struct { *DevConfig } +// NewStores creates a new stores instance based on the chosen database +// backend. +func (c *Config) NewStores(ctx context.Context, + basicClient lnrpc.LightningClient, clock clock.Clock) (*stores, error) { + + var ( + networkDir = filepath.Join(c.LitDir, c.Network) + stores = &stores{ + closeFns: make(map[string]func() error), + } + ) + + switch c.DatabaseBackend { + case DatabaseBackendSqlite: + // Before we initialize the SQLite store, we'll make sure that + // the directory where we will store the database file exists. + err := makeDirectories(networkDir) + if err != nil { + return stores, err + } + + sqlStore, err := sqldb.NewSqliteStore(&sqldb.SqliteConfig{ + SkipMigrations: c.Sqlite.SkipMigrations, + SkipMigrationDbBackup: c.Sqlite.SkipMigrationDbBackup, + }, c.Sqlite.DatabaseFileName) + if err != nil { + return stores, err + } + + if !c.Sqlite.SkipMigrations { + err = sqldb.ApplyAllMigrations( + sqlStore, + migsets.MakeMigrationSets( + ctx, basicClient, c.MacaroonPath, + clock, + ), + ) + if err != nil { + return stores, fmt.Errorf("error applying "+ + "migrations to SQLite store: %w", err, + ) + } + } + + queries := sqlc.NewForType(sqlStore, sqlStore.BackendType) + + acctStore := accounts.NewSQLStore( + sqlStore.BaseDB, queries, clock, + ) + sessStore := session.NewSQLStore( + sqlStore.BaseDB, queries, clock, + ) + firewallStore := firewalldb.NewSQLDB( + sqlStore.BaseDB, queries, clock, + ) + + stores.accounts = acctStore + stores.sessions = sessStore + stores.firewall = firewalldb.NewDB(firewallStore) + stores.closeFns["sqlite"] = sqlStore.BaseDB.Close + + case DatabaseBackendPostgres: + sqlStore, err := sqldb.NewPostgresStore(&sqldb.PostgresConfig{ + Dsn: c.Postgres.DSN(false), + MaxOpenConnections: c.Postgres.MaxOpenConnections, + MaxIdleConnections: c.Postgres.MaxIdleConnections, + ConnMaxLifetime: c.Postgres.ConnMaxLifetime, + ConnMaxIdleTime: c.Postgres.ConnMaxIdleTime, + RequireSSL: c.Postgres.RequireSSL, + SkipMigrations: c.Postgres.SkipMigrations, + }) + if err != nil { + return stores, err + } + + if !c.Postgres.SkipMigrations { + err = sqldb.ApplyAllMigrations( + sqlStore, + migsets.MakeMigrationSets( + ctx, basicClient, c.MacaroonPath, + clock, + ), + ) + if err != nil { + return stores, fmt.Errorf("error applying "+ + "migrations to Postgres store: %w", err, + ) + } + } + + queries := sqlc.NewForType(sqlStore, sqlStore.BackendType) + + acctStore := accounts.NewSQLStore( + sqlStore.BaseDB, queries, clock, + ) + sessStore := session.NewSQLStore( + sqlStore.BaseDB, queries, clock, + ) + firewallStore := firewalldb.NewSQLDB( + sqlStore.BaseDB, queries, clock, + ) + + stores.accounts = acctStore + stores.sessions = sessStore + stores.firewall = firewalldb.NewDB(firewallStore) + stores.closeFns["postgres"] = sqlStore.BaseDB.Close + + default: + accountStore, err := accounts.NewBoltStore( + filepath.Dir(c.MacaroonPath), accounts.DBFilename, + clock, + ) + if err != nil { + return stores, err + } + + stores.accounts = accountStore + stores.closeFns["bbolt-accounts"] = accountStore.Close + + sessionStore, err := session.NewDB( + networkDir, session.DBFilename, clock, accountStore, + ) + if err != nil { + return stores, err + } + + stores.sessions = sessionStore + stores.closeFns["bbolt-sessions"] = sessionStore.Close + + firewallBoltDB, err := firewalldb.NewBoltDB( + networkDir, firewalldb.DBFilename, stores.sessions, + stores.accounts, clock, + ) + if err != nil { + return stores, fmt.Errorf("error creating firewall "+ + "BoltDB: %v", err) + } + + stores.firewall = firewalldb.NewDB(firewallBoltDB) + stores.closeFns["bbolt-firewalldb"] = firewallBoltDB.Close + } + + return stores, nil +} + // lndConnectParams returns the connection parameters to connect to the local // lnd instance. func (c *Config) lndConnectParams() (string, lndclient.Network, string, @@ -1116,147 +1261,3 @@ func parseNetwork(addr net.Addr) string { return addr.Network() } } - -// NewStores creates a new stores instance based on the chosen database backend. -func NewStores(ctx context.Context, cfg *Config, - basicClient lnrpc.LightningClient, clock clock.Clock) (*stores, error) { - - var ( - networkDir = filepath.Join(cfg.LitDir, cfg.Network) - stores = &stores{ - closeFns: make(map[string]func() error), - } - ) - - switch cfg.DatabaseBackend { - case DatabaseBackendSqlite: - // Before we initialize the SQLite store, we'll make sure that - // the directory where we will store the database file exists. - err := makeDirectories(networkDir) - if err != nil { - return stores, err - } - - sqlStore, err := sqldb.NewSqliteStore(&sqldb.SqliteConfig{ - SkipMigrations: cfg.Sqlite.SkipMigrations, - SkipMigrationDbBackup: cfg.Sqlite.SkipMigrationDbBackup, - }, cfg.Sqlite.DatabaseFileName) - if err != nil { - return stores, err - } - - if !cfg.Sqlite.SkipMigrations { - err = sqldb.ApplyAllMigrations( - sqlStore, - migsets.MakeMigrationSets( - ctx, basicClient, cfg.MacaroonPath, - clock, - ), - ) - if err != nil { - return stores, fmt.Errorf("error applying "+ - "migrations to SQLite store: %w", err, - ) - } - } - - queries := sqlc.NewForType(sqlStore, sqlStore.BackendType) - - acctStore := accounts.NewSQLStore( - sqlStore.BaseDB, queries, clock, - ) - sessStore := session.NewSQLStore( - sqlStore.BaseDB, queries, clock, - ) - firewallStore := firewalldb.NewSQLDB( - sqlStore.BaseDB, queries, clock, - ) - - stores.accounts = acctStore - stores.sessions = sessStore - stores.firewall = firewalldb.NewDB(firewallStore) - stores.closeFns["sqlite"] = sqlStore.BaseDB.Close - - case DatabaseBackendPostgres: - sqlStore, err := sqldb.NewPostgresStore(&sqldb.PostgresConfig{ - Dsn: cfg.Postgres.DSN(false), - MaxOpenConnections: cfg.Postgres.MaxOpenConnections, - MaxIdleConnections: cfg.Postgres.MaxIdleConnections, - ConnMaxLifetime: cfg.Postgres.ConnMaxLifetime, - ConnMaxIdleTime: cfg.Postgres.ConnMaxIdleTime, - RequireSSL: cfg.Postgres.RequireSSL, - SkipMigrations: cfg.Postgres.SkipMigrations, - }) - if err != nil { - return stores, err - } - - if !cfg.Postgres.SkipMigrations { - err = sqldb.ApplyAllMigrations( - sqlStore, - migsets.MakeMigrationSets( - ctx, basicClient, cfg.MacaroonPath, - clock, - ), - ) - if err != nil { - return stores, fmt.Errorf("error applying "+ - "migrations to Postgres store: %w", err, - ) - } - } - - queries := sqlc.NewForType(sqlStore, sqlStore.BackendType) - - acctStore := accounts.NewSQLStore( - sqlStore.BaseDB, queries, clock, - ) - sessStore := session.NewSQLStore( - sqlStore.BaseDB, queries, clock, - ) - firewallStore := firewalldb.NewSQLDB( - sqlStore.BaseDB, queries, clock, - ) - - stores.accounts = acctStore - stores.sessions = sessStore - stores.firewall = firewalldb.NewDB(firewallStore) - stores.closeFns["postgres"] = sqlStore.BaseDB.Close - - default: - accountStore, err := accounts.NewBoltStore( - filepath.Dir(cfg.MacaroonPath), accounts.DBFilename, - clock, - ) - if err != nil { - return stores, err - } - - stores.accounts = accountStore - stores.closeFns["bbolt-accounts"] = accountStore.Close - - sessionStore, err := session.NewDB( - networkDir, session.DBFilename, clock, accountStore, - ) - if err != nil { - return stores, err - } - - stores.sessions = sessionStore - stores.closeFns["bbolt-sessions"] = sessionStore.Close - - firewallBoltDB, err := firewalldb.NewBoltDB( - networkDir, firewalldb.DBFilename, stores.sessions, - stores.accounts, clock, - ) - if err != nil { - return stores, fmt.Errorf("error creating firewall "+ - "BoltDB: %v", err) - } - - stores.firewall = firewalldb.NewDB(firewallBoltDB) - stores.closeFns["bbolt-firewalldb"] = firewallBoltDB.Close - } - - return stores, nil -} diff --git a/terminal.go b/terminal.go index 6d287c08..a14605f0 100644 --- a/terminal.go +++ b/terminal.go @@ -729,8 +729,8 @@ func (g *LightningTerminal) start(ctx context.Context) error { return fmt.Errorf("could not start LND") } - g.stores, err = NewStores( - ctx, g.cfg, g.basicClient, clock.NewDefaultClock(), + g.stores, err = g.cfg.NewStores( + ctx, g.basicClient, clock.NewDefaultClock(), ) if err != nil { return fmt.Errorf("could not create stores: %v", err)