Fix database prepping for windows

This commit is contained in:
Daniel 2019-04-26 11:38:14 +02:00
parent 5908ff3d0b
commit 682264acc5
4 changed files with 28 additions and 15 deletions

View file

@ -4,7 +4,8 @@ import (
"errors"
"fmt"
"os"
"path"
"path/filepath"
"runtime"
)
const (
@ -15,12 +16,12 @@ var (
rootDir string
)
func ensureDirectory(dirPath string) error {
func ensureDirectory(dirPath string, permissions os.FileMode) error {
// open dir
dir, err := os.Open(dirPath)
if err != nil {
if os.IsNotExist(err) {
return os.MkdirAll(dirPath, 0700)
return os.MkdirAll(dirPath, permissions)
}
return err
}
@ -33,9 +34,14 @@ func ensureDirectory(dirPath string) error {
if !fileInfo.IsDir() {
return errors.New("path exists and is not a directory")
}
if fileInfo.Mode().Perm() != 0700 {
return dir.Chmod(0700)
if runtime.GOOS == "windows" {
// TODO
// acl.Chmod(dirPath, permissions)
} else if fileInfo.Mode().Perm() != permissions {
return dir.Chmod(permissions)
}
return nil
}
@ -46,10 +52,10 @@ func GetDatabaseRoot() string {
// getLocation returns the storage location for the given name and type.
func getLocation(name, storageType string) (string, error) {
location := path.Join(rootDir, databasesSubDir, name, storageType)
location := filepath.Join(rootDir, databasesSubDir, name, storageType)
// check location
err := ensureDirectory(location)
err := ensureDirectory(location, 0700)
if err != nil {
return "", fmt.Errorf("location (%s) invalid: %s", location, err)
}

View file

@ -3,7 +3,7 @@ package database
import (
"errors"
"fmt"
"path"
"path/filepath"
"github.com/tevino/abool"
)
@ -28,14 +28,14 @@ func SetLocation(location string) (ok bool) {
func Initialize() error {
if initialized.SetToIf(false, true) {
err := ensureDirectory(rootDir)
err := ensureDirectory(rootDir, 0755)
if err != nil {
return fmt.Errorf("could not create/open database directory (%s): %s", rootDir, err)
}
err = loadRegistry()
if err != nil {
return fmt.Errorf("could not load database registry (%s): %s", path.Join(rootDir, registryFileName), err)
return fmt.Errorf("could not load database registry (%s): %s", filepath.Join(rootDir, registryFileName), err)
}
// start registry writer

View file

@ -11,6 +11,7 @@ import (
"github.com/Safing/portbase/database/query"
"github.com/Safing/portbase/database/record"
"github.com/Safing/portbase/database/storage"
"github.com/Safing/portbase/log"
)
// Badger database made pluggable for portbase.
@ -30,6 +31,12 @@ func NewBadger(name, location string) (storage.Interface, error) {
opts.ValueDir = location
db, err := badger.Open(opts)
if err == badger.ErrTruncateNeeded {
// clean up after crash
log.Warningf("database/storage: truncating corrupted value log of badger database %s: this may cause data loss", name)
opts.Truncate = true
db, err = badger.Open(opts)
}
if err != nil {
return nil, err
}
@ -59,10 +66,10 @@ func (b *Badger) Get(key string) (record.Record, error) {
return nil, err
}
// DO NOT check for this, as we got our own machanism for that.
// if item.IsDeletedOrExpired() {
// return nil, storage.ErrNotFound
// }
// return err if deleted or expired
if item.IsDeletedOrExpired() {
return nil, storage.ErrNotFound
}
data, err := item.ValueCopy(nil)
if err != nil {

View file

@ -101,7 +101,7 @@ func TestBadger(t *testing.T) {
for _ = range it.Next {
cnt++
}
if it.Err != nil {
if it.Err() != nil {
t.Fatal(err)
}
if cnt != 1 {