diff --git a/persistence/db_sql/checksum_repository.go b/persistence/db_sql/checksum_repository.go new file mode 100644 index 000000000..321370706 --- /dev/null +++ b/persistence/db_sql/checksum_repository.go @@ -0,0 +1,71 @@ +package db_sql + +import ( + "encoding/json" + + "github.com/astaxie/beego/orm" + "github.com/cloudsonic/sonic-server/log" + "github.com/cloudsonic/sonic-server/scanner" +) + +type checkSumRepository struct { + data map[string]string +} + +const checkSumId = "1" + +type CheckSums struct { + ID string `orm:"pk;column(id)"` + Data string `orm:"type(text)"` +} + +func NewCheckSumRepository() scanner.CheckSumRepository { + r := &checkSumRepository{} + return r +} + +func (r *checkSumRepository) loadData() error { + loadedData := make(map[string]string) + r.data = loadedData + + cks := CheckSums{ID: checkSumId} + err := Db().Read(&cks) + if err == orm.ErrNoRows { + _, err = Db().Insert(&cks) + return err + } + if err != nil { + return err + } + _ = json.Unmarshal([]byte(cks.Data), &loadedData) + log.Debug("Loaded checksums", "total", len(loadedData)) + return err +} + +func (r *checkSumRepository) Get(id string) (string, error) { + if r.data == nil { + err := r.loadData() + if err != nil { + return "", err + } + } + return r.data[id], nil +} + +func (r *checkSumRepository) SetData(newSums map[string]string) error { + data, _ := json.Marshal(&newSums) + cks := CheckSums{ID: checkSumId, Data: string(data)} + var err error + if Db().QueryTable(&CheckSums{}).Filter("id", checkSumId).Exist() { + _, err = Db().Update(&cks) + } else { + _, err = Db().Insert(&cks) + } + if err != nil { + return err + } + r.data = newSums + return nil +} + +var _ scanner.CheckSumRepository = (*checkSumRepository)(nil) diff --git a/persistence/db_sql/checksum_repository_test.go b/persistence/db_sql/checksum_repository_test.go new file mode 100644 index 000000000..8c97689d5 --- /dev/null +++ b/persistence/db_sql/checksum_repository_test.go @@ -0,0 +1,31 @@ +package db_sql + +import ( + "github.com/cloudsonic/sonic-server/scanner" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("ChecksumRepository", func() { + var repo scanner.CheckSumRepository + + BeforeEach(func() { + Db().Delete(&CheckSums{ID: checkSumId}) + repo = NewCheckSumRepository() + err := repo.SetData(map[string]string{ + "a": "AAA", "b": "BBB", + }) + if err != nil { + panic(err) + } + }) + + It("can retrieve data", func() { + Expect(repo.Get("b")).To(Equal("BBB")) + }) + + It("persists data", func() { + newRepo := NewCheckSumRepository() + Expect(newRepo.Get("b")).To(Equal("BBB")) + }) +}) diff --git a/persistence/db_sql/sql.go b/persistence/db_sql/sql.go index 78978464a..1990331ec 100644 --- a/persistence/db_sql/sql.go +++ b/persistence/db_sql/sql.go @@ -57,6 +57,7 @@ func initORM(dbPath string) error { orm.RegisterModel(new(Artist)) orm.RegisterModel(new(Album)) orm.RegisterModel(new(MediaFile)) + orm.RegisterModel(new(CheckSums)) err := orm.RegisterDataBase("default", "sqlite3", dbPath) if err != nil { panic(err)