79 lines
3.1 KiB
Go
79 lines
3.1 KiB
Go
package store
|
|
|
|
import "context"
|
|
|
|
// Speicher entscheidet, WO die Daten liegen: in SQLite-Dateien oder in einer
|
|
// PostgreSQL-Datenbank (AUSBAUSTUFEN.md 4.10).
|
|
//
|
|
// main.go wählt beim Start anhand von DB_DRIVER genau einen Speicher aus und
|
|
// reicht ihn weiter. Alles danach — ControlStore, Store, Suchindex, Handler —
|
|
// weiß nicht und muss nicht wissen, welcher es ist.
|
|
//
|
|
// # Wie die beiden Speicher die Daten aufteilen
|
|
//
|
|
// SQLite PostgreSQL
|
|
// Kontroll-Datenbank <DATA_DIR>/control.db Schema munin_control
|
|
// je Workspace workspaces/<id>.db Schema munin_ws_<id>
|
|
//
|
|
// In beiden Fällen bekommt jeder Workspace seinen eigenen, abgeschotteten
|
|
// Bereich mit denselben Tabellen.
|
|
// Kapazitaet beschreibt, wie viele Datenbankverbindungen Munin belegen darf.
|
|
// Die Rechnung dahinter steht bei PruefeKapazitaet (speicher_postgres.go).
|
|
type Kapazitaet struct {
|
|
Begrenzt bool // false: keine gemeinsame Grenze (SQLite)
|
|
Erlaubt int // max_connections des Servers
|
|
Reserve int // bleibt frei für psql, pg_dump, Superuser
|
|
JeWorkspace int // so viele belegt ein geöffneter Workspace höchstens
|
|
Fest int // Kontroll-Datenbank und Verwaltungsverbindung
|
|
}
|
|
|
|
// MaxWorkspaces ist die Zahl der Workspaces, die mit dieser Grenze höchstens
|
|
// gleichzeitig geöffnet sein können.
|
|
func (k Kapazitaet) MaxWorkspaces() int {
|
|
if !k.Begrenzt || k.JeWorkspace == 0 {
|
|
return 0
|
|
}
|
|
return (k.Erlaubt - k.Reserve - k.Fest) / k.JeWorkspace
|
|
}
|
|
|
|
type Speicher interface {
|
|
// OpenControl öffnet die Kontroll-Datenbank und bringt ihr Schema auf den
|
|
// aktuellen Stand.
|
|
OpenControl() (*ControlStore, error)
|
|
|
|
// OpenWorkspace öffnet den Bereich eines Workspace. Gibt es ihn noch
|
|
// nicht, wird er angelegt.
|
|
OpenWorkspace(workspaceID string) (*Store, error)
|
|
|
|
// DeleteWorkspace entfernt den Bereich eines Workspace unwiderruflich.
|
|
// Der Store dazu muss vorher geschlossen sein (siehe workspace.Manager).
|
|
DeleteWorkspace(workspaceID string) error
|
|
|
|
// PruefeKapazitaet meldet einen Fehler, wenn anzahl Workspaces mehr
|
|
// Verbindungen bräuchten, als die Datenbank erlaubt. Bei SQLite gibt es
|
|
// diese Grenze nicht.
|
|
PruefeKapazitaet(ctx context.Context, anzahl int) error
|
|
|
|
// Kapazitaet beschreibt die Grenze der Datenbankverbindungen — für die
|
|
// Systemseite. Bei SQLite gibt es keine (Begrenzt = false).
|
|
Kapazitaet(ctx context.Context) (Kapazitaet, error)
|
|
|
|
// Ort nennt, wo die Daten eines Workspace liegen: den Schemanamen
|
|
// (PostgreSQL) bzw. die Datei (SQLite). Für die Workspace-Übersicht des
|
|
// Plattform-Admins, damit sich ein Workspace in der Datenbank wiederfinden
|
|
// lässt.
|
|
Ort(workspaceID string) string
|
|
|
|
// Hinweise nennt Auffälligkeiten des Speichers, die den Betrieb nicht
|
|
// verhindern, aber behoben werden sollten — für die Systemseite. Leer,
|
|
// wenn alles in Ordnung ist.
|
|
Hinweise() []string
|
|
|
|
// Beschreibung sagt für das Startprotokoll, wo die Daten liegen — ohne
|
|
// Passwort.
|
|
Beschreibung() string
|
|
|
|
// Close gibt alles frei, was der Speicher selbst offen hält (nicht die
|
|
// geöffneten Stores — die schließt ihr jeweiliger Besitzer).
|
|
Close() error
|
|
}
|