diff options
Diffstat (limited to 'database/migrate.go')
| -rw-r--r-- | database/migrate.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/database/migrate.go b/database/migrate.go index 24d47b6..13b2cb1 100644 --- a/database/migrate.go +++ b/database/migrate.go @@ -3,6 +3,7 @@ package database import ( "database/sql" "log" + "strings" _ "github.com/mattn/go-sqlite3" ) @@ -15,6 +16,7 @@ func MigrateUsers(dbConn *sql.DB) (*sql.DB, error) { _, err := dbConn.Exec(`CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, username TEXT NOT NULL, + primary_mac TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP );`) @@ -26,6 +28,46 @@ func MigrateUsers(dbConn *sql.DB) (*sql.DB, error) { return dbConn, err } +// MigrateUserPrimaryMac adds primary_mac to pre-existing users tables. It's +// idempotent: SQLite has no "ADD COLUMN IF NOT EXISTS", so the duplicate-column +// error (column already present, e.g. on a fresh DB) is swallowed. +func MigrateUserPrimaryMac(dbConn *sql.DB) (*sql.DB, error) { + log.Println("migrating users.primary_mac column") + + _, err := dbConn.Exec(`ALTER TABLE users ADD COLUMN primary_mac TEXT;`) + if err != nil && !strings.Contains(err.Error(), "duplicate column name") { + return dbConn, err + } + return dbConn, nil +} + +// MigrateDNSRecords holds the user-editable DNS records served for the LAN zone. +func MigrateDNSRecords(dbConn *sql.DB) (*sql.DB, error) { + log.Println("migrating dns_records table") + + _, err := dbConn.Exec(`CREATE TABLE IF NOT EXISTS dns_records ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + name TEXT NOT NULL, + type TEXT NOT NULL, + content TEXT NOT NULL, + ttl INTEGER NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE + );`) + if err != nil { + return dbConn, err + } + + _, err = dbConn.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_dns_records_name_content_type ON dns_records (name, type, content);`) + if err != nil { + return dbConn, err + } + + _, err = dbConn.Exec(`CREATE INDEX IF NOT EXISTS idx_dns_records_name_type ON dns_records (name, type);`) + return dbConn, err +} + // MigrateMacs maps hardware addresses to users. One user can own many MACs — // that's how a privacy-rotated device "logs back in" to an existing account. func MigrateMacs(dbConn *sql.DB) (*sql.DB, error) { @@ -124,12 +166,14 @@ func Migrate(dbConn *sql.DB) (*sql.DB, error) { migrations := []Migrator{ MigrateUsers, + MigrateUserPrimaryMac, MigrateMacs, MigrateSessions, MigrateChat, MigrateConnections, MigrateMinecraft, MigrateCanvas, + MigrateDNSRecords, } for _, migration := range migrations { |
