package database import ( "database/sql" "log" "log/slog" "os" _ "modernc.org/sqlite" ) func NewDatabase(dbPath string) (*sql.DB, error) { // Check if the application is running in a test environment if os.Getenv("TEST_ENV") == "true" { dbPath = ":memory:" // Use in-memory database for tests slog.Info("🧪 Running in test environment, using in-memory database") log.Fatal("🧪 Running in test environment, using in-memory database ") } db, err := sql.Open("sqlite", dbPath) if err != nil { return nil, err } createTableSQL := ` CREATE TABLE IF NOT EXISTS project_name ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_name TEXT NOT NULL, port INTEGER NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );` _, err = db.Exec(createTableSQL) if err != nil { return nil, err } return db, nil } func CheckProjectName(db *sql.DB, projectName string) (bool, error) { var exists bool query := `SELECT EXISTS(SELECT 1 FROM project_name WHERE project_name = ? LIMIT 1);` err := db.QueryRow(query, projectName).Scan(&exists) if err != nil && err != sql.ErrNoRows { return false, err } return !exists, nil } func AddProjectName(db *sql.DB, projectName string, port int) error { query := `INSERT INTO project_name (project_name, port) VALUES (?, ?);` _, err := db.Exec(query, projectName, port) if err != nil { return err } return nil } func GetNextPortNumber(db *sql.DB) (int, error) { var maxPortNumber sql.NullInt64 query := `SELECT MAX(port) FROM project_name;` err := db.QueryRow(query).Scan(&maxPortNumber) if err != nil && err != sql.ErrNoRows { return 0, err } if !maxPortNumber.Valid { // No rows in the table, return a default port number return 10000, nil } return int(maxPortNumber.Int64 + 1), nil }