diff --git a/cmd/main.go b/cmd/main.go index 8117330..99b0216 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,7 +1,11 @@ package main -import "fmt" +import ( + "fmt" + + "gitea.michaelthomson.dev/mthomson/habits/internal/migrate" +) func main() { - fmt.Println("Hello, world") + migrate.Migrate(); } diff --git a/habits.db b/habits.db new file mode 100644 index 0000000..2d097c6 Binary files /dev/null and b/habits.db differ diff --git a/internal/migrate/migrate.go b/internal/migrate/migrate.go new file mode 100644 index 0000000..a613a30 --- /dev/null +++ b/internal/migrate/migrate.go @@ -0,0 +1,64 @@ +package migrate + +import ( + "database/sql" + "fmt" + "log" + "os" + + _ "github.com/mattn/go-sqlite3" +) + +type Migration struct { + Version int + Name string +} + +func Migrate() { + db, err := sql.Open("sqlite3", "./habits.db") + if err != nil { + log.Fatal("Failed to open db pool") + } + + defer db.Close() + + migrationTableSql := ` + CREATE TABLE IF NOT EXISTS migrations( + version INTEGER PRIMARY KEY, + name VARCHAR(50) + );` + + _, err = db.Exec(migrationTableSql) + if err != nil { + log.Fatal(err) + } + + files, err := os.ReadDir("./migrations") + if err != nil { + log.Fatal("Failed to read migrations directory") + } + + for _, file := range files { + fmt.Printf("Checking file: %s\n", file.Name()) + var migration Migration + row := db.QueryRow("SELECT * FROM migrations WHERE name = ?;", file.Name()) + err = row.Scan(&migration.Version, &migration.Name) + if err == sql.ErrNoRows { + fmt.Printf("Running migration: %s\n", file.Name()) + migrationSql, err := os.ReadFile(fmt.Sprintf("./migrations/%s", file.Name())) + if err != nil { + log.Fatal(err) + } + + _, err = db.Exec(string(migrationSql)) + if err != nil { + log.Fatal(err) + } + + _, err = db.Exec("INSERT INTO migrations(name) VALUES(?);", file.Name()) + if err != nil { + log.Fatal(err) + } + } + } +} diff --git a/migrations/1-init_db.sql b/migrations/1-init_db.sql new file mode 100644 index 0000000..d197aef --- /dev/null +++ b/migrations/1-init_db.sql @@ -0,0 +1,4 @@ +CREATE TABLE todo( + id INT PRIMARY KEY, + name VARCHAR(50) +);