From 72a43414fe6b6451d0587ad29d65129b4782a3b7 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Mon, 2 Sep 2024 11:03:10 -0300 Subject: Init Go project skeleton with golite init --- src/liteq.go | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.go | 7 ++++ 2 files changed, 124 insertions(+) create mode 100644 src/liteq.go create mode 100644 src/main.go (limited to 'src') diff --git a/src/liteq.go b/src/liteq.go new file mode 100644 index 0000000..2eeff34 --- /dev/null +++ b/src/liteq.go @@ -0,0 +1,117 @@ +package liteq + +import ( + "database/sql" + "flag" + "io/ioutil" + "log/slog" + "os" + "sort" + + g "gobang" + "golite" +) + + + +func InitMigrations(db *sql.DB) { + _, err := db.Exec(` + CREATE TABLE IF NOT EXISTS migrations ( + filename TEXT PRIMARY KEY + ); + `) + g.FatalIf(err) +} + +const MIGRATIONS_DIR = "src/sql/migrations/" +func PendingMigrations(db *sql.DB) []string { + files, err := ioutil.ReadDir(MIGRATIONS_DIR) + g.FatalIf(err) + + set := make(map[string]bool) + for _, file := range files { + set[file.Name()] = true + } + + rows, err := db.Query(`SELECT filename FROM migrations;`) + g.FatalIf(err) + defer rows.Close() + + for rows.Next() { + var filename string + err := rows.Scan(&filename) + g.FatalIf(err) + delete(set, filename) + } + g.FatalIf(rows.Err()) + + difference := make([]string, 0) + for filename := range set { + difference = append(difference, filename) + } + + sort.Sort(sort.StringSlice(difference)) + return difference +} + +func RunMigrations(db *sql.DB) { + InitMigrations(db) + + stmt, err := db.Prepare(`INSERT INTO migrations (filename) VALUES (?);`) + g.FatalIf(err) + defer stmt.Close() + + for _, filename := range PendingMigrations(db) { + g.Info("Running migration file", "exec-migration-file", + "filename", filename, + ) + + tx, err := db.Begin() + g.FatalIf(err) + + sql, err := os.ReadFile(MIGRATIONS_DIR + filename) + g.FatalIf(err) + + _, err = tx.Exec(string(sql)) + g.FatalIf(err) + + _, err = tx.Stmt(stmt).Exec(filename) + g.FatalIf(err) + + err = tx.Commit() + g.FatalIf(err) + } +} + +func initDB(databasePath string) *sql.DB { + db, err := sql.Open("sqlite3", databasePath) + g.FatalIf(err) + RunMigrations(db) + return db +} + +func run(db *sql.DB) { +} + + + +var ( + databasePath = flag.String( + "f", + "q.db", + "The path to the database file", + ) +) + + +func Main() { + g.Init(slog.Group( + "versions", + "gobang", g.Version, + "golite", golite.Version, + "this", version, + )) + flag.Parse() + db := initDB(*databasePath) + run(db) +} diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..8d9a05e --- /dev/null +++ b/src/main.go @@ -0,0 +1,7 @@ +package main + +import "liteq" + +func main() { + liteq.Main() +} -- cgit v1.2.3