saerro/services/tasks/src/migrations.rs

175 lines
4.2 KiB
Rust

use crate::PG;
use sqlx::query;
pub async fn cmd_migrate() {
println!("Migrating database...");
tokio::join!(
migrate_players(),
migrate_classes(),
migrate_vehicles(),
migrate_analytics()
);
}
async fn migrate_players() {
let pool = PG.get().await;
println!("-> Migrating players");
println!("PLAYERS => DROP TABLE IF EXISTS players");
query("DROP TABLE IF EXISTS players")
.execute(pool)
.await
.unwrap();
println!("PLAYERS => CREATE TABLE players");
query(
"CREATE TABLE players (
character_id TEXT NOT NULL,
time TIMESTAMPTZ NOT NULL,
world_id INT NOT NULL,
faction_id INT NOT NULL,
zone_id INT NOT NULL);",
)
.execute(pool)
.await
.unwrap();
println!("PLAYERS => create_hypertable");
query(
"SELECT create_hypertable('players', 'time',
chunk_time_interval => INTERVAL '1 minute', if_not_exists => TRUE);",
)
.execute(pool)
.await
.unwrap();
println!("PLAYERS => add_retention_policy");
query("SELECT add_retention_policy('players', INTERVAL '15 minutes');")
.execute(pool)
.await
.unwrap();
println!("PLAYERS => done!");
}
async fn migrate_classes() {
let pool = PG.get().await;
println!("-> Migrating classes");
println!("CLASSES => DROP TABLE IF EXISTS classes");
query("DROP TABLE IF EXISTS classes")
.execute(pool)
.await
.unwrap();
println!("CLASSES => CREATE TABLE classes");
query(
"CREATE TABLE classes (
character_id TEXT NOT NULL,
time TIMESTAMPTZ NOT NULL,
world_id INT NOT NULL,
faction_id INT NOT NULL,
zone_id INT NOT NULL,
class_id TEXT NOT NULL);",
)
.execute(pool)
.await
.unwrap();
println!("CLASSES => create_hypertable");
query(
"SELECT create_hypertable('classes', 'time',
chunk_time_interval => INTERVAL '1 minute', if_not_exists => TRUE);",
)
.execute(pool)
.await
.unwrap();
println!("CLASSES => add_retention_policy");
query("SELECT add_retention_policy('classes', INTERVAL '15 minutes');")
.execute(pool)
.await
.unwrap();
println!("CLASSES => done!");
}
async fn migrate_vehicles() {
let pool = PG.get().await;
println!("-> Migrating vehicles");
println!("VEHICLES => DROP TABLE IF EXISTS vehicles");
query("DROP TABLE IF EXISTS vehicles")
.execute(pool)
.await
.unwrap();
println!("VEHICLES => CREATE TABLE vehicles");
query(
"CREATE TABLE vehicles (
character_id TEXT NOT NULL,
time TIMESTAMPTZ NOT NULL,
world_id INT NOT NULL,
faction_id INT NOT NULL,
zone_id INT NOT NULL,
vehicle_id TEXT NOT NULL);",
)
.execute(pool)
.await
.unwrap();
println!("VEHICLES => create_hypertable");
query(
"SELECT create_hypertable('vehicles', 'time',
chunk_time_interval => INTERVAL '1 minute', if_not_exists => TRUE);",
)
.execute(pool)
.await
.unwrap();
println!("VEHICLES => add_retention_policy");
query("SELECT add_retention_policy('vehicles', INTERVAL '15 minutes');")
.execute(pool)
.await
.unwrap();
println!("VEHICLES => done!");
}
async fn migrate_analytics() {
let pool = PG.get().await;
println!("-> Migrating analytics");
println!("ANALYTICS => CREATE TABLE IF NOT EXISTS analytics");
query(
"CREATE TABLE IF NOT EXISTS analytics (
time TIMESTAMPTZ NOT NULL,
event_name TEXT NOT NULL,
world_id INT NOT NULL);",
)
.execute(pool)
.await
.unwrap();
println!("ANALYTICS => create_hypertable");
query(
"SELECT create_hypertable('analytics', 'time',
chunk_time_interval => INTERVAL '1 hour', if_not_exists => TRUE);",
)
.execute(pool)
.await
.unwrap();
println!("ANALYTICS => add_retention_policy");
query("SELECT add_retention_policy('analytics', INTERVAL '1 day', if_not_exists => TRUE);")
.execute(pool)
.await
.unwrap();
println!("ANALYTICS => done!");
}