From e89c143ad786eb41790fd3527193e72cebded287 Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Sun, 1 Dec 2019 15:32:51 -0800 Subject: [PATCH] Use default database directory --- cmd/podsync/main.go | 2 +- pkg/config/config.go | 16 ++++++++++++++-- pkg/config/config_test.go | 17 ++++++++++++++--- pkg/storage/badger.go | 13 ++++++++++++- pkg/storage/badger_test.go | 17 +++++++++-------- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/cmd/podsync/main.go b/cmd/podsync/main.go index 00e80cc..38dabcc 100644 --- a/cmd/podsync/main.go +++ b/cmd/podsync/main.go @@ -86,7 +86,7 @@ func main() { log.WithError(err).Fatal("failed to load configuration file") } - db, err := storage.NewBadger(opts.ConfigPath) + db, err := storage.NewBadger(&cfg.Database) if err != nil { log.WithError(err).Fatal("failed to open database") } diff --git a/pkg/config/config.go b/pkg/config/config.go index 5eb2125..1f3c4fb 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "path/filepath" "time" "github.com/BurntSushi/toml" @@ -53,9 +54,16 @@ type Server struct { DataDir string `toml:"data_dir"` } +type Database struct { + // Dir is a directory to keep database files + Dir string `toml:"dir"` +} + type Config struct { // Server is the web server configuration Server Server `toml:"server"` + // Database configuration + Database Database `toml:"database"` // Feeds is a list of feeds to host by this app. // ID will be used as feed ID in http://podsync.net/{FEED_ID}.xml Feeds map[string]*Feed @@ -75,7 +83,7 @@ func LoadConfig(path string) (*Config, error) { feed.ID = id } - config.applyDefaults() + config.applyDefaults(path) if err := config.validate(); err != nil { return nil, err @@ -104,7 +112,7 @@ func (c *Config) validate() error { return result.ErrorOrNil() } -func (c *Config) applyDefaults() { +func (c *Config) applyDefaults(configPath string) { if c.Server.Hostname == "" { if c.Server.Port != 0 && c.Server.Port != 80 { c.Server.Hostname = fmt.Sprintf("http://localhost:%d", c.Server.Port) @@ -113,6 +121,10 @@ func (c *Config) applyDefaults() { } } + if c.Database.Dir == "" { + c.Database.Dir = filepath.Join(filepath.Dir(configPath), "db") + } + for _, feed := range c.Feeds { if feed.UpdatePeriod.Duration == 0 { feed.UpdatePeriod.Duration = model.DefaultUpdatePeriod diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index c6c09e3..c29ce61 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -22,6 +22,9 @@ vimeo = "321" port = 80 data_dir = "test/data/" +[database] +dir = "/home/user/db/" + [feeds] [feeds.XYZ] url = "https://youtube.com/watch?v=ygIUF678y40" @@ -46,6 +49,8 @@ data_dir = "test/data/" assert.Equal(t, "test/data/", config.Server.DataDir) assert.EqualValues(t, 80, config.Server.Port) + assert.Equal(t, "/home/user/db/", config.Database.Dir) + assert.Equal(t, "123", config.Tokens.YouTube) assert.Equal(t, "321", config.Tokens.Vimeo) @@ -96,21 +101,27 @@ func TestDefaultHostname(t *testing.T) { } t.Run("empty hostname", func(t *testing.T) { - cfg.applyDefaults() + cfg.applyDefaults("") assert.Equal(t, "http://localhost", cfg.Server.Hostname) }) t.Run("empty hostname with port", func(t *testing.T) { cfg.Server.Hostname = "" cfg.Server.Port = 7979 - cfg.applyDefaults() + cfg.applyDefaults("") assert.Equal(t, "http://localhost:7979", cfg.Server.Hostname) }) t.Run("skip overwrite", func(t *testing.T) { cfg.Server.Hostname = "https://my.host:4443" cfg.Server.Port = 80 - cfg.applyDefaults() + cfg.applyDefaults("") assert.Equal(t, "https://my.host:4443", cfg.Server.Hostname) }) } + +func TestDefaultDatabasePath(t *testing.T) { + cfg := Config{} + cfg.applyDefaults("/home/user/podsync/config.toml") + assert.Equal(t, "/home/user/podsync/db", cfg.Database.Dir) +} diff --git a/pkg/storage/badger.go b/pkg/storage/badger.go index 6e2f52f..3740ef2 100644 --- a/pkg/storage/badger.go +++ b/pkg/storage/badger.go @@ -4,11 +4,13 @@ import ( "context" "encoding/json" "fmt" + "os" "github.com/dgraph-io/badger" "github.com/pkg/errors" log "github.com/sirupsen/logrus" + "github.com/mxpv/podsync/pkg/config" "github.com/mxpv/podsync/pkg/model" ) @@ -28,9 +30,18 @@ type Badger struct { var _ Storage = (*Badger)(nil) -func NewBadger(dir string) (*Badger, error) { +func NewBadger(config *config.Database) (*Badger, error) { + var ( + dir = config.Dir + ) + log.Infof("opening database %q", dir) + // Make sure database directory exists + if err := os.MkdirAll(dir, 0755); err != nil { + return nil, errors.Wrap(err, "could not mkdir database dir") + } + opts := badger.DefaultOptions(dir) opts.Logger = log.New() diff --git a/pkg/storage/badger_test.go b/pkg/storage/badger_test.go index 774f39f..24e4112 100644 --- a/pkg/storage/badger_test.go +++ b/pkg/storage/badger_test.go @@ -10,6 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/mxpv/podsync/pkg/config" "github.com/mxpv/podsync/pkg/link" "github.com/mxpv/podsync/pkg/model" ) @@ -20,7 +21,7 @@ func TestNewBadger(t *testing.T) { dir, err := ioutil.TempDir("", "podsync-badger-") require.NoError(t, err) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) err = db.Close() @@ -35,7 +36,7 @@ func TestBadger_Version(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -49,7 +50,7 @@ func TestBadger_AddFeed(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -62,7 +63,7 @@ func TestBadger_GetFeed(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -82,7 +83,7 @@ func TestBadger_WalkFeeds(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -108,7 +109,7 @@ func TestBadger_DeleteFeed(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -141,7 +142,7 @@ func TestBadger_WalkFiles(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close() @@ -170,7 +171,7 @@ func TestBadger_UpdateFile(t *testing.T) { assert.NoError(t, err) defer os.RemoveAll(dir) - db, err := NewBadger(dir) + db, err := NewBadger(&config.Database{Dir: dir}) require.NoError(t, err) defer db.Close()