Create sqlite3 db directory

This commit is contained in:
Jannis Mattheis 2018-05-02 19:18:54 +02:00 committed by Jannis Mattheis
parent 79fd6a2512
commit ae89184d76
2 changed files with 54 additions and 0 deletions

View File

@ -1,6 +1,9 @@
package database package database
import ( import (
"os"
"path/filepath"
"github.com/gotify/server/auth/password" "github.com/gotify/server/auth/password"
"github.com/gotify/server/model" "github.com/gotify/server/model"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
@ -11,6 +14,8 @@ import (
// New creates a new wrapper for the gorm database framework. // New creates a new wrapper for the gorm database framework.
func New(dialect, connection, defaultUser, defaultPass string, strength int, createDefaultUser bool) (*GormDatabase, error) { func New(dialect, connection, defaultUser, defaultPass string, strength int, createDefaultUser bool) (*GormDatabase, error) {
createDirectoryIfSqlite(dialect, connection)
db, err := gorm.Open(dialect, connection) db, err := gorm.Open(dialect, connection)
if err != nil { if err != nil {
return nil, err return nil, err
@ -39,6 +44,16 @@ func New(dialect, connection, defaultUser, defaultPass string, strength int, cre
return &GormDatabase{DB: db}, nil return &GormDatabase{DB: db}, nil
} }
func createDirectoryIfSqlite(dialect string, connection string) {
if dialect == "sqlite3" {
if _, err := os.Stat(filepath.Dir(connection)); os.IsNotExist(err) {
if err := os.MkdirAll(filepath.Dir(connection), 0777); err != nil {
panic(err)
}
}
}
}
// GormDatabase is a wrapper for the gorm framework. // GormDatabase is a wrapper for the gorm framework.
type GormDatabase struct { type GormDatabase struct {
DB *gorm.DB DB *gorm.DB

View File

@ -4,6 +4,9 @@ import (
"os" "os"
"testing" "testing"
"errors"
"github.com/bouk/monkey"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )
@ -32,3 +35,39 @@ func TestInvalidDialect(t *testing.T) {
_, err := New("asdf", "testdb.db", "defaultUser", "defaultPass", 5, true) _, err := New("asdf", "testdb.db", "defaultUser", "defaultPass", 5, true)
assert.NotNil(t, err) assert.NotNil(t, err)
} }
func TestCreateSqliteFolder(t *testing.T) {
// ensure path not exists
os.RemoveAll("somepath")
db, err := New("sqlite3", "somepath/testdb.db", "defaultUser", "defaultPass", 5, true)
assert.Nil(t, err)
assert.DirExists(t, "somepath")
db.Close()
assert.Nil(t, os.RemoveAll("somepath"))
}
func TestWithAlreadyExistingSqliteFolder(t *testing.T) {
// ensure path not exists
os.RemoveAll("somepath")
os.MkdirAll("somepath", 0777)
db, err := New("sqlite3", "somepath/testdb.db", "defaultUser", "defaultPass", 5, true)
assert.Nil(t, err)
assert.DirExists(t, "somepath")
db.Close()
assert.Nil(t, os.RemoveAll("somepath"))
}
func TestPanicsOnMkdirError(t *testing.T) {
patch := monkey.Patch(os.MkdirAll, func(string, os.FileMode) error { return errors.New("whoops") })
defer patch.Unpatch()
// ensure path not exists
os.RemoveAll("somepath")
assert.Panics(t, func() {
New("sqlite3", "somepath/testdb.db", "defaultUser", "defaultPass", 5, true)
})
}