110 lines
3.1 KiB
Markdown
110 lines
3.1 KiB
Markdown
# Infrastructure
|
||
|
||
## MySQL Container
|
||
|
||
The MySQL 8.4 OLTP database runs in Docker (or Podman) for easy setup and teardown without requiring a local MySQL installation.
|
||
|
||
### Starting and stopping
|
||
|
||
**Linux (Docker):**
|
||
```bash
|
||
./docker/start.sh # start
|
||
./docker/stop.sh # stop (data is preserved)
|
||
```
|
||
|
||
**Linux (Podman):**
|
||
```bash
|
||
./docker/start.sh --podman
|
||
./docker/stop.sh --podman
|
||
```
|
||
|
||
**Windows (PowerShell):**
|
||
```powershell
|
||
./docker/start.ps1
|
||
./docker/stop.ps1
|
||
```
|
||
|
||
### Connection details
|
||
|
||
| Property | Value |
|
||
|---|---|
|
||
| Host | 127.0.0.1 |
|
||
| Port | **13306** (non-standard to avoid conflicts with any local MySQL) |
|
||
| Database | ewc2025 |
|
||
| User | root |
|
||
| Password | ewc2025root |
|
||
|
||
### What happens on first start
|
||
|
||
When the container is created for the first time, MySQL automatically executes any `.sql` files found in `/docker-entrypoint-initdb.d/`. The start script mounts `sql/schema.sql` there, so the database schema is created automatically — you do not need to run the DDL manually.
|
||
|
||
### Data persistence
|
||
|
||
Container data is stored in a named Docker/Podman volume (`ewc2025-mysql-data`). Stopping and restarting the container does not lose any data.
|
||
|
||
To fully reset the database (drop all data and re-create from scratch):
|
||
```bash
|
||
docker rm ewc2025-mysql
|
||
docker volume rm ewc2025-mysql-data
|
||
./docker/start.sh # fresh container, empty schema
|
||
dotnet run ./scripts/seed.cs
|
||
```
|
||
|
||
---
|
||
|
||
## Seed Script
|
||
|
||
The seed script (`scripts/seed.cs`) is a single-file **.NET 10 C# script** — no project file or solution needed.
|
||
|
||
### Requirements
|
||
|
||
- .NET 10 SDK installed
|
||
- MySQL container running
|
||
|
||
### Running it
|
||
|
||
```bash
|
||
dotnet run ./scripts/seed.cs
|
||
```
|
||
|
||
The script can be run from any directory — it walks up the directory tree to find the `data/` folder automatically.
|
||
|
||
### What it does
|
||
|
||
Reads all 10 CSV files and inserts data into MySQL in this order:
|
||
|
||
1. `game` — deduplicates game names from file 01
|
||
2. `country` — from file 08; additional countries auto-inserted as encountered
|
||
3. `point_system` — from file 09
|
||
4. `prize_pool_category` — from file 06
|
||
5. `organization` — collects all org names across files 02–05, 10; enriches with file 04 details
|
||
6. `tournament` — from file 01
|
||
7. `schedule` — from file 07; matched to tournaments by game name + start date
|
||
8. `player` — from file 05
|
||
9. `medalist` — from file 02
|
||
10. `match_result` — from file 10
|
||
11. `club_championship_standing` — from file 03
|
||
12. `organization_game_competing` — from file 04 (multi-value column split)
|
||
13. `organization_game_won` — from file 03 (multi-value column split)
|
||
|
||
Expected output on a clean database:
|
||
```
|
||
Connected to MySQL.
|
||
[1/13] game
|
||
[2/13] country
|
||
...
|
||
[13/13] organization_game_won
|
||
Done. Database seeded.
|
||
```
|
||
|
||
A `WARN:` line is printed for `Battlegrounds Mobile India` (not an EWC 2025 tournament — expected and harmless).
|
||
|
||
### NuGet packages used
|
||
|
||
| Package | Purpose |
|
||
|---|---|
|
||
| `MySqlConnector 2.3.7` | MySQL database driver |
|
||
| `CsvHelper 33.0.1` | CSV parsing (handles quoted fields with commas) |
|
||
|
||
These are declared at the top of the script with `#:package` directives and restored automatically by `dotnet run`.
|