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. // Capacity beschreibt, wie viele Datenbankverbindungen Munin belegen darf. // Die Rechnung dahinter steht bei CheckCapacity (backend_postgres.go). type Capacity struct { Limited bool // false: keine gemeinsame Grenze (SQLite) Allowed int // max_connections des Servers Reserve int // bleibt frei für psql, pg_dump, Superuser PerWorkspace int // so viele belegt ein geöffneter Workspace höchstens Fixed 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 Capacity) MaxWorkspaces() int { if !k.Limited || k.PerWorkspace == 0 { return 0 } return (k.Allowed - k.Reserve - k.Fixed) / k.PerWorkspace } type Backend 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 // CheckCapacity meldet einen Fehler, wenn anzahl Workspaces mehr // Verbindungen bräuchten, als die Datenbank erlaubt. Bei SQLite gibt es // diese Grenze nicht. CheckCapacity(ctx context.Context, count int) error // Capacity beschreibt die Grenze der Datenbankverbindungen — für die // Systemseite. Bei SQLite gibt es keine (Begrenzt = false). Capacity(ctx context.Context) (Capacity, error) // Location 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. Location(workspaceID string) string // Hints nennt Auffälligkeiten des Speichers, die den Betrieb nicht // verhindern, aber behoben werden sollten — für die Systemseite. Leer, // wenn alles in Ordnung ist. Hints() []string // Description sagt für das Startprotokoll, wo die Daten liegen — ohne // Passwort. Description() 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 }