forked from didirus/AstralRinth
82 lines
2.3 KiB
Rust
82 lines
2.3 KiB
Rust
use crate::state::DirectoryInfo;
|
|
use sqlx::sqlite::{
|
|
SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions,
|
|
};
|
|
use sqlx::{Pool, Sqlite};
|
|
use std::str::FromStr;
|
|
use std::time::Duration;
|
|
|
|
pub(crate) async fn connect() -> crate::Result<Pool<Sqlite>> {
|
|
let settings_dir = DirectoryInfo::get_initial_settings_dir().ok_or(
|
|
crate::ErrorKind::FSError(
|
|
"Could not find valid config dir".to_string(),
|
|
),
|
|
)?;
|
|
|
|
if !settings_dir.exists() {
|
|
crate::util::io::create_dir_all(&settings_dir).await?;
|
|
}
|
|
|
|
let uri = format!("sqlite:{}", settings_dir.join("app.db").display());
|
|
|
|
let conn_options = SqliteConnectOptions::from_str(&uri)?
|
|
.busy_timeout(Duration::from_secs(30))
|
|
.journal_mode(SqliteJournalMode::Wal)
|
|
.optimize_on_close(true, None)
|
|
.create_if_missing(true);
|
|
|
|
let pool = SqlitePoolOptions::new()
|
|
.max_connections(100)
|
|
.connect_with(conn_options)
|
|
.await?;
|
|
|
|
fix_migration_20240711194701(&pool).await?; // Patch by AstralRinth - 08.07.2025
|
|
|
|
sqlx::migrate!().run(&pool).await?;
|
|
|
|
if let Err(err) = stale_data_cleanup(&pool).await {
|
|
tracing::warn!(
|
|
"Failed to clean up stale data from state database: {err}"
|
|
);
|
|
}
|
|
|
|
Ok(pool)
|
|
}
|
|
|
|
/// Cleans up data from the database that is no longer referenced, but must be
|
|
/// kept around for a little while to allow users to recover from accidental
|
|
/// deletions.
|
|
async fn stale_data_cleanup(pool: &Pool<Sqlite>) -> crate::Result<()> {
|
|
let mut tx = pool.begin().await?;
|
|
|
|
sqlx::query!(
|
|
"DELETE FROM default_minecraft_capes WHERE minecraft_user_uuid NOT IN (SELECT uuid FROM minecraft_users)"
|
|
)
|
|
.execute(&mut *tx)
|
|
.await?;
|
|
sqlx::query!(
|
|
"DELETE FROM custom_minecraft_skins WHERE minecraft_user_uuid NOT IN (SELECT uuid FROM minecraft_users)"
|
|
)
|
|
.execute(&mut *tx)
|
|
.await?;
|
|
|
|
tx.commit().await?;
|
|
|
|
Ok(())
|
|
}
|
|
/*
|
|
// Patch by AstralRinth - 08.07.2025
|
|
*/
|
|
async fn fix_migration_20240711194701(pool: &Pool<Sqlite>) -> crate::Result<()> {
|
|
sqlx::query(
|
|
r#"
|
|
UPDATE "_sqlx_migrations"
|
|
SET checksum = X'e973512979feac07e415405291eefafc1ef0bd89454958ad66f5452c381db8679c20ffadab55194ecf6ba8ec4ca2db21'
|
|
WHERE version = '20240711194701';
|
|
"#,
|
|
)
|
|
.execute(pool)
|
|
.await?;
|
|
Ok(())
|
|
}
|