diff --git a/packages/app-lib/src/api/instance/synced_options/command_history.rs b/packages/app-lib/src/api/instance/synced_options/command_history.rs index a4ff6c3..19da764 100644 --- a/packages/app-lib/src/api/instance/synced_options/command_history.rs +++ b/packages/app-lib/src/api/instance/synced_options/command_history.rs @@ -2,10 +2,9 @@ use super::COMMAND_HISTORY_FILE; use super::files::{ CheckpointStatus, begin_checkpoint, checkpoint, ensure_link, finish_checkpoint, instance_game_dir, sha1_bytes, sha1_file, + synced_options_path, }; -use super::orchestration::{ - create_synced_directories, option_effective, synced_options_path, -}; +use super::orchestration::{create_synced_directories, option_effective}; use crate::State; use crate::state::{InstanceMetadata, SyncedOption}; use crate::util::io; diff --git a/packages/app-lib/src/api/instance/synced_options/game_options/pack_updates.rs b/packages/app-lib/src/api/instance/synced_options/game_options/pack_updates.rs index 8a5c404..c9672df 100644 --- a/packages/app-lib/src/api/instance/synced_options/game_options/pack_updates.rs +++ b/packages/app-lib/src/api/instance/synced_options/game_options/pack_updates.rs @@ -134,7 +134,7 @@ pub(in crate::api::instance) async fn detach_instance( "DELETE FROM instance_sync_checkpoints WHERE instance_id = ? AND feature = ?", ) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .bind(feature) .execute(&state.pool) .await?; @@ -150,7 +150,7 @@ pub(in crate::api::instance) async fn prepare_instance_update_with_state( sqlx::query( "DELETE FROM instance_game_option_update_state WHERE instance_id = ?", ) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .execute(&state.pool) .await?; if sync_is_active_for_instance(metadata, state).await? { @@ -184,7 +184,7 @@ pub(in crate::api::instance) async fn prepare_instance_update_with_state( had_file = excluded.had_file, sha1 = excluded.sha1, document = excluded.document", ) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .bind(had_file) .bind(sha1) .bind(bytes) 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 9ac39db..0c80bc3 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 @@ -124,10 +124,10 @@ pub(super) async fn read_instance_changes_into_shared_settings( .bind(canonical_type) .bind(value_json) .bind(next_revision) - .bind(metadata.applied_content_set.game_version) - .bind(metadata.instance.id) + .bind(&metadata.applied_content_set.game_version) + .bind(&metadata.instance.id) .bind(now) - .bind(option_id) + .bind(&option_id) .bind(current_revision) .execute(&mut *tx) .await?; @@ -209,7 +209,7 @@ pub(super) async fn discover_custom_settings( ) .bind(revision) .bind(now) - .bind(custom_id) + .bind(&custom_id) .execute(&mut *tx) .await?; sqlx::query( @@ -218,7 +218,7 @@ pub(super) async fn discover_custom_settings( WHERE option_id = ?", ) .bind(revision) - .bind(custom_id) + .bind(&custom_id) .execute(&mut *tx) .await?; discovered = true; @@ -254,7 +254,7 @@ pub(super) async fn discover_custom_settings( .bind(canonical_type) .bind(value_json) .bind(game_version) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .bind(now) .execute(&mut *tx) .await?; @@ -320,12 +320,12 @@ pub(super) async fn discover_custom_settings( source_instance_id = excluded.source_instance_id, updated_at = excluded.updated_at", ) - .bind(option_id) + .bind(&option_id) .bind(key) .bind(value_json) .bind(revision) .bind(game_version) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .bind(now) .execute(&mut *tx) .await?; 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 36b4b8a..e85b865 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 @@ -436,7 +436,7 @@ pub async fn save_changes( source_game_version = NULL, source_instance_id = NULL, updated_at = excluded.updated_at", ) - .bind(setting.option_id) + .bind(&setting.option_id) .bind(kind) .bind(raw_key) .bind(canonical_type) @@ -457,7 +457,7 @@ pub async fn save_changes( ) .bind(revision) .bind(now) - .bind(setting.option_id) + .bind(&setting.option_id) .execute(&mut *tx) .await?; } @@ -471,7 +471,7 @@ pub async fn save_changes( enabled = excluded.enabled, source = 'user', revision = excluded.revision", ) - .bind(setting.option_id) + .bind(&setting.option_id) .bind(enabled) .bind("user") .bind(revision) 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 173f0ed..1d94bf9 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 @@ -100,7 +100,7 @@ pub(in crate::api::instance) async fn initialize_from_source_instance( ) .bind(revision) .bind(now) - .bind(custom_id) + .bind(&custom_id) .execute(&mut *tx) .await?; sqlx::query( @@ -109,7 +109,7 @@ pub(in crate::api::instance) async fn initialize_from_source_instance( WHERE option_id = ?", ) .bind(revision) - .bind(custom_id) + .bind(&custom_id) .execute(&mut *tx) .await?; } @@ -244,7 +244,7 @@ pub(in crate::api::instance) async fn initialize_from_source_instance( source_instance_id = excluded.source_instance_id, updated_at = excluded.updated_at", ) - .bind(option_id) + .bind(&option_id) .bind(key) .bind(value_json) .bind(option_revision) @@ -261,7 +261,7 @@ pub(in crate::api::instance) async fn initialize_from_source_instance( ON CONFLICT(option_id) DO NOTHING ", ) - .bind(option_id) + .bind(&option_id) .bind(option_revision) .execute(&mut *tx) .await?; diff --git a/packages/app-lib/src/api/instance/synced_options/hotbars.rs b/packages/app-lib/src/api/instance/synced_options/hotbars.rs index 1dc58f1..1112d0e 100644 --- a/packages/app-lib/src/api/instance/synced_options/hotbars.rs +++ b/packages/app-lib/src/api/instance/synced_options/hotbars.rs @@ -3,10 +3,11 @@ use super::files::{ CheckpointStatus, begin_checkpoint, checkpoint, ensure_link, finish_checkpoint, instance_game_dir, nbt_from_bytes, nbt_to_bytes, read_nbt_file, safe_instance_id, sha1_bytes, sha1_file, + synced_options_path, }; use super::orchestration::{ backup_bytes, create_synced_directories, option_effective, - seed_from_instance, synced_options_path, + seed_from_instance, }; use crate::state::{InstanceMetadata, SyncedOption}; use crate::util::io; diff --git a/packages/app-lib/src/api/instance/synced_options/mod.rs b/packages/app-lib/src/api/instance/synced_options/mod.rs index 43a04d0..14b61bc 100644 --- a/packages/app-lib/src/api/instance/synced_options/mod.rs +++ b/packages/app-lib/src/api/instance/synced_options/mod.rs @@ -19,8 +19,8 @@ pub(super) use self::files::{ pub(super) use self::orchestration::instance_option_supported; pub use self::orchestration::{ GlobalSyncedOptions, SyncedOptionCapability, SyncedOptionJoinAction, - SyncedOptionJoinPreview, SyncedOptionJoinResolution, SyncedOptionsOverview, - get_capabilities, get_global_options, get_initialized_options, + SyncedOptionJoinPreview, SyncedOptionsOverview, get_capabilities, + get_global_options, get_initialized_options, get_instance_option_join_preview, get_overview, get_synced_options_folder, reconcile_all, reconcile_changed_file, reconcile_instance, set_global_option, set_instance_option, @@ -30,3 +30,4 @@ pub(crate) use self::orchestration::{ reconcile_instance_after_pack_update_with_state, remove_generated_instance_files, }; +pub use self::pending::SyncedOptionJoinResolution; 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 bb029f0..fdfb0b6 100644 --- a/packages/app-lib/src/api/instance/synced_servers/modpack.rs +++ b/packages/app-lib/src/api/instance/synced_servers/modpack.rs @@ -5,7 +5,7 @@ use super::operations::{compose_instance, effective}; use super::storage::{load_local, write_local_rows}; use super::types::{LocalServer, ServerSource}; use crate::state::{CachedEntry, InstanceLink, InstanceMetadata}; -use crate::util::fetch::{DownloadMeta, DownloadReason, fetch}; +use crate::util::fetch::fetch; use crate::{ErrorKind, State}; use async_zip::base::read::seek::ZipFileReader; use quartz_nbt::NbtCompound; @@ -74,7 +74,7 @@ async fn replace_modpack_servers( ON CONFLICT(instance_id) DO UPDATE SET version_id = excluded.version_id", ) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .bind(version_id) .execute(&mut *tx) .await?; @@ -91,7 +91,7 @@ pub(super) async fn pack_state_matches_link( FROM instance_server_pack_state WHERE instance_id = ?", ) - .bind(metadata.instance.id) + .bind(&metadata.instance.id) .fetch_optional(&state.pool) .await?; Ok(row.is_some_and(|row| { @@ -149,16 +149,9 @@ pub(super) async fn reconstruct_modpack_servers( "Modpack version {version_id} has no downloadable file" )) })?; - let download_meta = DownloadMeta { - reason: DownloadReason::Modpack, - game_version: metadata.applied_content_set.game_version.clone(), - loader: metadata.applied_content_set.loader.as_str().to_string(), - dependent_on: Some(version_id.to_string()), - }; let mrpack = fetch( &primary_file.url, primary_file.hashes.get("sha1").map(String::as_str), - Some(&download_meta), None, &state.api_semaphore, &state.pool, 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 57a81f1..deeafd9 100644 --- a/packages/app-lib/src/api/instance/synced_servers/storage.rs +++ b/packages/app-lib/src/api/instance/synced_servers/storage.rs @@ -120,11 +120,13 @@ async fn write_canonical_rows( nbt_to_bytes(&server.data)?, )); } + use sqlx::Row; if current.len() == desired.len() && current.iter().zip(&desired).all(|(current, desired)| { - current.id == desired.0 - && current.position == desired.1 - && current.nbt == desired.2 + let id: String = current.get("id"); + let position: i64 = current.get("position"); + let nbt: Vec = current.get("nbt"); + id == desired.0 && position == desired.1 && nbt == desired.2 }) { return Ok(false); @@ -133,9 +135,10 @@ async fn write_canonical_rows( let desired_ids = desired.iter().map(|(id, _, _)| *id).collect::>(); for row in ¤t { - if !desired_ids.contains(row.id.as_str()) { + let row_id: String = row.get("id"); + if !desired_ids.contains(row_id.as_str()) { sqlx::query("DELETE FROM synced_servers WHERE id = ?") - .bind(&row.id) + .bind(&row_id) .execute(&mut **tx) .await?; } @@ -143,7 +146,10 @@ async fn write_canonical_rows( let position_offset = current .iter() - .map(|row| row.position) + .map(|row| { + let p: i64 = row.get("position"); + p + }) .max() .unwrap_or(0) .max(servers.len() as i64) diff --git a/packages/app-lib/src/state/mod.rs b/packages/app-lib/src/state/mod.rs index 597f7d9..dde048c 100644 --- a/packages/app-lib/src/state/mod.rs +++ b/packages/app-lib/src/state/mod.rs @@ -948,6 +948,8 @@ impl State { configured_http_client: RwLock::new(configured_http_client), configured_http_client_update: AsyncMutex::new(()), file_watcher, + synced_options_lock: Arc::new(AsyncMutex::new(())), + game_locale_indexer: Default::default(), // app_identifier, })) }