package main import ( "errors" "os/signal" "syscall" "context" "os" "log/slog" "database/sql" _ "github.com/mattn/go-sqlite3" ) const SQLITE_TABLES string = `` func server(db_path string) error { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) ctx := context.Background() seed_db := false _, err := os.Stat(db_path) if errors.Is(err, os.ErrNotExist) { seed_db = true } else if err != nil { slog.Error("Failed to stat db file", "path", db_path, "error", err) return err } db, err := sql.Open("sqlite3", db_path) if err != nil { slog.Error("Failed to open db file", "path", db_path, "error", err) return err } if seed_db { slog.Info("Seeding database", "path", db_path) tx, err := db.BeginTx(ctx, nil) if err != nil { slog.Error("Failed to start tx for db init", "error", err) return err } _, err = tx.Exec(SQLITE_TABLES) if err != nil { slog.Error("Failed to exec tables for db init", "error", err) return err } err = tx.Commit() if err != nil { slog.Error("Failed to commit tx for db init", "error", err) return err } } slog.Info("Starting server", "path", db_path) run := true for run { select { case <-sigs: run = false } } err = db.Close() if err != nil { slog.Error("Failed to close db", "path", db_path, "error", err) } return nil } func main() { err := server(os.Args[1]) if err != nil { panic(err) } }