diff --git a/.gitignore b/.gitignore index 96218c045..271b03bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ /sonic-server /iTunes*.xml -devDb* /tmp vendor/*/ wiki @@ -11,3 +10,4 @@ sonic.toml master.zip Jamstash-master storm.db +sonic.db diff --git a/conf/configuration.go b/conf/configuration.go index 5378e3db1..0f060a7e5 100644 --- a/conf/configuration.go +++ b/conf/configuration.go @@ -11,7 +11,7 @@ import ( type sonic struct { Port string `default:"4533"` MusicFolder string `default:"./iTunes1.xml"` - DbPath string `default:"./devDb"` + DbPath string `default:"./sonic.db"` IgnoredArticles string `default:"The El La Los Las Le Les Os As O A"` IndexGroups string `default:"A B C D E F G H I J K L M N O P Q R S T U V W X-Z(XYZ) [Unknown]([)"` diff --git a/domain/album.go b/domain/album.go index 66b08c55e..244578725 100644 --- a/domain/album.go +++ b/domain/album.go @@ -32,7 +32,7 @@ type AlbumRepository interface { Get(id string) (*Album, error) FindByArtist(artistId string) (Albums, error) GetAll(...QueryOptions) (Albums, error) - PurgeInactive(active Albums) ([]string, error) + PurgeInactive(active Albums) error GetAllIds() ([]string, error) GetStarred(...QueryOptions) (Albums, error) Search(q string, offset int, size int) (Albums, error) diff --git a/domain/artist.go b/domain/artist.go index ef6bc050b..63f973e9c 100644 --- a/domain/artist.go +++ b/domain/artist.go @@ -10,7 +10,7 @@ type ArtistRepository interface { BaseRepository Put(m *Artist) error Get(id string) (*Artist, error) - PurgeInactive(active Artists) ([]string, error) + PurgeInactive(active Artists) error Search(q string, offset int, size int) (Artists, error) } diff --git a/domain/mediafile.go b/domain/mediafile.go index 017f61edb..560e040ef 100644 --- a/domain/mediafile.go +++ b/domain/mediafile.go @@ -51,7 +51,7 @@ type MediaFileRepository interface { Get(id string) (*MediaFile, error) FindByAlbum(albumId string) (MediaFiles, error) GetStarred(options ...QueryOptions) (MediaFiles, error) - PurgeInactive(active MediaFiles) ([]string, error) + PurgeInactive(active MediaFiles) error GetAllIds() ([]string, error) Search(q string, offset int, size int) (MediaFiles, error) } diff --git a/persistence/db_sql/album_repository.go b/persistence/album_repository.go similarity index 85% rename from persistence/db_sql/album_repository.go rename to persistence/album_repository.go index 288e6ddf0..240f7eceb 100644 --- a/persistence/db_sql/album_repository.go +++ b/persistence/album_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "time" @@ -30,7 +30,7 @@ type Album struct { } type albumRepository struct { - sqlRepository + searchableRepository } func NewAlbumRepository() domain.AlbumRepository { @@ -41,12 +41,8 @@ func NewAlbumRepository() domain.AlbumRepository { func (r *albumRepository) Put(a *domain.Album) error { ta := Album(*a) - return WithTx(func(o orm.Ormer) error { - err := r.put(o, a.ID, &ta) - if err != nil { - return err - } - return r.searcher.Index(o, r.tableName, a.ID, a.Name) + return withTx(func(o orm.Ormer) error { + return r.put(o, a.ID, a.Name, &ta) }) } @@ -89,9 +85,13 @@ func (r *albumRepository) toAlbums(all []Album) domain.Albums { return result } -func (r *albumRepository) PurgeInactive(activeList domain.Albums) ([]string, error) { - return r.purgeInactive(activeList, func(item interface{}) string { - return item.(domain.Album).ID +// TODO Remove []string from return +func (r *albumRepository) PurgeInactive(activeList domain.Albums) error { + return withTx(func(o orm.Ormer) error { + _, err := r.purgeInactive(o, activeList, func(item interface{}) string { + return item.(domain.Album).ID + }) + return err }) } @@ -110,7 +110,7 @@ func (r *albumRepository) Search(q string, offset int, size int) (domain.Albums, } var results []Album - err := r.searcher.Search(r.tableName, q, offset, size, &results, "rating desc", "starred desc", "play_count desc", "name") + err := r.doSearch(r.tableName, q, offset, size, &results, "rating desc", "starred desc", "play_count desc", "name") if err != nil { return nil, err } diff --git a/persistence/db_sql/album_repository_test.go b/persistence/album_repository_test.go similarity index 99% rename from persistence/db_sql/album_repository_test.go rename to persistence/album_repository_test.go index e43ab92ae..49872cf9b 100644 --- a/persistence/db_sql/album_repository_test.go +++ b/persistence/album_repository_test.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/cloudsonic/sonic-server/domain" diff --git a/persistence/db_sql/artist_repository.go b/persistence/artist_repository.go similarity index 78% rename from persistence/db_sql/artist_repository.go rename to persistence/artist_repository.go index d11e00c5f..f13edb86a 100644 --- a/persistence/db_sql/artist_repository.go +++ b/persistence/artist_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/astaxie/beego/orm" @@ -13,7 +13,7 @@ type Artist struct { } type artistRepository struct { - sqlRepository + searchableRepository } func NewArtistRepository() domain.ArtistRepository { @@ -24,12 +24,8 @@ func NewArtistRepository() domain.ArtistRepository { func (r *artistRepository) Put(a *domain.Artist) error { ta := Artist(*a) - return WithTx(func(o orm.Ormer) error { - err := r.put(o, a.ID, &ta) - if err != nil { - return err - } - return r.searcher.Index(o, r.tableName, a.ID, a.Name) + return withTx(func(o orm.Ormer) error { + return r.put(o, a.ID, a.Name, &ta) }) } @@ -46,9 +42,12 @@ func (r *artistRepository) Get(id string) (*domain.Artist, error) { return &a, nil } -func (r *artistRepository) PurgeInactive(activeList domain.Artists) ([]string, error) { - return r.purgeInactive(activeList, func(item interface{}) string { - return item.(domain.Artist).ID +func (r *artistRepository) PurgeInactive(activeList domain.Artists) error { + return withTx(func(o orm.Ormer) error { + _, err := r.purgeInactive(o, activeList, func(item interface{}) string { + return item.(domain.Artist).ID + }) + return err }) } @@ -58,7 +57,7 @@ func (r *artistRepository) Search(q string, offset int, size int) (domain.Artist } var results []Artist - err := r.searcher.Search(r.tableName, q, offset, size, &results, "name") + err := r.doSearch(r.tableName, q, offset, size, &results, "name") if err != nil { return nil, err } diff --git a/persistence/db_sql/artist_repository_test.go b/persistence/artist_repository_test.go similarity index 91% rename from persistence/db_sql/artist_repository_test.go rename to persistence/artist_repository_test.go index 4dce730f7..0aa5d1b65 100644 --- a/persistence/db_sql/artist_repository_test.go +++ b/persistence/artist_repository_test.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/cloudsonic/sonic-server/domain" @@ -36,14 +36,18 @@ var _ = Describe("ArtistRepository", func() { It("purges inactive records", func() { active := domain.Artists{{ID: "1"}, {ID: "3"}} - Expect(repo.PurgeInactive(active)).To(Equal([]string{"2"})) + + Expect(repo.PurgeInactive(active)).To(BeNil()) + Expect(repo.CountAll()).To(Equal(int64(2))) Expect(repo.Exists("2")).To(BeFalse()) }) It("doesn't delete anything if all is active", func() { active := domain.Artists{{ID: "1"}, {ID: "2"}, {ID: "3"}} - Expect(repo.PurgeInactive(active)).To(BeEmpty()) + + Expect(repo.PurgeInactive(active)).To(BeNil()) + Expect(repo.CountAll()).To(Equal(int64(3))) Expect(repo.Exists("1")).To(BeTrue()) }) diff --git a/persistence/db_sql/checksum_repository.go b/persistence/checksum_repository.go similarity index 95% rename from persistence/db_sql/checksum_repository.go rename to persistence/checksum_repository.go index 7d7b4be4f..5f0c0e66d 100644 --- a/persistence/db_sql/checksum_repository.go +++ b/persistence/checksum_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/astaxie/beego/orm" @@ -51,7 +51,7 @@ func (r *checkSumRepository) Get(id string) (string, error) { } func (r *checkSumRepository) SetData(newSums map[string]string) error { - err := WithTx(func(o orm.Ormer) error { + err := withTx(func(o orm.Ormer) error { _, err := Db().Raw("delete from checksum").Exec() if err != nil { return err diff --git a/persistence/db_sql/checksum_repository_test.go b/persistence/checksum_repository_test.go similarity index 96% rename from persistence/db_sql/checksum_repository_test.go rename to persistence/checksum_repository_test.go index aa9e3d2d0..eed3b8695 100644 --- a/persistence/db_sql/checksum_repository_test.go +++ b/persistence/checksum_repository_test.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/cloudsonic/sonic-server/scanner" diff --git a/persistence/db_sql/sql_suite_test.go b/persistence/db_sql/sql_suite_test.go deleted file mode 100644 index ffa6368ec..000000000 --- a/persistence/db_sql/sql_suite_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package db_sql - -import ( - "testing" - - "github.com/cloudsonic/sonic-server/conf" - "github.com/cloudsonic/sonic-server/domain" - "github.com/cloudsonic/sonic-server/log" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestSQLitePersistence(t *testing.T) { - log.SetLevel(log.LevelDebug) - RegisterFailHandler(Fail) - RunSpecs(t, "SQLite Persistence Suite") -} - -var testAlbums = domain.Albums{ - {ID: "1", Name: "Sgt Peppers", Artist: "The Beatles", ArtistID: "1"}, - {ID: "2", Name: "Abbey Road", Artist: "The Beatles", ArtistID: "1"}, - {ID: "3", Name: "Radioactivity", Artist: "Kraftwerk", ArtistID: "2", Starred: true}, -} -var testArtists = domain.Artists{ - {ID: "1", Name: "Saara Saara", AlbumCount: 2}, - {ID: "2", Name: "Kraftwerk"}, - {ID: "3", Name: "The Beatles"}, -} - -var _ = Describe("Initialize test DB", func() { - BeforeSuite(func() { - //conf.Sonic.DbPath, _ = ioutil.TempDir("", "cloudsonic_tests") - //os.MkdirAll(conf.Sonic.DbPath, 0700) - conf.Sonic.DbPath = ":memory:" - Db() - artistRepo := NewArtistRepository() - for _, a := range testArtists { - artistRepo.Put(&a) - } - albumRepository := NewAlbumRepository() - for _, a := range testAlbums { - err := albumRepository.Put(&a) - if err != nil { - panic(err) - } - } - }) -}) diff --git a/persistence/db_sql/index_repository.go b/persistence/index_repository.go similarity index 97% rename from persistence/db_sql/index_repository.go rename to persistence/index_repository.go index b81ab8118..2a0e9639c 100644 --- a/persistence/db_sql/index_repository.go +++ b/persistence/index_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "sort" @@ -35,7 +35,7 @@ func (r *artistIndexRepository) CountAll() (int64, error) { } func (r *artistIndexRepository) Put(idx *domain.ArtistIndex) error { - return WithTx(func(o orm.Ormer) error { + return withTx(func(o orm.Ormer) error { _, err := r.newQuery(o).Filter("idx", idx.ID).Delete() if err != nil { return err diff --git a/persistence/db_sql/index_repository_test.go b/persistence/index_repository_test.go similarity index 98% rename from persistence/db_sql/index_repository_test.go rename to persistence/index_repository_test.go index 26cddeb96..be629050f 100644 --- a/persistence/db_sql/index_repository_test.go +++ b/persistence/index_repository_test.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/cloudsonic/sonic-server/domain" diff --git a/persistence/db_sql/mediafile_repository.go b/persistence/mediafile_repository.go similarity index 85% rename from persistence/db_sql/mediafile_repository.go rename to persistence/mediafile_repository.go index 6c1d40a3a..0d4e1a160 100644 --- a/persistence/db_sql/mediafile_repository.go +++ b/persistence/mediafile_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "time" @@ -36,7 +36,7 @@ type MediaFile struct { } type mediaFileRepository struct { - sqlRepository + searchableRepository } func NewMediaFileRepository() domain.MediaFileRepository { @@ -47,12 +47,8 @@ func NewMediaFileRepository() domain.MediaFileRepository { func (r *mediaFileRepository) Put(m *domain.MediaFile) error { tm := MediaFile(*m) - return WithTx(func(o orm.Ormer) error { - err := r.put(o, m.ID, &tm) - if err != nil { - return err - } - return r.searcher.Index(o, r.tableName, m.ID, m.Title) + return withTx(func(o orm.Ormer) error { + return r.put(o, m.ID, m.Title, &tm) }) } @@ -95,9 +91,12 @@ func (r *mediaFileRepository) GetStarred(options ...domain.QueryOptions) (domain return r.toMediaFiles(starred), nil } -func (r *mediaFileRepository) PurgeInactive(activeList domain.MediaFiles) ([]string, error) { - return r.purgeInactive(activeList, func(item interface{}) string { - return item.(domain.MediaFile).ID +func (r *mediaFileRepository) PurgeInactive(activeList domain.MediaFiles) error { + return withTx(func(o orm.Ormer) error { + _, err := r.purgeInactive(o, activeList, func(item interface{}) string { + return item.(domain.MediaFile).ID + }) + return err }) } @@ -107,7 +106,7 @@ func (r *mediaFileRepository) Search(q string, offset int, size int) (domain.Med } var results []MediaFile - err := r.searcher.Search(r.tableName, q, offset, size, &results, "rating desc", "starred desc", "play_count desc", "title") + err := r.doSearch(r.tableName, q, offset, size, &results, "rating desc", "starred desc", "play_count desc", "title") if err != nil { return nil, err } diff --git a/persistence/persistence.go b/persistence/persistence.go index a040af738..1e2653f2b 100644 --- a/persistence/persistence.go +++ b/persistence/persistence.go @@ -2,9 +2,7 @@ package persistence import "reflect" -type ProviderIdentifier string - -func CollectValue(collection interface{}, getValue func(item interface{}) string) []string { +func collectField(collection interface{}, getValue func(item interface{}) string) []string { s := reflect.ValueOf(collection) result := make([]string, s.Len()) diff --git a/persistence/persistence_suite_test.go b/persistence/persistence_suite_test.go index 586ae5f5c..534554a0e 100644 --- a/persistence/persistence_suite_test.go +++ b/persistence/persistence_suite_test.go @@ -3,12 +3,46 @@ package persistence import ( "testing" + "github.com/cloudsonic/sonic-server/conf" + "github.com/cloudsonic/sonic-server/domain" + "github.com/cloudsonic/sonic-server/log" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) func TestPersistence(t *testing.T) { - //log.SetLevel(log.LevelCritical) + log.SetLevel(log.LevelCritical) RegisterFailHandler(Fail) - RunSpecs(t, "Common Persistence Suite") + RunSpecs(t, "Persistence Suite") } + +var testAlbums = domain.Albums{ + {ID: "1", Name: "Sgt Peppers", Artist: "The Beatles", ArtistID: "1"}, + {ID: "2", Name: "Abbey Road", Artist: "The Beatles", ArtistID: "1"}, + {ID: "3", Name: "Radioactivity", Artist: "Kraftwerk", ArtistID: "2", Starred: true}, +} +var testArtists = domain.Artists{ + {ID: "1", Name: "Saara Saara", AlbumCount: 2}, + {ID: "2", Name: "Kraftwerk"}, + {ID: "3", Name: "The Beatles"}, +} + +var _ = Describe("Initialize test DB", func() { + BeforeSuite(func() { + //conf.Sonic.DbPath, _ = ioutil.TempDir("", "cloudsonic_tests") + //os.MkdirAll(conf.Sonic.DbPath, 0700) + conf.Sonic.DbPath = ":memory:" + Db() + artistRepo := NewArtistRepository() + for _, a := range testArtists { + artistRepo.Put(&a) + } + albumRepository := NewAlbumRepository() + for _, a := range testAlbums { + err := albumRepository.Put(&a) + if err != nil { + panic(err) + } + } + }) +}) diff --git a/persistence/db_sql/playlist_repository.go b/persistence/playlist_repository.go similarity index 89% rename from persistence/db_sql/playlist_repository.go rename to persistence/playlist_repository.go index 06f3b68d2..798c1d011 100644 --- a/persistence/db_sql/playlist_repository.go +++ b/persistence/playlist_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "strings" @@ -30,7 +30,7 @@ func NewPlaylistRepository() domain.PlaylistRepository { func (r *playlistRepository) Put(p *domain.Playlist) error { tp := r.fromDomain(p) - return WithTx(func(o orm.Ormer) error { + return withTx(func(o orm.Ormer) error { return r.put(o, p.ID, &tp) }) } @@ -66,8 +66,11 @@ func (r *playlistRepository) toPlaylists(all []Playlist) (domain.Playlists, erro } func (r *playlistRepository) PurgeInactive(activeList domain.Playlists) ([]string, error) { - return r.purgeInactive(activeList, func(item interface{}) string { - return item.(domain.Playlist).ID + return nil, withTx(func(o orm.Ormer) error { + _, err := r.purgeInactive(o, activeList, func(item interface{}) string { + return item.(domain.Playlist).ID + }) + return err }) } diff --git a/persistence/db_sql/property_repository.go b/persistence/property_repository.go similarity index 98% rename from persistence/db_sql/property_repository.go rename to persistence/property_repository.go index 64af618e4..9eb47475b 100644 --- a/persistence/db_sql/property_repository.go +++ b/persistence/property_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/astaxie/beego/orm" diff --git a/persistence/db_sql/property_repository_test.go b/persistence/property_repository_test.go similarity index 97% rename from persistence/db_sql/property_repository_test.go rename to persistence/property_repository_test.go index d0850caf2..8c3eb711b 100644 --- a/persistence/db_sql/property_repository_test.go +++ b/persistence/property_repository_test.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "github.com/cloudsonic/sonic-server/domain" diff --git a/persistence/db_sql/sql_searcher.go b/persistence/searchable_repository.go similarity index 56% rename from persistence/db_sql/sql_searcher.go rename to persistence/searchable_repository.go index cc03ca8a9..6e6bc6a72 100644 --- a/persistence/db_sql/sql_searcher.go +++ b/persistence/searchable_repository.go @@ -1,4 +1,4 @@ -package db_sql +package persistence import ( "strings" @@ -15,9 +15,45 @@ type Search struct { FullText string `orm:"type(text)"` } -type sqlSearcher struct{} +type searchableRepository struct { + sqlRepository +} -func (s *sqlSearcher) Index(o orm.Ormer, table, id, text string) error { +func (r *searchableRepository) DeleteAll() error { + return withTx(func(o orm.Ormer) error { + _, err := r.newQuery(Db()).Filter("id__isnull", false).Delete() + if err != nil { + return err + } + return r.removeAllFromIndex(o, r.tableName) + }) +} + +func (r *searchableRepository) put(o orm.Ormer, id string, textToIndex string, a interface{}) error { + c, err := r.newQuery(o).Filter("id", id).Count() + if err != nil { + return err + } + if c == 0 { + _, err = o.Insert(a) + } else { + _, err = o.Update(a) + } + if err != nil { + return err + } + return r.addToIndex(o, r.tableName, id, textToIndex) +} + +func (r *searchableRepository) purgeInactive(o orm.Ormer, activeList interface{}, getId func(item interface{}) string) ([]string, error) { + idsToDelete, err := r.sqlRepository.purgeInactive(o, activeList, getId) + if err != nil { + return nil, err + } + return idsToDelete, r.removeFromIndex(o, r.tableName, idsToDelete) +} + +func (r *searchableRepository) addToIndex(o orm.Ormer, table, id, text string) error { item := Search{ID: id, Table: table} err := o.Read(&item) if err != nil && err != orm.ErrNoRows { @@ -33,7 +69,7 @@ func (s *sqlSearcher) Index(o orm.Ormer, table, id, text string) error { return err } -func (s *sqlSearcher) Remove(o orm.Ormer, table string, ids []string) error { +func (r *searchableRepository) removeFromIndex(o orm.Ormer, table string, ids []string) error { var offset int for { var subset = paginateSlice(ids, offset, batchSize) @@ -50,12 +86,12 @@ func (s *sqlSearcher) Remove(o orm.Ormer, table string, ids []string) error { return nil } -func (s *sqlSearcher) DeleteAll(o orm.Ormer, table string) error { +func (r *searchableRepository) removeAllFromIndex(o orm.Ormer, table string) error { _, err := o.QueryTable(&Search{}).Filter("table", table).Delete() return err } -func (s *sqlSearcher) Search(table string, q string, offset, size int, results interface{}, orderBys ...string) error { +func (r *searchableRepository) doSearch(table string, q string, offset, size int, results interface{}, orderBys ...string) error { q = strings.TrimSpace(sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))) if len(q) <= 2 { return nil diff --git a/persistence/db_sql/sql.go b/persistence/sql.go similarity index 84% rename from persistence/db_sql/sql.go rename to persistence/sql.go index 70967281a..8fa30a6f0 100644 --- a/persistence/db_sql/sql.go +++ b/persistence/sql.go @@ -1,8 +1,6 @@ -package db_sql +package persistence import ( - "os" - "path" "sync" "github.com/astaxie/beego/orm" @@ -20,12 +18,6 @@ func Db() orm.Ormer { dbPath := conf.Sonic.DbPath if dbPath == ":memory:" { dbPath = "file::memory:?cache=shared" - } else { - err := os.MkdirAll(conf.Sonic.DbPath, 0700) - if err != nil { - panic(err) - } - dbPath = path.Join(conf.Sonic.DbPath, "sqlite.db") } err := initORM(dbPath) if err != nil { @@ -36,7 +28,7 @@ func Db() orm.Ormer { return orm.NewOrm() } -func WithTx(block func(orm.Ormer) error) error { +func withTx(block func(orm.Ormer) error) error { o := orm.NewOrm() err := o.Begin() if err != nil { diff --git a/persistence/db_sql/sql_repository.go b/persistence/sql_repository.go similarity index 71% rename from persistence/db_sql/sql_repository.go rename to persistence/sql_repository.go index dabef1fea..fdebed357 100644 --- a/persistence/db_sql/sql_repository.go +++ b/persistence/sql_repository.go @@ -1,15 +1,13 @@ -package db_sql +package persistence import ( "github.com/astaxie/beego/orm" "github.com/cloudsonic/sonic-server/domain" "github.com/cloudsonic/sonic-server/log" - "github.com/cloudsonic/sonic-server/persistence" ) type sqlRepository struct { tableName string - searcher sqlSearcher } func (r *sqlRepository) newQuery(o orm.Ormer, options ...domain.QueryOptions) orm.QuerySeter { @@ -49,7 +47,7 @@ func (r *sqlRepository) GetAllIds() ([]string, error) { return nil, err } - result := persistence.CollectValue(values, func(item interface{}) string { + result := collectField(values, func(item interface{}) string { return item.(orm.Params)["ID"].(string) }) @@ -103,42 +101,36 @@ func difference(slice1 []string, slice2 []string) []string { } func (r *sqlRepository) DeleteAll() error { - return WithTx(func(o orm.Ormer) error { + return withTx(func(o orm.Ormer) error { _, err := r.newQuery(Db()).Filter("id__isnull", false).Delete() - if err != nil { - return err - } - return r.searcher.DeleteAll(o, r.tableName) + return err }) } -func (r *sqlRepository) purgeInactive(activeList interface{}, getId func(item interface{}) string) ([]string, error) { +func (r *sqlRepository) purgeInactive(o orm.Ormer, activeList interface{}, getId func(item interface{}) string) ([]string, error) { allIds, err := r.GetAllIds() if err != nil { return nil, err } - activeIds := persistence.CollectValue(activeList, getId) + activeIds := collectField(activeList, getId) idsToDelete := difference(allIds, activeIds) if len(idsToDelete) == 0 { return nil, nil } log.Debug("Purging inactive records", "table", r.tableName, "total", len(idsToDelete)) - err = WithTx(func(o orm.Ormer) error { - var offset int - for { - var subset = paginateSlice(idsToDelete, offset, batchSize) - if len(subset) == 0 { - break - } - log.Trace("-- Purging inactive records", "table", r.tableName, "num", len(subset), "from", offset) - offset += len(subset) - _, err := r.newQuery(o).Filter("id__in", subset).Delete() - if err != nil { - return err - } + var offset int + for { + var subset = paginateSlice(idsToDelete, offset, batchSize) + if len(subset) == 0 { + break } - return r.searcher.Remove(o, r.tableName, idsToDelete) - }) - return idsToDelete, err + log.Trace("-- Purging inactive records", "table", r.tableName, "num", len(subset), "from", offset) + offset += len(subset) + _, err := r.newQuery(o).Filter("id__in", subset).Delete() + if err != nil { + return nil, err + } + } + return idsToDelete, nil } diff --git a/persistence/db_sql/wire_provider.go b/persistence/wire_provider.go similarity index 54% rename from persistence/db_sql/wire_provider.go rename to persistence/wire_provider.go index c0bce6391..51f49bf6c 100644 --- a/persistence/db_sql/wire_provider.go +++ b/persistence/wire_provider.go @@ -1,7 +1,6 @@ -package db_sql +package persistence import ( - "github.com/cloudsonic/sonic-server/persistence" "github.com/google/wire" ) @@ -13,7 +12,6 @@ var Set = wire.NewSet( NewCheckSumRepository, NewPropertyRepository, NewPlaylistRepository, - persistence.NewNowPlayingRepository, - persistence.NewMediaFolderRepository, - wire.Value(persistence.ProviderIdentifier("sql")), + NewNowPlayingRepository, + NewMediaFolderRepository, ) diff --git a/scanner/importer.go b/scanner/importer.go index ee63f2919..a3669b059 100644 --- a/scanner/importer.go +++ b/scanner/importer.go @@ -134,13 +134,13 @@ func (i *Importer) importLibrary() (err error) { i.importArtistIndex() log.Debug("Purging old data") - if _, err := i.mfRepo.PurgeInactive(mfs); err != nil { + if err := i.mfRepo.PurgeInactive(mfs); err != nil { log.Error(err) } - if _, err := i.albumRepo.PurgeInactive(als); err != nil { + if err := i.albumRepo.PurgeInactive(als); err != nil { log.Error(err) } - if _, err := i.artistRepo.PurgeInactive(ars); err != nil { + if err := i.artistRepo.PurgeInactive(ars); err != nil { log.Error("Deleting inactive artists", err) } if _, err := i.plsRepo.PurgeInactive(pls); err != nil { diff --git a/wire_gen.go b/wire_gen.go index d0b0e9f67..14f9ce03c 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -11,7 +11,6 @@ import ( "github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/itunesbridge" "github.com/cloudsonic/sonic-server/persistence" - "github.com/cloudsonic/sonic-server/persistence/db_sql" "github.com/cloudsonic/sonic-server/scanner" "github.com/cloudsonic/sonic-server/server" "github.com/google/wire" @@ -57,15 +56,15 @@ func CreateSubsonicAPIRouter() *api.Router { } func createPersistenceProvider() *Provider { - albumRepository := db_sql.NewAlbumRepository() - artistRepository := db_sql.NewArtistRepository() - checkSumRepository := db_sql.NewCheckSumRepository() - artistIndexRepository := db_sql.NewArtistIndexRepository() - mediaFileRepository := db_sql.NewMediaFileRepository() + albumRepository := persistence.NewAlbumRepository() + artistRepository := persistence.NewArtistRepository() + checkSumRepository := persistence.NewCheckSumRepository() + artistIndexRepository := persistence.NewArtistIndexRepository() + mediaFileRepository := persistence.NewMediaFileRepository() mediaFolderRepository := persistence.NewMediaFolderRepository() nowPlayingRepository := persistence.NewNowPlayingRepository() - playlistRepository := db_sql.NewPlaylistRepository() - propertyRepository := db_sql.NewPropertyRepository() + playlistRepository := persistence.NewPlaylistRepository() + propertyRepository := persistence.NewPropertyRepository() provider := &Provider{ AlbumRepository: albumRepository, ArtistRepository: artistRepository, diff --git a/wire_injectors.go b/wire_injectors.go index a1b8e6df2..e19c7c471 100644 --- a/wire_injectors.go +++ b/wire_injectors.go @@ -7,7 +7,7 @@ import ( "github.com/cloudsonic/sonic-server/domain" "github.com/cloudsonic/sonic-server/engine" "github.com/cloudsonic/sonic-server/itunesbridge" - "github.com/cloudsonic/sonic-server/persistence/db_sql" + "github.com/cloudsonic/sonic-server/persistence" "github.com/cloudsonic/sonic-server/scanner" "github.com/cloudsonic/sonic-server/server" "github.com/google/wire" @@ -51,7 +51,7 @@ func CreateSubsonicAPIRouter() *api.Router { // to conditionally select which function to use func createPersistenceProvider() *Provider { panic(wire.Build( - db_sql.Set, + persistence.Set, wire.Struct(new(Provider), "*"), )) }