From 4bc6a23143ef4259699df2103db4ca392c01ba3e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Wed, 9 Jan 2019 21:37:47 +0000 Subject: [PATCH] fix: no db error when db size is 0 (#629) Fixes the error where File Browser would fail when the DB existed with size 0. This closes #628. @1138-4EB I decided not to check the version for now since it's the first time we're adding that info. Only the next time we change the DB structure we'll use that value as reference to know how to upgrade. I did not check it because the users running rc1 would have some issues with it. Former-commit-id: e8b07ab919e9c24feee8f6f2dd6df30df1e2325f [formerly 3396f05b4a1a07e1b993b7c07d1afd2def9cabbb] [formerly b43eb8e400603f99baf7966a58156dec7bd47420 [formerly c1c57c65257ec5b18dbf5ecb47d167cfa9db2c1f]] Former-commit-id: 1115d0cf8a601feafac2b33cb46b813343f4fa8c [formerly 05de6caf8cf747a95fbb10587f0a767dfb8b8774] Former-commit-id: 840c1a278cd45d36ce8538b7c5fe97923be05ca3 --- cmd/utils.go | 34 ++++++++++++++++++++++--------- storage/bolt/bolt.go | 9 ++++++-- storage/bolt/importer/importer.go | 5 ++++- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/cmd/utils.go b/cmd/utils.go index b52fcf5a..0c61bb69 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -62,29 +62,43 @@ type pythonData struct { store *storage.Storage } +func dbExists(path string) (bool, error) { + stat, err := os.Stat(path) + + if os.IsNotExist(err) { + return false, nil + } else if err != nil { + return false, err + } + + if stat.Size() == 0 { + return false, nil + } + + return true, nil +} + func python(fn pythonFunc, cfg pythonConfig) cobraFunc { return func(cmd *cobra.Command, args []string) { data := pythonData{hadDB: true} path := getParam(cmd.Flags(), "database") - _, err := os.Stat(path) + exists, err := dbExists(path) - if os.IsNotExist(err) { - data.hadDB = false - - if !cfg.noDB && !cfg.allowNoDB { - log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.") - } - } else if err != nil { + if err != nil { panic(err) - } else if err == nil && cfg.noDB { + } else if exists && cfg.noDB { log.Fatal(path + " already exists") + } else if !exists && !cfg.noDB && !cfg.allowNoDB { + log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.") } + data.hadDB = exists db, err := storm.Open(path) checkErr(err) defer db.Close() - data.store = bolt.NewStorage(db) + data.store, err = bolt.NewStorage(db) + checkErr(err) fn(cmd, args, data) } } diff --git a/storage/bolt/bolt.go b/storage/bolt/bolt.go index 41e2e191..2b2dac92 100644 --- a/storage/bolt/bolt.go +++ b/storage/bolt/bolt.go @@ -10,16 +10,21 @@ import ( ) // NewStorage creates a storage.Storage based on Bolt DB. -func NewStorage(db *storm.DB) *storage.Storage { +func NewStorage(db *storm.DB) (*storage.Storage, error) { users := users.NewStorage(usersBackend{db: db}) share := share.NewStorage(shareBackend{db: db}) settings := settings.NewStorage(settingsBackend{db: db}) auth := auth.NewStorage(authBackend{db: db}, users) + err := save(db, "version", 2) + if err != nil { + return nil, err + } + return &storage.Storage{ Auth: auth, Users: users, Share: share, Settings: settings, - } + }, nil } diff --git a/storage/bolt/importer/importer.go b/storage/bolt/importer/importer.go index 374d0ada..06ae2c1b 100644 --- a/storage/bolt/importer/importer.go +++ b/storage/bolt/importer/importer.go @@ -19,7 +19,10 @@ func Import(oldDB, oldConf, newDB string) error { } defer new.Close() - sto := bolt.NewStorage(new) + sto, err := bolt.NewStorage(new) + if err != nil { + return err + } err = importUsers(old, sto) if err != nil {