111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"code_runner/config"
|
|
"database/sql"
|
|
"fmt"
|
|
_ "github.com/lib/pq"
|
|
"log"
|
|
)
|
|
|
|
var (
|
|
postgresDb *sql.DB
|
|
)
|
|
|
|
func main() {
|
|
connStr := config.GetDSN()
|
|
var err error
|
|
postgresDb, err = sql.Open("postgres", connStr)
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect to database: %v", err)
|
|
}
|
|
defer postgresDb.Close()
|
|
|
|
err = postgresDb.Ping()
|
|
if err != nil {
|
|
log.Fatalf("Failed to ping database: %v", err)
|
|
}
|
|
|
|
createLangTableSQL := `
|
|
CREATE TABLE IF NOT EXISTS lang (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(50) NOT NULL UNIQUE
|
|
);`
|
|
|
|
_, err = postgresDb.Exec(createLangTableSQL)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create lang table: %v", err)
|
|
}
|
|
|
|
_, err = postgresDb.Exec(`
|
|
INSERT INTO lang (name)
|
|
VALUES ('Python')
|
|
ON CONFLICT (name) DO NOTHING`)
|
|
if err != nil {
|
|
log.Fatalf("Failed to insert Python language: %v", err)
|
|
}
|
|
|
|
var pythonID int
|
|
err = postgresDb.QueryRow("SELECT id FROM lang WHERE name = 'Python'").Scan(&pythonID)
|
|
if err != nil {
|
|
log.Fatalf("Failed to get Python language ID: %v", err)
|
|
}
|
|
|
|
createTaskTableSQL := `
|
|
CREATE TABLE IF NOT EXISTS task (
|
|
id SERIAL PRIMARY KEY,
|
|
text TEXT NOT NULL,
|
|
id_lang INTEGER REFERENCES lang(id) ON DELETE SET NULL
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS id_task_id_lang ON task(id_lang);
|
|
`
|
|
|
|
_, err = postgresDb.Exec(createTaskTableSQL)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create tasks table: %v", err)
|
|
}
|
|
|
|
createSolutionTableSQL := `
|
|
CREATE TABLE IF NOT EXISTS solution (
|
|
id SERIAL PRIMARY KEY,
|
|
id_task INTEGER NOT NULL REFERENCES task(id) ON DELETE CASCADE,
|
|
id_user INTEGER NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
|
|
code TEXT NOT NULL,
|
|
UNIQUE(id_task, id_user)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS id_solution_id_task ON solution(id_task);
|
|
CREATE INDEX IF NOT EXISTS id_solution_id_user ON solution(id_user);
|
|
`
|
|
|
|
_, err = postgresDb.Exec(createSolutionTableSQL)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create solutions table: %v", err)
|
|
}
|
|
|
|
tasks := []string{
|
|
"найдите сумму чисел от 1 до 10",
|
|
"напишите проверку на палиндром",
|
|
"напишите генератор чисел Фибоначчи до 10 числа",
|
|
"подсчитайте количество гласных в строке",
|
|
"напишите код который переносит строку в массив побуквенно",
|
|
}
|
|
|
|
for _, task := range tasks {
|
|
_, err = postgresDb.Exec(`
|
|
INSERT INTO task (text, id_lang)
|
|
VALUES ($1, $2)`, task, pythonID)
|
|
if err != nil {
|
|
log.Printf("Failed to insert task '%s': %v", task, err)
|
|
continue
|
|
}
|
|
}
|
|
|
|
fmt.Println("- Migration completed successfully")
|
|
fmt.Println("- Created lang, task and solution tables")
|
|
fmt.Println("- Added Python language")
|
|
fmt.Println("- Added 5 Python tasks")
|
|
fmt.Println("- Created solution table with foreign keys to task and user")
|
|
}
|