Files
sunhpc-go/internal/db/schema.go
2026-02-15 07:18:14 +08:00

85 lines
2.1 KiB
Go

// Package db defines the database schema.
package db
// CurrentSchemaVersion returns the current schema version (for migrations)
func CurrentSchemaVersion() int {
return 1
}
// CreateTableStatements returns a list of CREATE TABLE statements.
func CreateTableStatements() []string {
return []string{
createNodesTable(),
createAttributesTable(),
createNetworksTable(),
createSubnetsTable(),
createSoftwareTable(),
}
}
// DropTableOrder returns table names in reverse dependency order for safe DROP.
func DropTableOrder() []string {
return []string{"software", "attributes", "nodes", "subnets", "networks"}
}
// --- Private DDL Functions ---
func createNodesTable() string {
return `
CREATE TABLE IF NOT EXISTS nodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname TEXT NOT NULL UNIQUE,
ip TEXT,
status TEXT DEFAULT 'active',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
}
func createAttributesTable() string {
return `
CREATE TABLE IF NOT EXISTS attributes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_id INTEGER NOT NULL,
key TEXT NOT NULL,
value TEXT NOT NULL,
FOREIGN KEY(node_id) REFERENCES nodes(id) ON DELETE CASCADE,
UNIQUE(node_id, key)
);`
}
func createNetworksTable() string {
return `
CREATE TABLE IF NOT EXISTS networks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
}
func createSubnetsTable() string {
return `
CREATE TABLE IF NOT EXISTS subnets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
network_id INTEGER NOT NULL,
cidr TEXT NOT NULL,
gateway TEXT,
vlan INTEGER,
FOREIGN KEY(network_id) REFERENCES networks(id) ON DELETE CASCADE,
UNIQUE(network_id, cidr)
);`
}
func createSoftwareTable() string {
return `
CREATE TABLE IF NOT EXISTS software (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
version TEXT NOT NULL,
installed_on INTEGER,
FOREIGN KEY(installed_on) REFERENCES nodes(id) ON DELETE SET NULL,
UNIQUE(name, version, installed_on)
);`
}