diff --git a/cmd/setup_circuits_test.go b/cmd/setup_circuits_test.go index 05365bd72..839616607 100644 --- a/cmd/setup_circuits_test.go +++ b/cmd/setup_circuits_test.go @@ -22,8 +22,7 @@ type circuitsTestSuite struct { } func (suite *circuitsTestSuite) SetupSuite() { - _ = db.NewInstance("sqlite", ":memory:") - config.SetupSchema() + suite.Require().NoError(db.NewInstance("sqlite", ":memory:")) } func (suite *circuitsTestSuite) SetupTest() { diff --git a/core/metrics/db.go b/core/metrics/db.go index c5c1aeef9..a7f722a9d 100644 --- a/core/metrics/db.go +++ b/core/metrics/db.go @@ -5,6 +5,7 @@ import ( "time" "github.com/evcc-io/evcc/server/db" + "gorm.io/gorm" ) type meter struct { @@ -16,16 +17,11 @@ type meter struct { var ErrIncomplete = errors.New("meter profile incomplete") func init() { - db.Register(func() error { - return SetupSchema() + db.Register(func(db *gorm.DB) error { + return db.AutoMigrate(new(meter)) }) } -// SetupSchema is used for testing -func SetupSchema() error { - return db.Instance.AutoMigrate(new(meter)) -} - // Persist stores 15min consumption in Wh func Persist(ts time.Time, value float64) error { return db.Instance.Create(meter{ diff --git a/core/session/db.go b/core/session/db.go index fc7da5c6c..ab21ff624 100644 --- a/core/session/db.go +++ b/core/session/db.go @@ -13,17 +13,15 @@ type DB struct { name string } -var ( - sessions Sessions -) +var sessions Sessions func init() { - db.Register(func() error { - if err := db.Instance.AutoMigrate(new(Session)); err != nil { + db.Register(func(db *gorm.DB) error { + if err := db.AutoMigrate(new(Session)); err != nil { return err } - return db.Instance.Find(&sessions).Error + return db.Find(&sessions).Error }) } diff --git a/core/site_optimizer_test.go b/core/site_optimizer_test.go index 2739b7157..ba68c6f9c 100644 --- a/core/site_optimizer_test.go +++ b/core/site_optimizer_test.go @@ -15,12 +15,10 @@ import ( ) func TestSqliteTimestamp(t *testing.T) { + require.NoError(t, db.NewInstance("sqlite", ":memory:")) + clock := clock.NewMock() clock.Add(time.Hour) - - require.NoError(t, db.NewInstance("sqlite", ":memory:")) - require.NoError(t, metrics.SetupSchema()) - metrics.Persist(clock.Now(), 0) db, err := db.Instance.DB() @@ -50,14 +48,12 @@ func TestSqliteTimestamp(t *testing.T) { } func TestUpdateHouseholdProfile(t *testing.T) { - clock := clock.NewMock() + require.NoError(t, db.NewInstance("sqlite", ":memory:")) // make sure test data added starting 00:00 local time + clock := clock.NewMock() clock.Set(now.With(clock.Now()).BeginningOfDay()) - require.NoError(t, db.NewInstance("sqlite", ":memory:")) - require.NoError(t, metrics.SetupSchema()) - // 2 days of data // day 1: 0 ... 95 // day 2: 96 ... 181 diff --git a/core/site_test.go b/core/site_test.go index 301ecf0b4..7885c978b 100644 --- a/core/site_test.go +++ b/core/site_test.go @@ -6,7 +6,6 @@ import ( "github.com/benbjohnson/clock" "github.com/evcc-io/evcc/api" - "github.com/evcc-io/evcc/core/metrics" "github.com/evcc-io/evcc/server/db" "github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util/config" @@ -163,10 +162,9 @@ func TestRequiredBatteryMode(t *testing.T) { } func TestUpdateHomeConsumption(t *testing.T) { - clock := clock.NewMock() - require.NoError(t, db.NewInstance("sqlite", ":memory:")) - require.NoError(t, metrics.SetupSchema()) + + clock := clock.NewMock() s := &Site{ log: util.NewLogger("foo"), diff --git a/hems/smartgrid/smartgrid.go b/hems/smartgrid/smartgrid.go index c2c650228..08f1cb9e6 100644 --- a/hems/smartgrid/smartgrid.go +++ b/hems/smartgrid/smartgrid.go @@ -4,11 +4,12 @@ import ( "time" "github.com/evcc-io/evcc/server/db" + "gorm.io/gorm" ) func init() { - db.Register(func() error { - return db.Instance.AutoMigrate(new(GridSession)) + db.Register(func(db *gorm.DB) error { + return db.AutoMigrate(new(GridSession)) }) } diff --git a/server/db/cache/cache.go b/server/db/cache/cache.go index d971c0b2d..f19492278 100644 --- a/server/db/cache/cache.go +++ b/server/db/cache/cache.go @@ -18,8 +18,8 @@ type Cache struct { } func init() { - db.Register(func() error { - return db.Instance.AutoMigrate(new(Cache)) + db.Register(func(db *gorm.DB) error { + return db.AutoMigrate(new(Cache)) }) } diff --git a/server/db/db.go b/server/db/db.go index 19b5011f2..4c4cea7b4 100644 --- a/server/db/db.go +++ b/server/db/db.go @@ -74,18 +74,18 @@ func New(driver, dsn string) (*gorm.DB, error) { } func NewInstance(driver, dsn string) error { - inst, err := New(strings.ToLower(driver), dsn) + db, err := New(strings.ToLower(driver), dsn) if err != nil { return err } - Instance = inst + Instance = db mu.Lock() defer mu.Unlock() for _, f := range registry { - if err := f(); err != nil { + if err := f(db); err != nil { return err } } diff --git a/server/db/registry.go b/server/db/registry.go index ae98bdcd2..d96d400ff 100644 --- a/server/db/registry.go +++ b/server/db/registry.go @@ -1,13 +1,17 @@ package db -import "sync" +import ( + "sync" + + "gorm.io/gorm" +) var ( mu sync.Mutex - registry []func() error + registry []func(db *gorm.DB) error ) -func Register(fun func() error) { +func Register(fun func(db *gorm.DB) error) { mu.Lock() defer mu.Unlock() registry = append(registry, fun) diff --git a/server/db/settings/setting.go b/server/db/settings/setting.go index 14f193075..211c05300 100644 --- a/server/db/settings/setting.go +++ b/server/db/settings/setting.go @@ -17,6 +17,7 @@ import ( "github.com/evcc-io/evcc/util" "github.com/samber/lo" "go.yaml.in/yaml/v4" + "gorm.io/gorm" ) var ErrNotFound = errors.New("not found") @@ -34,12 +35,12 @@ var ( ) func init() { - db.Register(func() error { - if err := db.Instance.AutoMigrate(new(setting)); err != nil { + db.Register(func(db *gorm.DB) error { + if err := db.AutoMigrate(new(setting)); err != nil { return err } - return db.Instance.Find(&settings).Error + return db.Find(&settings).Error }) } diff --git a/util/config/config.go b/util/config/config.go index a566a3c6e..6a082163c 100644 --- a/util/config/config.go +++ b/util/config/config.go @@ -77,16 +77,11 @@ func (d *Config) Delete() error { } func init() { - db.Register(func() error { - return SetupSchema() + db.Register(func(db *gorm.DB) error { + return db.AutoMigrate(new(Config)) }) } -// SetupSchema is used for testing -func SetupSchema() error { - return db.Instance.AutoMigrate(new(Config)) -} - // NameForID returns a unique config name for the given id func NameForID(id int) string { return fmt.Sprintf("db:%d", id)