Add Withdraw function to database controllers

This commit is contained in:
Daniel 2021-11-09 10:09:30 +01:00
parent b50f922fb5
commit 95fbe85ba2
2 changed files with 25 additions and 6 deletions

View file

@ -14,6 +14,7 @@ import (
// A Controller takes care of all the extra database logic. // A Controller takes care of all the extra database logic.
type Controller struct { type Controller struct {
database *Database
storage storage.Interface storage storage.Interface
shadowDelete bool shadowDelete bool
@ -25,8 +26,9 @@ type Controller struct {
} }
// newController creates a new controller for a storage. // newController creates a new controller for a storage.
func newController(storageInt storage.Interface, shadowDelete bool) *Controller { func newController(database *Database, storageInt storage.Interface, shadowDelete bool) *Controller {
return &Controller{ return &Controller{
database: database,
storage: storageInt, storage: storageInt,
shadowDelete: shadowDelete, shadowDelete: shadowDelete,
} }

View file

@ -8,6 +8,8 @@ import (
"github.com/safing/portbase/database/storage" "github.com/safing/portbase/database/storage"
) )
const StorageTypeInjected = "injected"
var ( var (
controllers = make(map[string]*Controller) controllers = make(map[string]*Controller)
controllersLock sync.RWMutex controllersLock sync.RWMutex
@ -39,6 +41,11 @@ func getController(name string) (*Controller, error) {
return nil, fmt.Errorf(`could not start database %s: %s`, name, err) return nil, fmt.Errorf(`could not start database %s: %s`, name, err)
} }
// Check if database is injected.
if registeredDB.StorageType == StorageTypeInjected {
return nil, fmt.Errorf("database storage is not injected")
}
// get location // get location
dbLocation, err := getLocation(name, registeredDB.StorageType) dbLocation, err := getLocation(name, registeredDB.StorageType)
if err != nil { if err != nil {
@ -51,7 +58,7 @@ func getController(name string) (*Controller, error) {
return nil, fmt.Errorf(`could not start database %s (type %s): %s`, name, registeredDB.StorageType, err) return nil, fmt.Errorf(`could not start database %s (type %s): %s`, name, registeredDB.StorageType, err)
} }
controller = newController(storageInt, registeredDB.ShadowDelete) controller = newController(registeredDB, storageInt, registeredDB.ShadowDelete)
controllers[name] = controller controllers[name] = controller
return controller, nil return controller, nil
} }
@ -76,13 +83,23 @@ func InjectDatabase(name string, storageInt storage.Interface) (*Controller, err
// check if database is registered // check if database is registered
registeredDB, ok := registry[name] registeredDB, ok := registry[name]
if !ok { if !ok {
return nil, fmt.Errorf(`database "%s" not registered`, name) return nil, fmt.Errorf("database %q not registered", name)
} }
if registeredDB.StorageType != "injected" { if registeredDB.StorageType != StorageTypeInjected {
return nil, fmt.Errorf(`database not of type "injected"`) return nil, fmt.Errorf("database not of type %q", StorageTypeInjected)
} }
controller := newController(storageInt, false) controller := newController(registeredDB, storageInt, false)
controllers[name] = controller controllers[name] = controller
return controller, nil return controller, nil
} }
// Withdraw withdraws an injected database, but leaves the database registered.
func (c *Controller) Withdraw() {
if c != nil && c.Injected() {
controllersLock.Lock()
defer controllersLock.Unlock()
delete(controllers, c.database.Name)
}
}