scanner: add more err checks

This commit is contained in:
sentriz
2020-05-01 21:12:01 +01:00
parent f35a589bfd
commit 824048796e
2 changed files with 35 additions and 10 deletions

View File

@@ -108,7 +108,9 @@ func (db *DB) WithTx(cb func(*gorm.DB)) {
cb(tx) cb(tx)
} }
func (db *DB) WithTxChunked(data []int64, cb func(*gorm.DB, []int64)) { type ChunkFunc func(*gorm.DB, []int64) error
func (db *DB) WithTxChunked(data []int64, cb ChunkFunc) error {
// https://sqlite.org/limits.html // https://sqlite.org/limits.html
const size = 999 const size = 999
tx := db.Begin() tx := db.Begin()
@@ -118,6 +120,9 @@ func (db *DB) WithTxChunked(data []int64, cb func(*gorm.DB, []int64)) {
if end > len(data) { if end > len(data) {
end = len(data) end = len(data)
} }
cb(tx, data[i:end]) if err := cb(tx, data[i:end]); err != nil {
return err
}
} }
return nil
} }

View File

@@ -21,6 +21,11 @@ import (
"go.senan.xyz/gonic/server/scanner/tags" "go.senan.xyz/gonic/server/scanner/tags"
) )
var (
ErrStatingItem = errors.New("stating item")
ErrReadingTags = errors.New("reading tags")
)
func durSince(t time.Time) time.Duration { func durSince(t time.Time) time.Duration {
return time.Since(t).Truncate(10 * time.Microsecond) return time.Since(t).Truncate(10 * time.Microsecond)
} }
@@ -86,31 +91,43 @@ func New(musicPath string, db *db.DB) *Scanner {
func (s *Scanner) cleanTracks() (int, error) { func (s *Scanner) cleanTracks() (int, error) {
var previous []int var previous []int
var missing []int64 var missing []int64
s.db.Model(&db.Track{}).Pluck("id", &previous) err := s.db.
Model(&db.Track{}).
Pluck("id", &previous).
Error
if err != nil {
return 0, errors.Wrap(err, "plucking ids")
}
for _, prev := range previous { for _, prev := range previous {
if _, ok := s.seenTracks[prev]; !ok { if _, ok := s.seenTracks[prev]; !ok {
missing = append(missing, int64(prev)) missing = append(missing, int64(prev))
} }
} }
s.db.WithTxChunked(missing, func(tx *gorm.DB, chunk []int64) { err = s.db.WithTxChunked(missing, func(tx *gorm.DB, chunk []int64) error {
tx.Where(chunk).Delete(&db.Track{}) return tx.Where(chunk).Delete(&db.Track{}).Error
}) })
return len(missing), nil return len(missing), err
} }
func (s *Scanner) cleanFolders() (int, error) { func (s *Scanner) cleanFolders() (int, error) {
var previous []int var previous []int
var missing []int64 var missing []int64
s.db.Model(&db.Album{}).Pluck("id", &previous) err := s.db.
Model(&db.Album{}).
Pluck("id", &previous).
Error
if err != nil {
return 0, errors.Wrap(err, "plucking ids")
}
for _, prev := range previous { for _, prev := range previous {
if _, ok := s.seenFolders[prev]; !ok { if _, ok := s.seenFolders[prev]; !ok {
missing = append(missing, int64(prev)) missing = append(missing, int64(prev))
} }
} }
s.db.WithTxChunked(missing, func(tx *gorm.DB, chunk []int64) { err = s.db.WithTxChunked(missing, func(tx *gorm.DB, chunk []int64) error {
tx.Where(chunk).Delete(&db.Album{}) return tx.Where(chunk).Delete(&db.Album{}).Error
}) })
return len(missing), nil return len(missing), err
} }
func (s *Scanner) cleanArtists() (int, error) { func (s *Scanner) cleanArtists() (int, error) {
@@ -153,6 +170,9 @@ func (s *Scanner) Start(opts ScanOptions) error {
PostChildrenCallback: s.callbackPost, PostChildrenCallback: s.callbackPost,
Unsorted: true, Unsorted: true,
FollowSymbolicLinks: true, FollowSymbolicLinks: true,
ErrorCallback: func(s string, err error) godirwalk.ErrorAction {
return
},
}) })
if err != nil { if err != nil {
return errors.Wrap(err, "walking filesystem") return errors.Wrap(err, "walking filesystem")