From 6020624ed9ccd5f4e1201daf6fcd7a4d977c17d3 Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Wed, 29 Jan 2025 16:35:05 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ database.go | 74 +++++++++++++++++++++++++++++++++++++++++++ go.mod | 5 +++ go.sum | 2 ++ main.go | 6 ++++ migrations/1_init.sql | 6 ++++ 6 files changed, 95 insertions(+) create mode 100644 .gitignore create mode 100644 database.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 migrations/1_init.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c38fa4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +*.iml diff --git a/database.go b/database.go new file mode 100644 index 0000000..e00b92a --- /dev/null +++ b/database.go @@ -0,0 +1,74 @@ +package main + +import ( + "database/sql" + "embed" + "fmt" + "github.com/mattn/go-sqlite3" + "log" + "os" +) + +//go:embed migrations/*.sql +var migrations embed.FS + +func openDatabase() *sql.DB { + // Initialize the database connection + db, err := sqlite3.Open("videos.db") + if err != nil { + log.Fatalf("Error opening database: %v\n", err) + } + + // Get current migration version from user_version + var currentVersion int + err = db.QueryRow("PRAGMA user_version").Scan(¤tVersion) + if err != nil { + fmt.Printf("Error getting current version: %v\n", err) + os.Exit(1) + } + + // Read all migrations + migrationFiles, err := migrations.ReadDir(migrationDir) + if err != nil { + fmt.Printf("Error reading migration files: %v\n", err) + os.Exit(1) + } + + // Sort and process each migration file (assuming filenames are versioned like 1.sql, 2.sql, etc.) + for _, f := range migrationFiles { + if !f.IsDir() { + versionStr := f.Name() + version, err := extractVersion(versionStr) + if err != nil { + fmt.Printf("Error extracting version from %s: %v\n", versionStr, err) + continue + } + + if version > currentVersion { + // Apply the migration + sqlContent, err := readMigrationFile(f.Name()) + if err != nil { + fmt.Printf("Error reading migration file %s: %v\n", f.Name(), err) + os.Exit(1) + } + + _, err = db.Exec(sqlContent) + if err != nil { + fmt.Printf("Error applying migration %d: %v\n", version, err) + os.Exit(1) + } + + // Update the user_version + _, err = db.Exec(fmt.Sprintf("PRAGMA user_version=%d", version)) + if err != nil { + fmt.Printf("Error updating user_version to %d: %v\n", version, err) + os.Exit(1) + } + + fmt.Printf("Applied migration %d successfully\n", version) + } + } + } + + fmt.Println("All migrations applied") +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..0baaab7 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module vivaplusdl + +go 1.23 + +require github.com/mattn/go-sqlite3 v1.14.24 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9dcdc9b --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/main.go b/main.go new file mode 100644 index 0000000..ee6e1bd --- /dev/null +++ b/main.go @@ -0,0 +1,6 @@ +package main + +func main() { + db := openDatabase() + defer db.Close() +} diff --git a/migrations/1_init.sql b/migrations/1_init.sql new file mode 100644 index 0000000..3e2b345 --- /dev/null +++ b/migrations/1_init.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS videos ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + title TEXT NOT NULL, + url TEXT NOT NULL UNIQUE, + uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP +);