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 /control.db Schema munin_control // je Workspace workspaces/.db Schema munin_ws_ // // 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 }