diff --git a/packages/app-lib/.sqlx/query-157e08b825d3f3a9325aefd1daf4695cb9c82d67b3b47be219e358ab0bf950d8.json b/packages/app-lib/.sqlx/query-157e08b825d3f3a9325aefd1daf4695cb9c82d67b3b47be219e358ab0bf950d8.json deleted file mode 100644 index e810ccb4443..00000000000 --- a/packages/app-lib/.sqlx/query-157e08b825d3f3a9325aefd1daf4695cb9c82d67b3b47be219e358ab0bf950d8.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT binding.file_id, binding.blob_sha512, binding.materialization_kind FROM store_instance_files binding INNER JOIN instance_files file ON file.id = binding.file_id WHERE file.instance_id = ?", - "describe": { - "columns": [ - { - "name": "file_id", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "blob_sha512", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "materialization_kind", - "ordinal": 2, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "157e08b825d3f3a9325aefd1daf4695cb9c82d67b3b47be219e358ab0bf950d8" -} diff --git a/packages/app-lib/.sqlx/query-4a61be9c9656ac5e0017a64752670625caa1412a520c41351c7d38f94dae7bda.json b/packages/app-lib/.sqlx/query-4a61be9c9656ac5e0017a64752670625caa1412a520c41351c7d38f94dae7bda.json deleted file mode 100644 index d6b3449ac88..00000000000 --- a/packages/app-lib/.sqlx/query-4a61be9c9656ac5e0017a64752670625caa1412a520c41351c7d38f94dae7bda.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT binding.blob_sha512, binding.materialization_kind, file.size FROM store_instance_files binding INNER JOIN instance_files file ON file.id = binding.file_id WHERE file.missing = 0", - "describe": { - "columns": [ - { - "name": "blob_sha512", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "materialization_kind", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "size", - "ordinal": 2, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "4a61be9c9656ac5e0017a64752670625caa1412a520c41351c7d38f94dae7bda" -} diff --git a/packages/app-lib/.sqlx/query-e5b82dcec8a1ecb462ce076c094604d15a37a029ab2eeb358145e0d7e7a28d98.json b/packages/app-lib/.sqlx/query-e5b82dcec8a1ecb462ce076c094604d15a37a029ab2eeb358145e0d7e7a28d98.json deleted file mode 100644 index 1f9568c8afe..00000000000 --- a/packages/app-lib/.sqlx/query-e5b82dcec8a1ecb462ce076c094604d15a37a029ab2eeb358145e0d7e7a28d98.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT file_id, blob_sha512, materialization_kind FROM store_instance_files WHERE file_id = ?", - "describe": { - "columns": [ - { - "name": "file_id", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "blob_sha512", - "ordinal": 1, - "type_info": "Text" - }, - { - "name": "materialization_kind", - "ordinal": 2, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "e5b82dcec8a1ecb462ce076c094604d15a37a029ab2eeb358145e0d7e7a28d98" -} diff --git a/packages/app-lib/.sqlx/query-e78c758eb8e6d1ddebed37fd65b1a823a6eee33e0c3cbac48cb4dc55e6e4d509.json b/packages/app-lib/.sqlx/query-e78c758eb8e6d1ddebed37fd65b1a823a6eee33e0c3cbac48cb4dc55e6e4d509.json deleted file mode 100644 index 6d0f30d597e..00000000000 --- a/packages/app-lib/.sqlx/query-e78c758eb8e6d1ddebed37fd65b1a823a6eee33e0c3cbac48cb4dc55e6e4d509.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT sha512, size, status, modified_as, last_used_at, sources FROM store_blobs", - "describe": { - "columns": [ - { - "name": "sha512", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "size", - "ordinal": 1, - "type_info": "Integer" - }, - { - "name": "status", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "modified_as", - "ordinal": 3, - "type_info": "Integer" - }, - { - "name": "last_used_at", - "ordinal": 4, - "type_info": "Integer" - }, - { - "name": "sources", - "ordinal": 5, - "type_info": "Text" - } - ], - "parameters": { - "Right": 0 - }, - "nullable": [ - false, - false, - false, - false, - false, - false - ] - }, - "hash": "e78c758eb8e6d1ddebed37fd65b1a823a6eee33e0c3cbac48cb4dc55e6e4d509" -} diff --git a/packages/app-lib/src/api/instance/groups.rs b/packages/app-lib/src/api/instance/groups.rs index b4be77ba8c5..1362f7feff0 100644 --- a/packages/app-lib/src/api/instance/groups.rs +++ b/packages/app-lib/src/api/instance/groups.rs @@ -105,7 +105,7 @@ pub async fn set_group_memberships( let updates = normalize_membership_updates(updates)?; let state = State::get().await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let unique_group_ids = updates .iter() .flat_map(|update| update.group_ids.iter()) @@ -173,7 +173,7 @@ pub async fn rename_group( let new_name = validate_group_name(&new_name)?; let state = State::get().await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let instance_ids = sqlx::query_scalar!( " @@ -224,7 +224,7 @@ pub async fn delete_group(id: String) -> crate::Result<()> { } let state = State::get().await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let instance_ids = sqlx::query_scalar!( " SELECT instance_id diff --git a/packages/app-lib/src/api/instance/icon.rs b/packages/app-lib/src/api/instance/icon.rs index 9f56a2a5fae..e9692257d48 100644 --- a/packages/app-lib/src/api/instance/icon.rs +++ b/packages/app-lib/src/api/instance/icon.rs @@ -134,7 +134,7 @@ pub async fn cache_generated_icon( .await?; if add_to_recents { - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::update_recent_instance_icon_config(&config, &mut tx) .await?; tx.commit().await?; diff --git a/packages/app-lib/src/api/instance/screenshot_groups.rs b/packages/app-lib/src/api/instance/screenshot_groups.rs index e4b92166d38..8f29668314c 100644 --- a/packages/app-lib/src/api/instance/screenshot_groups.rs +++ b/packages/app-lib/src/api/instance/screenshot_groups.rs @@ -64,7 +64,7 @@ pub async fn create_screenshot_group( let name = validate_group_name(&name)?; let state = State::get().await?; let id = Uuid::new_v4().to_string(); - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query!( "UPDATE screenshot_groups SET display_order = display_order + 1", @@ -156,7 +156,7 @@ pub async fn set_screenshot_group_memberships( } let state = State::get().await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let group_ids = updates .iter() .filter_map(|update| update.group_id.as_deref()) @@ -199,7 +199,7 @@ pub async fn import_screenshot_groups( } let state = State::get().await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let base_order = sqlx::query_scalar!( "SELECT COALESCE(MAX(display_order) + 1, 0) AS 'display_order!: i64' FROM screenshot_groups", ) diff --git a/packages/app-lib/src/api/instance/screenshots/operations.rs b/packages/app-lib/src/api/instance/screenshots/operations.rs index a0587acf219..d2676cec5e0 100644 --- a/packages/app-lib/src/api/instance/screenshots/operations.rs +++ b/packages/app-lib/src/api/instance/screenshots/operations.rs @@ -430,7 +430,7 @@ pub async fn save_edited_screenshot( let mut source_row = source_row.clone(); source_row.content_hash = content_hash; source_row.file_size = file_size; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; screenshot_rows::update_screenshot(&source_row, &mut tx).await?; tx.commit().await?; } @@ -448,7 +448,7 @@ pub async fn save_edited_screenshot( if copy_group { let result: crate::Result<()> = async { - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; screenshot_rows::copy_group_membership( &source_row.id, &saved.id, @@ -483,7 +483,7 @@ pub async fn save_edited_screenshot( ) })?; if !copy_group { - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; if saved_row.created_at != source_row.created_at { saved_row.created_at = source_row.created_at; screenshot_rows::update_screenshot(&saved_row, &mut tx).await?; diff --git a/packages/app-lib/src/api/instance/screenshots/reconciliation.rs b/packages/app-lib/src/api/instance/screenshots/reconciliation.rs index c77db13884d..f5511ac6050 100644 --- a/packages/app-lib/src/api/instance/screenshots/reconciliation.rs +++ b/packages/app-lib/src/api/instance/screenshots/reconciliation.rs @@ -270,7 +270,7 @@ pub(super) async fn reconcile_source_screenshots( )); } - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for row in unmatched_by_hash.into_values().flatten() { screenshot_rows::delete_screenshot(&row.id, &mut tx).await?; } diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/fullscreen.rs b/packages/app-lib/src/api/instance/synced_options/game_options/fullscreen.rs index d52df69396c..b4d7e3d3351 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/fullscreen.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/fullscreen.rs @@ -73,7 +73,7 @@ pub(crate) async fn update_shared_fullscreen_from_app( let raw_key: Option<&str> = None; let value_codec = "catalog"; let source_game_version: Option<&str> = None; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query!( "\n\t\t\t\tINSERT INTO synced_game_option_values\n\t\t\t\t\t(option_id, kind, raw_key, canonical_type,\n\t\t\t\t\t canonical_value_json, value_codec, seeded, revision, origin,\n\t\t\t\t\t source_game_version, source_instance_id, updated_at)\n\t\t\t\tVALUES (?, ?, ?, ?, ?, ?, 1, ?, 'app_editor', ?, NULL, ?)\n\t\t\t\tON CONFLICT(option_id) DO UPDATE SET\n\t\t\t\t\tkind = excluded.kind, raw_key = excluded.raw_key,\n\t\t\t\t\tcanonical_type = excluded.canonical_type,\n\t\t\t\t\tcanonical_value_json = excluded.canonical_value_json,\n\t\t\t\t\tvalue_codec = excluded.value_codec, seeded = 1,\n\t\t\t\t\trevision = excluded.revision, origin = 'app_editor',\n\t\t\t\t\tsource_game_version = NULL, source_instance_id = NULL,\n\t\t\t\t\tupdated_at = excluded.updated_at\n\t\t\t\t", diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/locales/mod.rs b/packages/app-lib/src/api/instance/synced_options/game_options/locales/mod.rs index d66c81c0f21..acdf72b7e26 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/locales/mod.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/locales/mod.rs @@ -267,7 +267,7 @@ async fn index_installed_sources(state: &State) -> crate::Result<()> { resolver .index_snapshot(state, &snapshot_id, snapshot.clone()) .await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for (id, key) in &keys { let observation = Observation { snapshot: snapshot_id.clone(), diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/read_instance_changes.rs b/packages/app-lib/src/api/instance/synced_options/game_options/read_instance_changes.rs index 3262ac4aa76..d8bbf5a04ff 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/read_instance_changes.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/read_instance_changes.rs @@ -108,7 +108,7 @@ pub(super) async fn read_instance_changes_into_shared_settings( if !updates.is_empty() { let (canonical_revision, _) = load_game_options_sync_state(&state.pool, CATALOG_REVISION).await?; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for (option_id, candidate, revision) in updates { let next_revision = revision.saturating_add(1) as i64; let current_revision = revision as i64; @@ -193,7 +193,7 @@ pub(super) async fn discover_custom_settings( } else { None }; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let game_version = metadata.applied_content_set.game_version.as_str(); for definition in all_supported_settings() { diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/settings_editor.rs b/packages/app-lib/src/api/instance/synced_options/game_options/settings_editor.rs index d782f04f5db..2512c24b773 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/settings_editor.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/settings_editor.rs @@ -376,7 +376,7 @@ pub async fn save_changes( let mut changed = false; let mut fullscreen_value = None; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for (setting, change) in accepted { let resulting_enabled = change.sync_enabled.unwrap_or(setting.sync_enabled); diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/source_selection.rs b/packages/app-lib/src/api/instance/synced_options/game_options/source_selection.rs index b29d9901fe6..b4e1c0f0809 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/source_selection.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/source_selection.rs @@ -43,7 +43,7 @@ pub(in crate::api::instance) async fn initialize_from_source_instance( } else { None }; - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let catalog_revision = CATALOG_REVISION as i64; sqlx::query!( diff --git a/packages/app-lib/src/api/instance/synced_servers/modpack.rs b/packages/app-lib/src/api/instance/synced_servers/modpack.rs index 25d1373dc0e..e748df33eef 100644 --- a/packages/app-lib/src/api/instance/synced_servers/modpack.rs +++ b/packages/app-lib/src/api/instance/synced_servers/modpack.rs @@ -65,7 +65,7 @@ async fn replace_modpack_servers( server.position = local.len() as i64; local.push(server.clone()); } - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; write_local_rows(&mut tx, &metadata.instance.id, &local).await?; let version_id = modpack_version_id(&metadata.link); sqlx::query!( diff --git a/packages/app-lib/src/api/instance/synced_servers/storage.rs b/packages/app-lib/src/api/instance/synced_servers/storage.rs index 38e9a3dc985..4a31acd9e48 100644 --- a/packages/app-lib/src/api/instance/synced_servers/storage.rs +++ b/packages/app-lib/src/api/instance/synced_servers/storage.rs @@ -74,7 +74,7 @@ pub(super) async fn commit_server_state( local: Option<(&str, &[LocalServer])>, state: &State, ) -> crate::Result { - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; let mut canonical_changed = false; if let Some(canonical) = canonical { canonical_changed = write_canonical_rows(&mut tx, canonical).await?; @@ -320,7 +320,7 @@ pub(super) async fn begin_server_checkpoint( source_revision: i64, state: &State, ) -> crate::Result<()> { - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query!( "DELETE FROM instance_server_projection_entries WHERE instance_id = ?", instance_id, diff --git a/packages/app-lib/src/install/recovery.rs b/packages/app-lib/src/install/recovery.rs index 23b2a34eb1c..959ff1081a5 100644 --- a/packages/app-lib/src/install/recovery.rs +++ b/packages/app-lib/src/install/recovery.rs @@ -287,7 +287,7 @@ async fn restore_instance_metadata( state: &State, ) -> crate::Result<()> { let content_set_id = metadata.applied_content_set.id.as_str(); - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::update_instance(&metadata.instance, &mut tx).await?; content_rows::update_content_set(&metadata.applied_content_set, &mut tx) .await?; diff --git a/packages/app-lib/src/install/store.rs b/packages/app-lib/src/install/store.rs index cb006ee4c9a..ade72752169 100644 --- a/packages/app-lib/src/install/store.rs +++ b/packages/app-lib/src/install/store.rs @@ -389,7 +389,7 @@ pub async fn complete_success( let now = Utc::now().timestamp(); let json = serde_json::to_string(state)?; let id_value = id.to_string(); - let mut transaction = app_state.pool.begin().await?; + let mut transaction = app_state.pool.begin_with("BEGIN IMMEDIATE").await?; let job_result = sqlx::query( " diff --git a/packages/app-lib/src/state/content_store/commands/cache.rs b/packages/app-lib/src/state/content_store/commands/cache.rs index 095c5a3a086..e87ac39dc52 100644 --- a/packages/app-lib/src/state/content_store/commands/cache.rs +++ b/packages/app-lib/src/state/content_store/commands/cache.rs @@ -14,7 +14,7 @@ impl ContentStore { stored_files: &[String], ) -> crate::Result<()> { let _lease = self.lease().await; - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; for stored_file in stored_files { catalog::retain(&mut tx, kind, owner, stored_file).await?; } @@ -29,7 +29,7 @@ impl ContentStore { stored_files: &[String], ) -> crate::Result<()> { let _lease = self.lease().await; - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; catalog::release(&mut tx, kind, owner).await?; for stored_file in stored_files { catalog::retain(&mut tx, kind, owner, stored_file).await?; @@ -43,7 +43,7 @@ impl ContentStore { kind: &str, owner: &str, ) -> crate::Result<()> { - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; catalog::release(&mut tx, kind, owner).await?; tx.commit().await?; Ok(()) diff --git a/packages/app-lib/src/state/content_store/commands/file_changes.rs b/packages/app-lib/src/state/content_store/commands/file_changes.rs index 832cdeb7b3e..7b596c5c187 100644 --- a/packages/app-lib/src/state/content_store/commands/file_changes.rs +++ b/packages/app-lib/src/state/content_store/commands/file_changes.rs @@ -226,7 +226,7 @@ impl ContentStore { &self, journal: &FileChangeJournal, ) -> crate::Result<()> { - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; for file_status in [&journal.before, &journal.after].into_iter().flatten() { diff --git a/packages/app-lib/src/state/content_store/commands/instance_files.rs b/packages/app-lib/src/state/content_store/commands/instance_files.rs index 2583f0e48f3..298c7048656 100644 --- a/packages/app-lib/src/state/content_store/commands/instance_files.rs +++ b/packages/app-lib/src/state/content_store/commands/instance_files.rs @@ -167,7 +167,7 @@ impl ContentStore { storage_kind, )); } - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; for (id, stored_file, storage_kind) in restored { catalog::set_file_storage(&mut tx, id, stored_file, storage_kind) .await?; @@ -218,7 +218,7 @@ impl ContentStore { sha512: &str, storage_kind: FileStorageKind, ) -> crate::Result<()> { - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; file.missing = false; content_rows::upsert_instance_file(file, &mut tx).await?; catalog::set_file_storage(&mut tx, &file.id, sha512, storage_kind) diff --git a/packages/app-lib/src/state/content_store/commands/migration.rs b/packages/app-lib/src/state/content_store/commands/migration.rs index a8237150f67..ae8263644f9 100644 --- a/packages/app-lib/src/state/content_store/commands/migration.rs +++ b/packages/app-lib/src/state/content_store/commands/migration.rs @@ -310,7 +310,7 @@ async fn migrate_file_copy( filesystem::sync_directory(parent).await?; let replace_ms = publishing.elapsed().as_millis() as u64; let committing = Instant::now(); - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; catalog::set_file_storage( &mut tx, &file.id, diff --git a/packages/app-lib/src/state/content_store/commands/recovery.rs b/packages/app-lib/src/state/content_store/commands/recovery.rs index 2278cd35ef5..4177888d0e1 100644 --- a/packages/app-lib/src/state/content_store/commands/recovery.rs +++ b/packages/app-lib/src/state/content_store/commands/recovery.rs @@ -49,7 +49,7 @@ impl ContentStore { &self, journal: &FileChangeJournal, ) -> crate::Result<()> { - let mut tx = self.pool.begin().await?; + let mut tx = self.pool.begin_with("BEGIN IMMEDIATE").await?; catalog::finish_file_change(&mut tx, &journal.id).await?; tx.commit().await?; Ok(()) @@ -212,7 +212,8 @@ impl ContentStore { && let Some(binding) = catalog::file_storage(&self.pool, &file.id).await? { - let mut tx = self.pool.begin().await?; + let mut tx = + self.pool.begin_with("BEGIN IMMEDIATE").await?; catalog::set_file_storage( &mut tx, &file.id, diff --git a/packages/app-lib/src/state/db.rs b/packages/app-lib/src/state/db.rs index 86b0ecf41fd..1f2a99f52b1 100644 --- a/packages/app-lib/src/state/db.rs +++ b/packages/app-lib/src/state/db.rs @@ -59,7 +59,6 @@ async fn open_app_db_pool(db_path: &Path) -> crate::Result> { .max_connections(10) .min_connections(1) .idle_timeout(Duration::from_secs(120)) - .max_lifetime(None) .connect_with(conn_options) .await?) } @@ -111,7 +110,7 @@ async fn record_current_app_version(pool: &Pool) -> crate::Result<()> { /// kept around for a little while to allow users to recover from accidental /// deletions. async fn stale_data_cleanup(pool: &Pool) -> crate::Result<()> { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; let has_skin_tables = sqlx::query!( "SELECT COUNT(*) AS \"count!: i64\" FROM sqlite_master WHERE type = 'table' AND name IN ('custom_minecraft_skins', 'minecraft_users')", diff --git a/packages/app-lib/src/state/dirs/move_app_directory.rs b/packages/app-lib/src/state/dirs/move_app_directory.rs index 741867583f4..3d0abc70d89 100644 --- a/packages/app-lib/src/state/dirs/move_app_directory.rs +++ b/packages/app-lib/src/state/dirs/move_app_directory.rs @@ -286,7 +286,7 @@ async fn rewrite_database_paths( .await?, ); } - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; for (_, mut java) in java_versions { java.path = dunce::simplified(&remap(Path::new(&java.path), mappings)) .to_string_lossy() diff --git a/packages/app-lib/src/state/dirs/move_app_directory/managed_content.rs b/packages/app-lib/src/state/dirs/move_app_directory/managed_content.rs index 7b02d8ca0e5..de614371d6a 100644 --- a/packages/app-lib/src/state/dirs/move_app_directory/managed_content.rs +++ b/packages/app-lib/src/state/dirs/move_app_directory/managed_content.rs @@ -191,7 +191,7 @@ pub(super) async fn commit(pool: &SqlitePool) -> crate::Result<()> { return Ok(()); }; let bindings: Vec = serde_json::from_str(&checkpoint)?; - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; for binding in bindings { content_store::set_file_storage( &mut tx, diff --git a/packages/app-lib/src/state/instances/adapters/sqlite/content_rows.rs b/packages/app-lib/src/state/instances/adapters/sqlite/content_rows.rs index 7ae4dc8da3f..c425307de62 100644 --- a/packages/app-lib/src/state/instances/adapters/sqlite/content_rows.rs +++ b/packages/app-lib/src/state/instances/adapters/sqlite/content_rows.rs @@ -780,7 +780,7 @@ pub(crate) async fn restore_instance_content_snapshot( entries: &[ContentEntry], pool: &SqlitePool, ) -> crate::Result<()> { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query( " DELETE FROM instance_content_entries diff --git a/packages/app-lib/src/state/instances/adapters/sqlite/instance_rows.rs b/packages/app-lib/src/state/instances/adapters/sqlite/instance_rows.rs index 3ed9234348b..8fb4c170764 100644 --- a/packages/app-lib/src/state/instances/adapters/sqlite/instance_rows.rs +++ b/packages/app-lib/src/state/instances/adapters/sqlite/instance_rows.rs @@ -790,7 +790,7 @@ pub(crate) async fn update_instance_icon_if_empty( pool: &SqlitePool, ) -> crate::Result { let modified = Utc::now().timestamp(); - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; let result = sqlx::query( " UPDATE instances @@ -1084,7 +1084,7 @@ pub(crate) async fn create_instance_group( name: &str, pool: &SqlitePool, ) -> crate::Result<()> { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query( " @@ -1117,7 +1117,7 @@ pub(crate) async fn set_instance_group_order( group_ids: &[String], pool: &SqlitePool, ) -> crate::Result<()> { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; let existing_group_ids = sqlx::query_scalar::<_, String>( " SELECT id diff --git a/packages/app-lib/src/state/instances/adapters/sqlite/screenshot_rows.rs b/packages/app-lib/src/state/instances/adapters/sqlite/screenshot_rows.rs index dad3684382a..40d4c109721 100644 --- a/packages/app-lib/src/state/instances/adapters/sqlite/screenshot_rows.rs +++ b/packages/app-lib/src/state/instances/adapters/sqlite/screenshot_rows.rs @@ -176,7 +176,7 @@ pub(crate) async fn move_screenshot( target_file_name: &str, pool: &SqlitePool, ) -> crate::Result<()> { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; sqlx::query!( "DELETE FROM screenshots WHERE instance_id = ? AND file_name = ?", target_instance_id, diff --git a/packages/app-lib/src/state/instances/commands/content_mutation.rs b/packages/app-lib/src/state/instances/commands/content_mutation.rs index 8739d082829..fda62f4d6d2 100644 --- a/packages/app-lib/src/state/instances/commands/content_mutation.rs +++ b/packages/app-lib/src/state/instances/commands/content_mutation.rs @@ -624,7 +624,7 @@ impl<'a> InstanceContent<'a> { &self.state.pool, ) .await?; - let mut tx = self.state.pool.begin().await?; + let mut tx = self.state.pool.begin_with("BEGIN IMMEDIATE").await?; let content_scope = match &prepared.change { PreparedChange::Adopt { .. } => None, _ => Some(self.content_scope()?), diff --git a/packages/app-lib/src/state/instances/commands/create_instance.rs b/packages/app-lib/src/state/instances/commands/create_instance.rs index 88ca01ad94e..3fc4dea5b17 100644 --- a/packages/app-lib/src/state/instances/commands/create_instance.rs +++ b/packages/app-lib/src/state/instances/commands/create_instance.rs @@ -96,7 +96,7 @@ pub(crate) async fn create_instance( let launch_overrides = InstanceLaunchOverrides::empty(instance_id.clone()); - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::insert_instance(&instance, &mut tx).await?; instance_rows::insert_default_instance_sync_preferences( &instance_id, diff --git a/packages/app-lib/src/state/instances/commands/edit_instance.rs b/packages/app-lib/src/state/instances/commands/edit_instance.rs index e18302dde6a..471d832e203 100644 --- a/packages/app-lib/src/state/instances/commands/edit_instance.rs +++ b/packages/app-lib/src/state/instances/commands/edit_instance.rs @@ -183,7 +183,7 @@ pub(crate) async fn edit_instance( None => None, }; - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::update_instance(&instance, &mut tx).await?; if let Some(content_set) = content_set.as_mut() { diff --git a/packages/app-lib/src/state/instances/commands/shared_instance.rs b/packages/app-lib/src/state/instances/commands/shared_instance.rs index 7096f057f1b..e601212f8f1 100644 --- a/packages/app-lib/src/state/instances/commands/shared_instance.rs +++ b/packages/app-lib/src/state/instances/commands/shared_instance.rs @@ -24,7 +24,7 @@ pub(crate) async fn attach_shared_instance( let sync_state = shared_sync_state(&content_set_id, &attachment, Some(Utc::now())); - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::set_shared_instance_attachment( instance_id, Some(&attachment), @@ -82,7 +82,7 @@ async fn detach_shared_instance( _ => None, }; - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; instance_rows::set_shared_instance_attachment(instance_id, None, &mut tx) .await?; if quarantine { @@ -131,7 +131,7 @@ pub(crate) async fn set_shared_instance_sync_status( &attachment, Some(Utc::now()), ); - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; content_rows::upsert_content_set_sync_state(&sync_state, &mut tx).await?; tx.commit().await?; @@ -143,7 +143,7 @@ pub(crate) async fn mark_shared_instance_stale( pool: &SqlitePool, ) -> crate::Result<()> { if let Some(sync_state) = stale_sync_state(instance_id, pool).await? { - let mut tx = pool.begin().await?; + let mut tx = pool.begin_with("BEGIN IMMEDIATE").await?; content_rows::upsert_content_set_sync_state(&sync_state, &mut tx) .await?; tx.commit().await?; diff --git a/packages/app-lib/src/state/instances/commands/sync_content_files.rs b/packages/app-lib/src/state/instances/commands/sync_content_files.rs index 742135828e5..f7d54cc4220 100644 --- a/packages/app-lib/src/state/instances/commands/sync_content_files.rs +++ b/packages/app-lib/src/state/instances/commands/sync_content_files.rs @@ -293,7 +293,7 @@ pub(crate) async fn sync_instance_content_files( || previous.relative_path != file.relative_path }) }); - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for file in missing { sqlite::content_rows::set_instance_file_missing( &file.id, true, &mut tx, @@ -368,7 +368,7 @@ pub(super) async fn normalize_legacy_content_files( if renames.is_empty() { return Ok(false); } - let mut tx = state.pool.begin().await?; + let mut tx = state.pool.begin_with("BEGIN IMMEDIATE").await?; for (source, canonical, file_name, enabled) in renames { if let Some(file) = sqlite::content_rows::rename_instance_file( &instance.id, diff --git a/packages/app-lib/src/state/minecraft_skins/mod.rs b/packages/app-lib/src/state/minecraft_skins/mod.rs index 4c869a6c0a1..bb10bd994c5 100644 --- a/packages/app-lib/src/state/minecraft_skins/mod.rs +++ b/packages/app-lib/src/state/minecraft_skins/mod.rs @@ -1,6 +1,7 @@ use std::collections::HashSet; use futures::{Stream, StreamExt, stream}; +use sqlx::SqlitePool; use uuid::{Uuid, fmt::Hyphenated}; use super::MinecraftSkinVariant; @@ -50,12 +51,12 @@ impl CustomMinecraftSkin { variant: MinecraftSkinVariant, cape_id: Option, insert_position: CustomMinecraftSkinInsertPosition, - db: impl sqlx::Acquire<'_, Database = sqlx::Sqlite>, + db: &SqlitePool, ) -> crate::Result<()> { let minecraft_user_id = minecraft_user_id.as_hyphenated(); let cape_id = cape_id.map(|id| id.hyphenated()); - let mut transaction = db.begin().await?; + let mut transaction = db.begin_with("BEGIN IMMEDIATE").await?; let existing_order = sqlx::query_scalar!( "SELECT display_order FROM custom_minecraft_skins WHERE minecraft_user_uuid = ? AND texture_key = ?", @@ -225,10 +226,10 @@ impl CustomMinecraftSkin { pub async fn set_order( minecraft_user_id: Uuid, texture_keys: &[String], - db: impl sqlx::Acquire<'_, Database = sqlx::Sqlite>, + db: &SqlitePool, ) -> crate::Result<()> { let minecraft_user_id = minecraft_user_id.as_hyphenated(); - let mut transaction = db.begin().await?; + let mut transaction = db.begin_with("BEGIN IMMEDIATE").await?; let existing_rows = sqlx::query!( "SELECT texture_key FROM custom_minecraft_skins \