mirror of
https://github.com/safing/portbase
synced 2025-09-01 18:19:57 +00:00
Add Withdraw function to database controllers
This commit is contained in:
parent
b50f922fb5
commit
95fbe85ba2
2 changed files with 25 additions and 6 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue