From 344d7a4392d4cd1a9a20a9d38d2a000b1b36e98c Mon Sep 17 00:00:00 2001 From: Deluan Date: Sat, 31 Jul 2021 20:15:20 -0400 Subject: [PATCH] Inject DB into DataStore, instead of hardcode the dependency --- cmd/wire_gen.go | 18 ++++++++++++------ cmd/wire_injectors.go | 5 +++-- db/db.go | 15 +++++---------- persistence/persistence.go | 10 ++++++---- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index d310165e7..f28285878 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -12,6 +12,7 @@ import ( "github.com/navidrome/navidrome/core/agents/lastfm" "github.com/navidrome/navidrome/core/scrobbler" "github.com/navidrome/navidrome/core/transcoder" + "github.com/navidrome/navidrome/db" "github.com/navidrome/navidrome/persistence" "github.com/navidrome/navidrome/scanner" "github.com/navidrome/navidrome/server" @@ -24,13 +25,15 @@ import ( // Injectors from wire_injectors.go: func CreateServer(musicFolder string) *server.Server { - dataStore := persistence.New() + sqlDB := db.Db() + dataStore := persistence.New(sqlDB) serverServer := server.New(dataStore) return serverServer } func CreateNativeAPIRouter() *nativeapi.Router { - dataStore := persistence.New() + sqlDB := db.Db() + dataStore := persistence.New(sqlDB) broker := events.GetBroker() share := core.NewShare(dataStore) router := nativeapi.New(dataStore, broker, share) @@ -38,7 +41,8 @@ func CreateNativeAPIRouter() *nativeapi.Router { } func CreateSubsonicAPIRouter() *subsonic.Router { - dataStore := persistence.New() + sqlDB := db.Db() + dataStore := persistence.New(sqlDB) artworkCache := core.GetImageCache() artwork := core.NewArtwork(dataStore, artworkCache) transcoderTranscoder := transcoder.New() @@ -56,13 +60,15 @@ func CreateSubsonicAPIRouter() *subsonic.Router { } func CreateLastFMRouter() *lastfm.Router { - dataStore := persistence.New() + sqlDB := db.Db() + dataStore := persistence.New(sqlDB) router := lastfm.NewRouter(dataStore) return router } func createScanner() scanner.Scanner { - dataStore := persistence.New() + sqlDB := db.Db() + dataStore := persistence.New(sqlDB) artworkCache := core.GetImageCache() artwork := core.NewArtwork(dataStore, artworkCache) cacheWarmer := core.NewCacheWarmer(artwork, artworkCache) @@ -73,7 +79,7 @@ func createScanner() scanner.Scanner { // wire_injectors.go: -var allProviders = wire.NewSet(core.Set, subsonic.New, nativeapi.New, persistence.New, lastfm.NewRouter, events.GetBroker) +var allProviders = wire.NewSet(core.Set, subsonic.New, nativeapi.New, persistence.New, lastfm.NewRouter, events.GetBroker, db.Db) // Scanner must be a Singleton var ( diff --git a/cmd/wire_injectors.go b/cmd/wire_injectors.go index 4c906de50..6a1f96931 100644 --- a/cmd/wire_injectors.go +++ b/cmd/wire_injectors.go @@ -5,14 +5,14 @@ package cmd import ( "sync" - "github.com/navidrome/navidrome/server/events" - "github.com/google/wire" "github.com/navidrome/navidrome/core" "github.com/navidrome/navidrome/core/agents/lastfm" + "github.com/navidrome/navidrome/db" "github.com/navidrome/navidrome/persistence" "github.com/navidrome/navidrome/scanner" "github.com/navidrome/navidrome/server" + "github.com/navidrome/navidrome/server/events" "github.com/navidrome/navidrome/server/nativeapi" "github.com/navidrome/navidrome/server/subsonic" ) @@ -24,6 +24,7 @@ var allProviders = wire.NewSet( persistence.New, lastfm.NewRouter, events.GetBroker, + db.Db, ) func CreateServer(musicFolder string) *server.Server { diff --git a/db/db.go b/db/db.go index dc6576d3e..037d27167 100644 --- a/db/db.go +++ b/db/db.go @@ -4,12 +4,12 @@ import ( "database/sql" "fmt" "os" - "sync" _ "github.com/mattn/go-sqlite3" "github.com/navidrome/navidrome/conf" _ "github.com/navidrome/navidrome/db/migration" "github.com/navidrome/navidrome/log" + "github.com/navidrome/navidrome/utils/singleton" "github.com/pressly/goose" ) @@ -18,26 +18,21 @@ var ( Path string ) -var ( - once sync.Once - db *sql.DB -) - func Db() *sql.DB { - once.Do(func() { - var err error + instance := singleton.Get(&sql.DB{}, func() interface{} { Path = conf.Server.DbPath if Path == ":memory:" { Path = "file::memory:?cache=shared&_foreign_keys=on" conf.Server.DbPath = Path } log.Debug("Opening DataBase", "dbPath", Path, "driver", Driver) - db, err = sql.Open(Driver, Path) + instance, err := sql.Open(Driver, Path) if err != nil { panic(err) } + return instance }) - return db + return instance.(*sql.DB) } func EnsureLatestVersion() { diff --git a/persistence/persistence.go b/persistence/persistence.go index 9c816dd16..54e7f9f7d 100644 --- a/persistence/persistence.go +++ b/persistence/persistence.go @@ -2,6 +2,7 @@ package persistence import ( "context" + "database/sql" "reflect" "github.com/astaxie/beego/orm" @@ -12,10 +13,11 @@ import ( type SQLStore struct { orm orm.Ormer + db *sql.DB } -func New() model.DataStore { - return &SQLStore{} +func New(db *sql.DB) model.DataStore { + return &SQLStore{db: db} } func (s *SQLStore) Album(ctx context.Context) model.AlbumRepository { @@ -100,7 +102,7 @@ func (s *SQLStore) Resource(ctx context.Context, m interface{}) model.ResourceRe } func (s *SQLStore) WithTx(block func(tx model.DataStore) error) error { - o, err := orm.NewOrmWithDB(db.Driver, "default", db.Db()) + o, err := orm.NewOrmWithDB(db.Driver, "default", s.db) if err != nil { return err } @@ -177,7 +179,7 @@ func (s *SQLStore) GC(ctx context.Context, rootFolder string) error { func (s *SQLStore) getOrmer() orm.Ormer { if s.orm == nil { - o, err := orm.NewOrmWithDB(db.Driver, "default", db.Db()) + o, err := orm.NewOrmWithDB(db.Driver, "default", s.db) if err != nil { log.Error("Error obtaining new orm instance", err) }