diff --git a/Cargo.lock b/Cargo.lock index 95fd0e6e1c3..c53ba4c97a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7794,6 +7794,7 @@ dependencies = [ "insta", "itertools 0.12.1", "regex", + "serde_json", "spacetimedb-data-structures", "spacetimedb-lib 2.0.5", "spacetimedb-primitives 2.0.5", diff --git a/crates/bindings-cpp/ARCHITECTURE.md b/crates/bindings-cpp/ARCHITECTURE.md index c5fc1f2151e..d5f74910d7f 100644 --- a/crates/bindings-cpp/ARCHITECTURE.md +++ b/crates/bindings-cpp/ARCHITECTURE.md @@ -77,7 +77,7 @@ SPACETIMEDB_REDUCER(create_user, ReducerContext ctx, std::string name) { } // Success path - ctx.db[user].insert(User{ctx.sender, name, false}); + ctx.db[user].insert(User{ctx.sender(), name, false}); return Ok(); // No value needed - just success } ``` @@ -638,4 +638,4 @@ SpacetimeDB loading → Server-side validation and error reporting - [Type System Details](README.md#features) - [Constraint Validation Tests](tests/type-isolation-test/) - [API Reference](REFERENCE.md) -- [Quick Start Guide](QUICKSTART.md) \ No newline at end of file +- [Quick Start Guide](QUICKSTART.md) diff --git a/crates/bindings-cpp/QUICKSTART.md b/crates/bindings-cpp/QUICKSTART.md index 84dd3194531..d8b12c25242 100644 --- a/crates/bindings-cpp/QUICKSTART.md +++ b/crates/bindings-cpp/QUICKSTART.md @@ -109,7 +109,7 @@ SPACETIMEDB_REDUCER(set_name, ReducerContext ctx, std::string name) { } // Find and update the user by identity (primary key) - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.name = validated.value(); @@ -127,7 +127,7 @@ SPACETIMEDB_REDUCER(send_message, ReducerContext ctx, std::string text) { return Err(validated.error()); } - Message msg{ctx.sender, ctx.timestamp, validated.value()}; + Message msg{ctx.sender(), ctx.timestamp, validated.value()}; ctx.db[message].insert(msg); return Ok(); } @@ -140,13 +140,13 @@ Lifecycle reducers are special functions called automatically by SpacetimeDB: ```cpp // Called when a client connects SPACETIMEDB_CLIENT_CONNECTED(client_connected, ReducerContext ctx) { - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.online = true; ctx.db[user_identity].update(user); } else { - User new_user{ctx.sender, std::nullopt, true}; + User new_user{ctx.sender(), std::nullopt, true}; ctx.db[user].insert(new_user); } return Ok(); @@ -154,7 +154,7 @@ SPACETIMEDB_CLIENT_CONNECTED(client_connected, ReducerContext ctx) { // Called when a client disconnects SPACETIMEDB_CLIENT_DISCONNECTED(client_disconnected, ReducerContext ctx) { - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.online = false; @@ -291,4 +291,4 @@ For more complex examples, see: --- -Ready to learn more? Check out the [C++ Reference Documentation](REFERENCE.md) for detailed API information. \ No newline at end of file +Ready to learn more? Check out the [C++ Reference Documentation](REFERENCE.md) for detailed API information. diff --git a/crates/bindings-cpp/README.md b/crates/bindings-cpp/README.md index c3d2ef2a2af..ef31361c10b 100644 --- a/crates/bindings-cpp/README.md +++ b/crates/bindings-cpp/README.md @@ -102,7 +102,7 @@ SPACETIMEDB_NAMESPACE(UserRole, "Auth") // Will be "Auth.UserRole" in client co // User-defined reducer SPACETIMEDB_REDUCER(add_user, ReducerContext ctx, std::string name, std::string email) { - User user{ctx.sender, name, email}; // id will be auto-generated + User user{ctx.sender(), name, email}; // id will be auto-generated ctx.db[users].insert(user); LOG_INFO("Added user: " + name); return Ok(); @@ -110,7 +110,7 @@ SPACETIMEDB_REDUCER(add_user, ReducerContext ctx, std::string name, std::string // Delete user by id (using primary key) SPACETIMEDB_REDUCER(delete_user, ReducerContext ctx) { - ctx.db[users_identity].delete_by_key(ctx.sender); + ctx.db[users_identity].delete_by_key(ctx.sender()); return Ok(); } @@ -121,19 +121,19 @@ SPACETIMEDB_INIT(init, ReducerContext ctx) { } SPACETIMEDB_CLIENT_CONNECTED(on_connect, ReducerContext ctx) { - LOG_INFO("Client connected: " + ctx.sender.to_hex_string()); + LOG_INFO("Client connected: " + ctx.sender().to_hex_string()); return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(on_disconnect, ReducerContext ctx) { - LOG_INFO("Client disconnected: " + ctx.sender.to_hex_string()); + LOG_INFO("Client disconnected: " + ctx.sender().to_hex_string()); return Ok(); } // Define a view for querying data (finds the calling user) SPACETIMEDB_VIEW(std::optional, find_my_user, Public, ViewContext ctx) { // Use indexed field to find user by their identity - return ctx.db[users_identity].find(ctx.sender); + return ctx.db[users_identity].find(ctx.sender()); } // Define a procedure (pure function with return value) diff --git a/crates/bindings-cpp/REFERENCE.md b/crates/bindings-cpp/REFERENCE.md index 7983c451d51..3da3c0ee40f 100644 --- a/crates/bindings-cpp/REFERENCE.md +++ b/crates/bindings-cpp/REFERENCE.md @@ -191,7 +191,7 @@ SPACETIMEDB_INIT(init, ReducerContext ctx) { // Called when a client connects SPACETIMEDB_CLIENT_CONNECTED(on_connect, ReducerContext ctx) { LOG_INFO("Client connected"); - // ctx.sender contains the client's Identity + // ctx.sender() contains the client's Identity return Ok(); } @@ -213,7 +213,7 @@ SPACETIMEDB_REDUCER(example, ReducerContext ctx, /* params */) { ctx.db[table_name].insert(record); // Client identity - Identity client = ctx.sender; + Identity client = ctx.sender(); // Current timestamp Timestamp now = ctx.timestamp; @@ -893,7 +893,7 @@ SPACETIMEDB_TABLE(User, user, Public); FIELD_PrimaryKey(user, id); SPACETIMEDB_REDUCER(create_user, ReducerContext ctx, std::string name) { - User user{ctx.sender, name}; // ctx.sender is the calling client's identity + User user{ctx.sender(), name}; // ctx.sender() is the calling client's identity ctx.db[user_id].insert(user); return Ok(); } @@ -1138,12 +1138,12 @@ FIELD_Index(user, active); // Register new user SPACETIMEDB_REDUCER(register_user, ReducerContext ctx, std::string username, std::string email) { // Check if user already exists - auto user_opt = ctx.db[user_identity].find(ctx.sender); + auto user_opt = ctx.db[user_identity].find(ctx.sender()); if (user_opt && user_opt->active) { return Err("User already registered"); } - User new_user{0, ctx.sender, username, email, ctx.timestamp, true}; + User new_user{0, ctx.sender(), username, email, ctx.timestamp, true}; ctx.db[user].insert(new_user); LOG_INFO("User registered: " + username); return Ok(); @@ -1151,7 +1151,7 @@ SPACETIMEDB_REDUCER(register_user, ReducerContext ctx, std::string username, std // Update user profile SPACETIMEDB_REDUCER(update_profile, ReducerContext ctx, std::string new_username) { - auto user_opt = ctx.db[user_identity].find(ctx.sender); + auto user_opt = ctx.db[user_identity].find(ctx.sender()); if (user_opt && user_opt->active) { User updated_user = *user_opt; updated_user.username = new_username; @@ -1164,7 +1164,7 @@ SPACETIMEDB_REDUCER(update_profile, ReducerContext ctx, std::string new_username // Deactivate user SPACETIMEDB_REDUCER(deactivate_user, ReducerContext ctx) { - auto user_opt = ctx.db[user_identity].find(ctx.sender); + auto user_opt = ctx.db[user_identity].find(ctx.sender()); if (user_opt && user_opt->active) { User updated_user = *user_opt; updated_user.active = false; @@ -1227,7 +1227,7 @@ FIELD_Index(messages, sender); // Create channel SPACETIMEDB_REDUCER(create_channel, ReducerContext ctx, std::string name, std::string description, bool is_public) { - Channel channel{0, name, description, ctx.sender, is_public}; + Channel channel{0, name, description, ctx.sender(), is_public}; ctx.db[channels].insert(channel); LOG_INFO("Channel created: " + name); return Ok(); @@ -1249,7 +1249,7 @@ SPACETIMEDB_REDUCER(send_message, ReducerContext ctx, uint32_t channel_id, std:: return Err("Channel not found"); } - Message message{0, channel_id, ctx.sender, content, ctx.timestamp}; + Message message{0, channel_id, ctx.sender(), content, ctx.timestamp}; ctx.db[messages].insert(message); return Ok(); } @@ -1281,4 +1281,4 @@ SPACETIMEDB_REDUCER(update_age, ReducerContext ctx, uint32_t new_age) { --- -This completes the C++ reference documentation. For more examples and advanced patterns, see the working modules in [`modules/sdk-test-cpp`](../../modules/sdk-test-cpp) and [`modules/module-test-cpp`](../../modules/module-test-cpp). \ No newline at end of file +This completes the C++ reference documentation. For more examples and advanced patterns, see the working modules in [`modules/sdk-test-cpp`](../../modules/sdk-test-cpp) and [`modules/module-test-cpp`](../../modules/module-test-cpp). diff --git a/crates/bindings-cpp/include/spacetimedb/procedure_context.h b/crates/bindings-cpp/include/spacetimedb/procedure_context.h index e7c100200dc..1ee1b88f71f 100644 --- a/crates/bindings-cpp/include/spacetimedb/procedure_context.h +++ b/crates/bindings-cpp/include/spacetimedb/procedure_context.h @@ -53,16 +53,18 @@ namespace SpacetimeDB { * @endcode */ struct ProcedureContext { +private: // Caller's identity - who invoked this procedure - Identity sender; - + Identity sender_; + +public: // Timestamp when the procedure was invoked Timestamp timestamp; - + // Connection ID for the caller // Used to track which client connection initiated this procedure ConnectionId connection_id; - + #ifdef SPACETIMEDB_UNSTABLE_FEATURES // HTTP client for making external requests // IMPORTANT: HTTP calls are NOT allowed inside transactions! @@ -81,7 +83,11 @@ struct ProcedureContext { ProcedureContext() = default; ProcedureContext(Identity s, Timestamp t, ConnectionId conn_id) - : sender(s), timestamp(t), connection_id(conn_id) {} + : sender_(s), timestamp(t), connection_id(conn_id) {} + + Identity sender() const { + return sender_; + } /** * @brief Read the current module's Identity @@ -197,7 +203,7 @@ struct ProcedureContext { // Create a ReducerContext for this transaction // Note: connection_id converted to std::optional ReducerContext reducer_ctx( - sender, + sender(), std::optional(connection_id), Timestamp::from_micros_since_epoch(tx_timestamp) ); @@ -260,7 +266,7 @@ struct ProcedureContext { // Create a ReducerContext for this transaction ReducerContext reducer_ctx( - sender, + sender(), std::optional(connection_id), Timestamp::from_micros_since_epoch(tx_timestamp) ); diff --git a/crates/bindings-cpp/include/spacetimedb/reducer_context.h b/crates/bindings-cpp/include/spacetimedb/reducer_context.h index 313a3fd8d87..307c107e566 100644 --- a/crates/bindings-cpp/include/spacetimedb/reducer_context.h +++ b/crates/bindings-cpp/include/spacetimedb/reducer_context.h @@ -17,8 +17,11 @@ namespace SpacetimeDB { // Enhanced ReducerContext with database access - matches Rust pattern struct ReducerContext { - // Core fields - directly accessible like in Rust - Identity sender; +private: + Identity sender_; + +public: + // Core fields - sender is exposed via sender() like Rust, other fields remain directly accessible std::optional connection_id; Timestamp timestamp; @@ -37,6 +40,10 @@ struct ReducerContext { mutable uint32_t counter_uuid_ = 0; public: + Identity sender() const { + return sender_; + } + // Returns the authorization information for the caller of this reducer const AuthCtx& sender_auth() const { return sender_auth_; @@ -110,7 +117,7 @@ struct ReducerContext { ReducerContext() : sender_auth_(AuthCtx::internal()) {} ReducerContext(Identity s, std::optional cid, Timestamp ts) - : sender(s), connection_id(cid), timestamp(ts), + : sender_(s), connection_id(cid), timestamp(ts), sender_auth_(AuthCtx::from_connection_id_opt(cid, s)) {} }; diff --git a/crates/bindings-cpp/include/spacetimedb/reducer_macros.h b/crates/bindings-cpp/include/spacetimedb/reducer_macros.h index d11380ead52..b9d6edcda07 100644 --- a/crates/bindings-cpp/include/spacetimedb/reducer_macros.h +++ b/crates/bindings-cpp/include/spacetimedb/reducer_macros.h @@ -125,7 +125,7 @@ * @usage * ```cpp * SPACETIMEDB_CLIENT_CONNECTED(on_connect, ReducerContext ctx) { - * LOG_INFO("Client connected: " + ctx.sender.to_hex()); + * LOG_INFO("Client connected: " + ctx.sender().to_hex()); * return Ok(); * } * ``` @@ -149,7 +149,7 @@ * @usage * ```cpp * SPACETIMEDB_CLIENT_DISCONNECTED(on_disconnect, ReducerContext ctx) { - * LOG_INFO("Client disconnected: " + ctx.sender.to_hex()); + * LOG_INFO("Client disconnected: " + ctx.sender().to_hex()); * return Ok(); * } * ``` diff --git a/crates/bindings-cpp/include/spacetimedb/tx_context.h b/crates/bindings-cpp/include/spacetimedb/tx_context.h index 10f28e28f9b..68d1d3181e5 100644 --- a/crates/bindings-cpp/include/spacetimedb/tx_context.h +++ b/crates/bindings-cpp/include/spacetimedb/tx_context.h @@ -53,9 +53,9 @@ struct TxContext { public: // Public references to ReducerContext fields for consistent API with Rust // In Rust, Deref makes tx.db work the same as ctx.db - // In C++, we explicitly expose references to achieve the same ergonomics + // In C++, we explicitly expose references where possible and provide + // accessors for fields exposed as methods on ReducerContext. DatabaseContext& db; - const Identity& sender; const Timestamp& timestamp; const std::optional& connection_id; @@ -63,11 +63,11 @@ struct TxContext { explicit TxContext(ReducerContext& ctx) : ctx_(ctx), db(ctx.db), - sender(ctx.sender), timestamp(ctx.timestamp), connection_id(ctx.connection_id) {} // Access to ReducerContext methods + Identity sender() const { return ctx_.sender(); } const AuthCtx& sender_auth() const { return ctx_.sender_auth(); } Identity identity() const { return ctx_.identity(); } StdbRng& rng() const { return ctx_.rng(); } diff --git a/crates/bindings-cpp/include/spacetimedb/view_context.h b/crates/bindings-cpp/include/spacetimedb/view_context.h index cc1a5c63094..3a7fdd577f0 100644 --- a/crates/bindings-cpp/include/spacetimedb/view_context.h +++ b/crates/bindings-cpp/include/spacetimedb/view_context.h @@ -25,7 +25,7 @@ namespace SpacetimeDB { * SPACETIMEDB_VIEW(std::vector, get_my_items, Public, ViewContext ctx) { * std::vector my_items; * // Filter by caller's identity using indexed field - * for (const auto& item : ctx.db[item_owner].filter(ctx.sender)) { + * for (const auto& item : ctx.db[item_owner].filter(ctx.sender())) { * my_items.push_back(item); * } * return Ok(my_items); @@ -33,9 +33,11 @@ namespace SpacetimeDB { * @endcode */ struct ViewContext { +private: // Caller's identity - who invoked this view - Identity sender; - + Identity sender_; + +public: // Read-only database access - no mutations allowed ReadOnlyDatabaseContext db; @@ -43,7 +45,9 @@ struct ViewContext { ViewContext() = default; explicit ViewContext(Identity s) - : sender(s) {} + : sender_(s) {} + + Identity sender() const { return sender_; } }; /** diff --git a/crates/cli/src/subcommands/generate.rs b/crates/cli/src/subcommands/generate.rs index f7244790b74..6e5378fede5 100644 --- a/crates/cli/src/subcommands/generate.rs +++ b/crates/cli/src/subcommands/generate.rs @@ -48,6 +48,7 @@ fn build_generate_config_schema(command: &clap::Command) -> Result clap::Command { .alias("module-name") .help("The module name that should be used for DLL export macros (required for lang unrealcpp)") ) + .arg( + Arg::new("module_prefix") + .long("module-prefix") + .help("The module prefix to use for generated types (only used with --lang unrealcpp)") + ) .arg( Arg::new("lang") .long("lang") @@ -285,6 +291,7 @@ pub struct GenerateRunConfig { pub lang: Language, pub namespace: String, pub module_name: Option, + pub module_prefix: Option, pub build_options: String, pub out_dir: PathBuf, pub include_private: bool, @@ -313,6 +320,7 @@ fn prepare_generate_run_configs<'a>( .get_one::("namespace")? .unwrap_or_else(|| "SpacetimeDB.Types".to_string()); let module_name = command_config.get_one::("unreal_module_name")?; + let module_prefix = command_config.get_one::("module_prefix")?; let build_options = command_config .get_one::("build_options")? .unwrap_or_else(String::new); @@ -371,6 +379,7 @@ fn prepare_generate_run_configs<'a>( lang, namespace, module_name, + module_prefix, build_options, out_dir, include_private, @@ -511,6 +520,7 @@ pub async fn run_prepared_generate_configs( unreal_cpp_lang = UnrealCpp { module_name: run.module_name.as_ref().unwrap(), uproject_dir: &run.out_dir, + module_prefix: run.module_prefix.as_deref().unwrap_or(""), }; &unreal_cpp_lang as &dyn Lang } diff --git a/crates/codegen/Cargo.toml b/crates/codegen/Cargo.toml index 54e0f589669..9d362a09ade 100644 --- a/crates/codegen/Cargo.toml +++ b/crates/codegen/Cargo.toml @@ -15,6 +15,7 @@ spacetimedb-schema.workspace = true anyhow.workspace = true convert_case.workspace = true itertools.workspace = true +serde_json.workspace = true [dev-dependencies] fs-err.workspace = true diff --git a/crates/codegen/src/UnrealCPP-README.md b/crates/codegen/src/UnrealCPP-README.md index 47520517b5f..121ba90f945 100644 --- a/crates/codegen/src/UnrealCPP-README.md +++ b/crates/codegen/src/UnrealCPP-README.md @@ -316,7 +316,7 @@ cargo run --bin spacetimedb-cli -- generate --lang unrealcpp --uproject-dir crat ### Parameters - `--lang unrealcpp`: Specifies the UnrealCPP code generator -- `--uproject-dir`: Directory containing Unreal's .uproject or .uplugin file +- `--uproject-dir`: Directory containing your Unreal project's `.uproject` file - `--module-path`: Path to your SpacetimeDB module source code - `--unreal-module-name`: **Required** - Name used for generated classes, API prefix and putting generated module bindings in the correct Module's Source @@ -331,6 +331,15 @@ The `--unreal-module-name` parameter is **mandatory** for UnrealCPP generation b **⚠️ IMPORTANT:** Without the module name, the generated code would not compile in Unreal Engine due to missing API macros and naming conflicts. +### Project Setup Behavior + +When generating into an Unreal project, the code generator also: + +1. Ensures the named module exists in the project's `Modules` array in the `.uproject` file. +2. Creates missing `Source//.Build.cs`, `Source//.cpp`, and `Source//.h` files. + +If the `.uproject` file is missing, unreadable, malformed, or has an invalid `Modules` field, generation fails immediately. + ## Implementation Details The Blueprint compatibility checking is implemented in the `is_blueprintable()` function, which recursively checks: @@ -344,4 +353,4 @@ All error messages follow a consistent format: - **Single type:** `"uint32 types are not Blueprint-compatible"` - **Multiple types:** `"uint32, uint64 types are not Blueprint-compatible"` -This makes it clear to developers exactly which types need to be changed for Blueprint compatibility. \ No newline at end of file +This makes it clear to developers exactly which types need to be changed for Blueprint compatibility. diff --git a/crates/codegen/src/unrealcpp.rs b/crates/codegen/src/unrealcpp.rs index c4b9fd81efb..bab5d0bfed5 100644 --- a/crates/codegen/src/unrealcpp.rs +++ b/crates/codegen/src/unrealcpp.rs @@ -1,7 +1,7 @@ //! Autogenerated Unreal‑C++ code‑gen backend for SpacetimeDB CLI use crate::code_indenter::CodeIndenter; use crate::util::{ - collect_case, fmt_fn, iter_table_names_and_types, iter_tables, print_auto_generated_file_comment, + fmt_fn, iter_table_names_and_types, iter_tables, print_auto_generated_file_comment, print_auto_generated_version_comment, CodegenVisibility, }; use crate::util::{iter_indexes, iter_procedures, iter_reducers}; @@ -23,6 +23,7 @@ use std::path::Path; pub struct UnrealCpp<'opts> { pub module_name: &'opts str, pub uproject_dir: &'opts Path, + pub module_prefix: &'opts str, } // --------------------------------------------------------------------------- @@ -37,8 +38,9 @@ impl UnrealCpp<'_> { impl Lang for UnrealCpp<'_> { fn generate_table_file_from_schema(&self, module: &ModuleDef, table: &TableDef, schema: TableSchema) -> OutputFile { - let struct_name = type_ref_name(module, table.product_type_ref); - let table_pascal = table.name.deref().to_case(Case::Pascal); + let module_prefix = self.module_prefix; + let struct_name = type_ref_name(self.module_prefix, module, table.product_type_ref); + let table_pascal = format!("{module_prefix}{}", table.name.deref().to_case(Case::Pascal)); let self_header = table_pascal.clone() + "Table"; let mut output = UnrealCppAutogen::new( @@ -76,7 +78,8 @@ impl Lang for UnrealCpp<'_> { if let Some(col) = columns.as_singleton() { let (f_name, f_ty) = &product_type.unwrap().elements[col.idx()]; let field_name = f_name.deref().to_case(Case::Pascal); - let field_type = cpp_ty_fmt_with_module(module, f_ty, self.module_name).to_string(); + let field_type = + cpp_ty_fmt_with_module(self.module_prefix, module, f_ty, self.module_name).to_string(); let index_name = accessor_name.deref().to_case(Case::Pascal); let index_class_name = format!("U{table_pascal}{index_name}UniqueIndex"); let key_type = field_type.clone(); @@ -173,7 +176,8 @@ impl Lang for UnrealCpp<'_> { .map(|col| { let (f_name, f_ty) = &product_type.unwrap().elements[col.idx()]; let field_name = f_name.deref().to_case(Case::Pascal); - let field_type = cpp_ty_fmt_with_module(module, f_ty, self.module_name).to_string(); + let field_type = + cpp_ty_fmt_with_module(self.module_prefix, module, f_ty, self.module_name).to_string(); let param_type = format!("const {field_type}&"); (field_name, field_type, param_type, f_ty, f_name.deref().to_string()) @@ -325,44 +329,48 @@ impl Lang for UnrealCpp<'_> { // Generate table events in public section writeln!(output, " // Table Events"); writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( "); - writeln!(output, " FOn{table_pascal}Insert,"); - writeln!(output, " const FEventContext&, Context,"); + writeln!(output, " F{module_prefix}On{table_pascal}Insert,"); + writeln!(output, " const F{module_prefix}EventContext&, Context,"); writeln!(output, " const {row_struct}&, NewRow);"); writeln!(output); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams( "); - writeln!(output, " FOn{table_pascal}Update,"); - writeln!(output, " const FEventContext&, Context,"); - writeln!(output, " const {row_struct}&, OldRow,"); - writeln!(output, " const {row_struct}&, NewRow);"); - writeln!(output); + if !table.is_event { + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams( "); + writeln!(output, " F{module_prefix}On{table_pascal}Update,"); + writeln!(output, " const F{module_prefix}EventContext&, Context,"); + writeln!(output, " const {row_struct}&, OldRow,"); + writeln!(output, " const {row_struct}&, NewRow);"); + writeln!(output); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( "); - writeln!(output, " FOn{table_pascal}Delete,"); - writeln!(output, " const FEventContext&, Context,"); - writeln!(output, " const {row_struct}&, DeletedRow);"); - writeln!(output); + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( "); + writeln!(output, " F{module_prefix}On{table_pascal}Delete,"); + writeln!(output, " const F{module_prefix}EventContext&, Context,"); + writeln!(output, " const {row_struct}&, DeletedRow);"); + writeln!(output); + } writeln!( output, " UPROPERTY(BlueprintAssignable, Category = \"SpacetimeDB Events\")" ); - writeln!(output, " FOn{table_pascal}Insert OnInsert;"); + writeln!(output, " F{module_prefix}On{table_pascal}Insert OnInsert;"); writeln!(output); - writeln!( - output, - " UPROPERTY(BlueprintAssignable, Category = \"SpacetimeDB Events\")" - ); - writeln!(output, " FOn{table_pascal}Update OnUpdate;"); - writeln!(output); + if !table.is_event { + writeln!( + output, + " UPROPERTY(BlueprintAssignable, Category = \"SpacetimeDB Events\")" + ); + writeln!(output, " F{module_prefix}On{table_pascal}Update OnUpdate;"); + writeln!(output); - writeln!( - output, - " UPROPERTY(BlueprintAssignable, Category = \"SpacetimeDB Events\")" - ); - writeln!(output, " FOn{table_pascal}Delete OnDelete;"); - writeln!(output); + writeln!( + output, + " UPROPERTY(BlueprintAssignable, Category = \"SpacetimeDB Events\")" + ); + writeln!(output, " F{module_prefix}On{table_pascal}Delete OnDelete;"); + writeln!(output); + } writeln!(output, "private:"); writeln!(output, " const FString TableName = TEXT(\"{table_name}\");"); @@ -375,49 +383,54 @@ impl Lang for UnrealCpp<'_> { filename: format!( "Source/{}/Public/ModuleBindings/Tables/{}Table.g.h", self.module_name, - table.name.deref().to_case(Case::Pascal) //type_ref_name(module, table.product_type_ref) + format_args!("{module_prefix}{}", table.name.deref().to_case(Case::Pascal)) ), code: output.into_inner(), } } fn generate_type_files(&self, module: &ModuleDef, typ: &TypeDef) -> Vec { - let name = typ - .accessor_name - .name_segments() - .last() - .map(|id| id.deref()) - .unwrap_or("Unnamed"); + let name = type_ref_name(self.module_prefix, module, typ.ty); let filename = format!( "Source/{}/Public/ModuleBindings/Types/{}Type.g.h", - self.module_name, - collect_case(Case::Pascal, typ.accessor_name.name_segments()) + self.module_name, &name ); let code: String = match &module.typespace_for_generate()[typ.ty] { - AlgebraicTypeDef::PlainEnum(plain_enum) => autogen_cpp_enum(name, plain_enum), - AlgebraicTypeDef::Product(product_type_def) => { - autogen_cpp_struct(module, name, product_type_def, &self.get_api_macro(), self.module_name) - } - AlgebraicTypeDef::Sum(sum_type_def) => { - autogen_cpp_sum(module, name, sum_type_def, &self.get_api_macro(), self.module_name) - } + AlgebraicTypeDef::PlainEnum(plain_enum) => autogen_cpp_enum(&name, plain_enum), + AlgebraicTypeDef::Product(product_type_def) => autogen_cpp_struct( + self.module_prefix, + module, + &name, + product_type_def, + &self.get_api_macro(), + self.module_name, + ), + AlgebraicTypeDef::Sum(sum_type_def) => autogen_cpp_sum( + self.module_prefix, + module, + &name, + sum_type_def, + &self.get_api_macro(), + self.module_name, + ), }; vec![OutputFile { filename, code }] } fn generate_reducer_file(&self, module: &ModuleDef, reducer: &ReducerDef) -> OutputFile { - let reducer_snake = reducer.name.deref(); - let pascal = reducer_snake.to_case(Case::Pascal); + let module_prefix = self.module_prefix; + let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let pascal = format!("{module_prefix}{reducer_pascal}"); // Collect includes for parameter types let mut includes = HashSet::::new(); for (_param_name, param_type) in &reducer.params_for_generate.elements { - collect_includes_for_type(module, param_type, &mut includes, self.module_name); + collect_includes_for_type(self.module_prefix, module, param_type, &mut includes, self.module_name); } - // Add ReducerBase.g.h for UReducerBase definition - includes.insert("ModuleBindings/ReducerBase.g.h".to_string()); + // Add {module_prefix}ReducerBase.g.h for U{module_prefix}ReducerBase definition + includes.insert(format!("ModuleBindings/{module_prefix}ReducerBase.g.h")); // Convert to sorted vector let mut include_vec: Vec = includes.into_iter().collect(); @@ -441,8 +454,8 @@ impl Lang for UnrealCpp<'_> { // Generate properties for each parameter for (param_name, param_type) in &reducer.params_for_generate.elements { let param_pascal = param_name.deref().to_case(Case::Pascal); - let type_str = cpp_ty_fmt_with_module(module, param_type, self.module_name).to_string(); - let init_str = cpp_ty_init_fmt_impl(module, param_type); + let type_str = cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string(); + let init_str = cpp_ty_init_fmt_impl(self.module_prefix, module, param_type); let field_decl = format!("{type_str} {param_pascal}{init_str}"); // Check if the type is blueprintable @@ -473,7 +486,8 @@ impl Lang for UnrealCpp<'_> { } first = false; let param_pascal = param_name.deref().to_case(Case::Pascal); - let type_str = cpp_ty_fmt_with_module(module, param_type, self.module_name).to_string(); + let type_str = + cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string(); write!(header, "const {type_str}& In{param_pascal}"); } @@ -559,7 +573,7 @@ impl Lang for UnrealCpp<'_> { writeln!(header, "UCLASS(BlueprintType)"); writeln!( header, - "class {} U{pascal}Reducer : public UReducerBase", + "class {} U{pascal}Reducer : public U{module_prefix}ReducerBase", self.get_api_macro() ); writeln!(header, "{{"); @@ -570,8 +584,8 @@ impl Lang for UnrealCpp<'_> { // Generate properties for each parameter (for dispatching) for (param_name, param_type) in &reducer.params_for_generate.elements { let param_pascal = param_name.deref().to_case(Case::Pascal); - let type_str = cpp_ty_fmt_with_module(module, param_type, self.module_name).to_string(); - let init_str = cpp_ty_init_fmt_impl(module, param_type); + let type_str = cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string(); + let init_str = cpp_ty_init_fmt_impl(self.module_prefix, module, param_type); let field_decl = format!("{type_str} {param_pascal}{init_str}"); // Check if the type is blueprintable @@ -608,14 +622,16 @@ impl Lang for UnrealCpp<'_> { procedure: &spacetimedb_schema::def::ProcedureDef, ) -> OutputFile { let procedure_snake = procedure.name.deref(); - let pascal = procedure_snake.to_case(Case::Pascal); + let procedure_pascal = procedure_snake.to_case(Case::Pascal); + let pascal = format!("{}{}", self.module_prefix, procedure_pascal); // Collect includes for parameter types let mut includes = HashSet::::new(); for (_param_name, param_type) in &procedure.params_for_generate.elements { - collect_includes_for_type(module, param_type, &mut includes, self.module_name); + collect_includes_for_type(self.module_prefix, module, param_type, &mut includes, self.module_name); } collect_includes_for_type( + self.module_prefix, module, &procedure.return_type_for_generate, &mut includes, @@ -644,8 +660,8 @@ impl Lang for UnrealCpp<'_> { // Generate properties for each parameter for (param_name, param_type) in &procedure.params_for_generate.elements { let param_pascal = param_name.deref().to_case(Case::Pascal); - let type_str = cpp_ty_fmt_with_module(module, param_type, self.module_name).to_string(); - let init_str = cpp_ty_init_fmt_impl(module, param_type); + let type_str = cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string(); + let init_str = cpp_ty_init_fmt_impl(self.module_prefix, module, param_type); let field_decl = format!("{type_str} {param_pascal}{init_str}"); // Check if the type is blueprintable @@ -676,7 +692,8 @@ impl Lang for UnrealCpp<'_> { } first = false; let param_pascal = param_name.deref().to_case(Case::Pascal); - let type_str = cpp_ty_fmt_with_module(module, param_type, self.module_name).to_string(); + let type_str = + cpp_ty_fmt_with_module(self.module_prefix, module, param_type, self.module_name).to_string(); write!(header, "const {type_str}& In{param_pascal}"); } @@ -766,17 +783,52 @@ impl Lang for UnrealCpp<'_> { } fn generate_global_files(&self, module: &ModuleDef, options: &CodegenOptions) -> Vec { + let module_prefix = self.module_prefix; let mut files: Vec = vec![]; + let source_dir = self.uproject_dir.join("Source").join(self.module_name); + let required_files = [ + ( + format!("{}.Build.cs", self.module_name), + generate_build_cs_content(self.module_name), + ), + ( + format!("{}.cpp", self.module_name), + generate_module_cpp_content(self.module_name), + ), + ( + format!("{}.h", self.module_name), + generate_module_h_content(self.module_name), + ), + ]; + + for (filename, content) in required_files { + let file_path = source_dir.join(&filename); + if !file_path.exists() { + files.push(OutputFile { + filename: format!("Source/{}/{}", self.module_name, filename), + code: content, + }); + } + } + + ensure_module_in_uproject(self.uproject_dir, self.module_name).unwrap_or_else(|err| panic!("{err}")); + // First, collect and generate all optional types - let (optional_types, result_types) = collect_wrapper_types(module, options.visibility); + let (optional_types, result_types) = collect_wrapper_types(self.module_prefix, module, options.visibility); for optional_name in optional_types { let module_name = &self.module_name; let module_name_pascal = module_name.to_case(Case::Pascal); let filename = format!("Source/{module_name}/Public/ModuleBindings/Optionals/{module_name_pascal}{optional_name}.g.h"); - let content = generate_optional_type(&optional_name, module, &self.get_api_macro(), self.module_name); + let content = generate_optional_type( + &optional_name, + self.module_prefix, + module, + &self.get_api_macro(), + self.module_name, + ); files.push(OutputFile { filename, code: content, @@ -790,7 +842,14 @@ impl Lang for UnrealCpp<'_> { "Source/{module_name}/Public/ModuleBindings/Results/{module_name_pascal}Result{ok_name}{error_name}.g.h" ); - let content = generate_result_type(&ok_name, &error_name, module, &self.get_api_macro(), self.module_name); + let content = generate_result_type( + self.module_prefix, + &ok_name, + &error_name, + module, + &self.get_api_macro(), + self.module_name, + ); files.push(OutputFile { filename, code: content, @@ -804,40 +863,52 @@ impl Lang for UnrealCpp<'_> { includes.insert("Connection/DbConnectionBase.h".to_string()); includes.insert("Connection/DbConnectionBuilder.h".to_string()); includes.insert("Connection/Subscription.h".to_string()); - includes.insert("Connection/SetReducerFlags.h".to_string()); includes.insert("Connection/Callback.h".to_string()); - includes.insert("ModuleBindings/ReducerBase.g.h".to_string()); + includes.insert(format!("ModuleBindings/{module_prefix}ReducerBase.g.h")); includes.insert("Kismet/BlueprintFunctionLibrary.h".to_string()); // Include reducers for reducer in iter_reducers(module, options.visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{}", reducer.name.deref().to_case(Case::Pascal)); includes.insert(format!("ModuleBindings/Reducers/{reducer_pascal}.g.h")); } // Include procedures for procedure in iter_procedures(module, options.visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_pascal = format!("{module_prefix}{}", procedure.name.deref().to_case(Case::Pascal)); includes.insert(format!("ModuleBindings/Procedures/{procedure_pascal}.g.h")); } // Collect includes for types used in delegates and contexts - // FSpacetimeDBIdentity is used in FOnConnectDelegate and context methods - collect_includes_for_type(module, &AlgebraicTypeUse::Identity, &mut includes, self.module_name); + // FSpacetimeDBIdentity is used in F{module_prefix}OnConnectDelegate and context methods + collect_includes_for_type( + self.module_prefix, + module, + &AlgebraicTypeUse::Identity, + &mut includes, + self.module_name, + ); // FSpacetimeDBConnectionId is used in context methods - collect_includes_for_type(module, &AlgebraicTypeUse::ConnectionId, &mut includes, self.module_name); + collect_includes_for_type( + self.module_prefix, + module, + &AlgebraicTypeUse::ConnectionId, + &mut includes, + self.module_name, + ); // Collect includes for all reducer parameter types for reducer in iter_reducers(module, options.visibility) { for (_param_name, param_type) in &reducer.params_for_generate.elements { - collect_includes_for_type(module, param_type, &mut includes, self.module_name); + collect_includes_for_type(self.module_prefix, module, param_type, &mut includes, self.module_name); } } // Collect includes for all procedure parameter types for procedure in iter_procedures(module, options.visibility) { for (_param_name, param_type) in &procedure.params_for_generate.elements { - collect_includes_for_type(module, param_type, &mut includes, self.module_name); + collect_includes_for_type(self.module_prefix, module, param_type, &mut includes, self.module_name); } collect_includes_for_type( + self.module_prefix, module, &procedure.return_type_for_generate, &mut includes, @@ -852,65 +923,56 @@ impl Lang for UnrealCpp<'_> { // Convert to string references let include_refs: Vec<&str> = include_vec.iter().map(|s| s.as_str()).collect(); - let mut client_h = UnrealCppAutogen::new(&include_refs, "SpacetimeDBClient", true); + let self_header = format!("{module_prefix}SpacetimeDBClient"); + let mut client_h = UnrealCppAutogen::new(&include_refs, &self_header, true); // Forward declarations writeln!(client_h, "// Forward declarations"); - writeln!(client_h, "class UDbConnection;"); - writeln!(client_h, "class URemoteTables;"); - writeln!(client_h, "class URemoteReducers;"); - writeln!(client_h, "class URemoteProcedures;"); - writeln!(client_h, "class USubscriptionBuilder;"); - writeln!(client_h, "class USubscriptionHandle;"); + writeln!(client_h, "class U{module_prefix}DbConnection;"); + writeln!(client_h, "class U{module_prefix}RemoteTables;"); + writeln!(client_h, "class U{module_prefix}RemoteReducers;"); + writeln!(client_h, "class U{module_prefix}RemoteProcedures;"); + writeln!(client_h, "class U{module_prefix}SubscriptionBuilder;"); + writeln!(client_h, "class U{module_prefix}SubscriptionHandle;"); writeln!(client_h); writeln!(client_h, "/** Forward declaration for tables */"); for (_, accessor_name, _) in iter_table_names_and_types(module, options.visibility) { - writeln!(client_h, "class U{}Table;", accessor_name.deref().to_case(Case::Pascal)); + writeln!( + client_h, + "class U{module_prefix}{}Table;", + accessor_name.deref().to_case(Case::Pascal) + ); } writeln!(client_h, "/***/"); writeln!(client_h); // Delegates first (as in manual) - generate_delegates(&mut client_h); + generate_delegates(&mut client_h, self.module_prefix); // Context structs generate_context_structs( &mut client_h, module, options.visibility, + self.module_prefix, &self.get_api_macro(), &self.module_name.to_case(Case::Pascal), ); - // SetReducerFlags class - inherits from USetReducerFlagsBase - writeln!(client_h, "UCLASS(BlueprintType)"); - writeln!( - client_h, - "class {} USetReducerFlags : public USetReducerFlagsBase", - self.get_api_macro() - ); - writeln!(client_h, "{{"); - writeln!(client_h, "\tGENERATED_BODY()"); - writeln!(client_h); - writeln!(client_h, "public:"); - - for reducer in iter_reducers(module, options.visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); - writeln!(client_h, "\tUFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); - writeln!(client_h, "\tvoid {reducer_pascal}(ECallReducerFlags Flag);"); - } - - writeln!(client_h); - writeln!(client_h, "}};"); - writeln!(client_h); - // RemoteTables class - generate_remote_tables_class(&mut client_h, module, options.visibility, &self.get_api_macro()); + generate_remote_tables_class( + &mut client_h, + self.module_prefix, + module, + options.visibility, + &self.get_api_macro(), + ); // RemoteReducers class generate_remote_reducers_class( &mut client_h, + self.module_prefix, module, options.visibility, &self.get_api_macro(), @@ -920,6 +982,7 @@ impl Lang for UnrealCpp<'_> { // RemoteProcedures class generate_remote_procedures_class( &mut client_h, + self.module_prefix, module, options.visibility, &self.get_api_macro(), @@ -927,45 +990,58 @@ impl Lang for UnrealCpp<'_> { ); // SubscriptionBuilder class - generate_subscription_builder_class(&mut client_h, &self.get_api_macro()); + generate_subscription_builder_class(&mut client_h, self.module_prefix, &self.get_api_macro()); // SubscriptionHandle class - generate_subscription_handle_class(&mut client_h, &self.get_api_macro()); + generate_subscription_handle_class(&mut client_h, self.module_prefix, &self.get_api_macro()); // DbConnectionBuilder class - generate_db_connection_builder_class(&mut client_h, &self.get_api_macro()); + generate_db_connection_builder_class(&mut client_h, self.module_prefix, &self.get_api_macro()); // Main DbConnection class - generate_db_connection_class(&mut client_h, module, &self.get_api_macro()); + generate_db_connection_class( + &mut client_h, + self.module_prefix, + self.module_name, + module, + &self.get_api_macro(), + ); // Generate the separate ReducerBase file - let mut reducer_base_header = UnrealCppAutogen::new(&[], "ReducerBase", false); + let reducer_base_header_name = format!("{module_prefix}ReducerBase"); + let mut reducer_base_header = UnrealCppAutogen::new(&[], &reducer_base_header_name, false); - // Generate the UReducerBase class + // Generate the U{module_prefix}ReducerBase class writeln!(reducer_base_header, "// Abstract Reducer base class"); writeln!(reducer_base_header, "UCLASS(Abstract, BlueprintType)"); writeln!( reducer_base_header, - "class {} UReducerBase : public UObject", + "class {} U{module_prefix}ReducerBase : public UObject", self.get_api_macro() ); writeln!(reducer_base_header, "{{"); writeln!(reducer_base_header, " GENERATED_BODY()"); writeln!(reducer_base_header); writeln!(reducer_base_header, "public:"); - writeln!(reducer_base_header, " virtual ~UReducerBase() = default;"); + writeln!( + reducer_base_header, + " virtual ~U{module_prefix}ReducerBase() = default;" + ); writeln!(reducer_base_header, "}};"); writeln!(reducer_base_header); files.push(OutputFile { - filename: format!("Source/{}/Public/ModuleBindings/ReducerBase.g.h", self.module_name), + filename: format!( + "Source/{}/Public/ModuleBindings/{module_prefix}ReducerBase.g.h", + self.module_name + ), code: reducer_base_header.into_inner(), }); files.push(OutputFile { filename: format!( - "Source/{}/Public/ModuleBindings/SpacetimeDBClient.g.h", - self.module_name + "Source/{}/Public/ModuleBindings/{module_prefix}SpacetimeDBClient.g.h", + self.module_name, ), code: client_h.into_inner(), }); @@ -975,13 +1051,14 @@ impl Lang for UnrealCpp<'_> { .map(|(_, accessor_name, _)| { format!( "ModuleBindings/Tables/{}Table.g.h", - accessor_name.deref().to_case(Case::Pascal) //type_ref_name(module, product_type_ref) + format_args!("{module_prefix}{}", accessor_name.deref().to_case(Case::Pascal)) ) }) .collect(); let table_includes_str: Vec<&str> = table_includes.iter().map(|s| s.as_str()).collect(); - let mut cpp_includes = vec!["ModuleBindings/SpacetimeDBClient.g.h"]; + let spacetime_include = format!("ModuleBindings/{module_prefix}SpacetimeDBClient.g.h"); + let mut cpp_includes = vec![spacetime_include.as_str()]; // Add additional includes from manual reference cpp_includes.extend_from_slice(&["DBCache/WithBsatn.h", "BSATN/UEBSATNHelpers.h"]); @@ -990,11 +1067,17 @@ impl Lang for UnrealCpp<'_> { cpp_includes.extend(table_includes_str); let mut client_cpp = UnrealCppAutogen::new_cpp(&cpp_includes); - generate_client_implementation(&mut client_cpp, module, options.visibility, self.module_name); + generate_client_implementation( + &mut client_cpp, + module, + options.visibility, + self.module_prefix, + self.module_name, + ); files.push(OutputFile { filename: format!( - "Source/{}/Private/ModuleBindings/SpacetimeDBClient.g.cpp", - self.module_name + "Source/{}/Private/ModuleBindings/{module_prefix}SpacetimeDBClient.g.cpp", + self.module_name, ), code: client_cpp.into_inner(), }); @@ -1004,11 +1087,11 @@ impl Lang for UnrealCpp<'_> { let schema = TableSchema::from_module_def(module, table, (), 0.into()) .validated() .expect("table schema should validate"); - let table_cpp_content = generate_table_cpp(module, table, self.module_name, &schema); + let table_cpp_content = generate_table_cpp(self.module_prefix, module, table, self.module_name, &schema); let table_cpp_filename = format!( "Source/{}/Private/ModuleBindings/Tables/{}Table.g.cpp", self.module_name, - table.name.deref().to_case(Case::Pascal) //type_ref_name(module, table.product_type_ref) + format_args!("{module_prefix}{}", table.name.deref().to_case(Case::Pascal)) ); files.push(OutputFile { filename: table_cpp_filename, @@ -1020,11 +1103,11 @@ impl Lang for UnrealCpp<'_> { let schema = TableSchema::from_view_def_for_codegen(module, view) .validated() .expect("Failed to generate table due to validation errors"); - let view_cpp_content = generate_table_cpp(module, &tbl, self.module_name, &schema); + let view_cpp_content = generate_table_cpp(self.module_prefix, module, &tbl, self.module_name, &schema); let view_cpp_filename = format!( "Source/{}/Private/ModuleBindings/Tables/{}Table.g.cpp", self.module_name, - view.name.deref().to_case(Case::Pascal) //type_ref_name(module, view.product_type_ref) + format_args!("{module_prefix}{}", view.name.deref().to_case(Case::Pascal)) ); files.push(OutputFile { filename: view_cpp_filename, @@ -1037,9 +1120,15 @@ impl Lang for UnrealCpp<'_> { } // Helper function to generate table .cpp implementation files -fn generate_table_cpp(module: &ModuleDef, table: &TableDef, module_name: &str, schema: &TableSchema) -> String { - let table_pascal = table.name.deref().to_case(Case::Pascal); - let struct_name = type_ref_name(module, table.product_type_ref); +fn generate_table_cpp( + module_prefix: &str, + module: &ModuleDef, + table: &TableDef, + module_name: &str, + schema: &TableSchema, +) -> String { + let table_pascal = format!("{module_prefix}{}", table.name.deref().to_case(Case::Pascal)); + let struct_name = type_ref_name(module_prefix, module, table.product_type_ref); let row_struct = format!("F{struct_name}Type"); // Include the table header and other necessary headers @@ -1071,7 +1160,7 @@ fn generate_table_cpp(module: &ModuleDef, table: &TableDef, module_name: &str, s if let Some(col) = columns.as_singleton() { let (f_name, f_ty) = &product_type.unwrap().elements[col.idx()]; let _field_name = f_name.deref().to_case(Case::Pascal); - let field_type = cpp_ty_fmt_with_module(module, f_ty, module_name).to_string(); + let field_type = cpp_ty_fmt_with_module(module_prefix, module, f_ty, module_name).to_string(); let index_name = accessor_name.deref().to_case(Case::Pascal); unique_indexes.push((index_name, field_type, f_name.deref().to_string())); } @@ -1086,7 +1175,7 @@ fn generate_table_cpp(module: &ModuleDef, table: &TableDef, module_name: &str, s .map(|col| { let (f_name, f_ty) = &product_type.unwrap().elements[col.idx()]; let field_name = f_name.deref().to_case(Case::Pascal); - let field_type = cpp_ty_fmt_with_module(module, f_ty, module_name).to_string(); + let field_type = cpp_ty_fmt_with_module(module_prefix, module, f_ty, module_name).to_string(); (field_name, field_type) }) .collect(); @@ -1172,17 +1261,29 @@ fn generate_table_cpp(module: &ModuleDef, table: &TableDef, module_name: &str, s "FTableAppliedDiff<{row_struct}> U{table_pascal}Table::Update(TArray> InsertsRef, TArray> DeletesRef)" ); writeln!(output, "{{"); - writeln!( - output, - " FTableAppliedDiff<{row_struct}> Diff = BaseUpdate<{row_struct}>(InsertsRef, DeletesRef, Data, TableName);" - ); + if table.is_event { + writeln!( + output, + " // Event tables are callback-only: do not persist rows in the local cache." + ); + writeln!(output, " FTableAppliedDiff<{row_struct}> Diff;"); + writeln!(output, " for (const FWithBsatn<{row_struct}>& Insert : InsertsRef)"); + writeln!(output, " {{"); + writeln!(output, " Diff.Inserts.Add(Insert.Bsatn, Insert.Row);"); + writeln!(output, " }}"); + } else { + writeln!( + output, + " FTableAppliedDiff<{row_struct}> Diff = BaseUpdate<{row_struct}>(InsertsRef, DeletesRef, Data, TableName);" + ); + } writeln!(output); - // Add DeriveUpdatesByPrimaryKey if table has a primary key - if let Some(pk) = schema.pk() { + // Add DeriveUpdatesByPrimaryKey for persistent tables with a primary key. + if let (false, Some(pk)) = (table.is_event, schema.pk()) { let pk_field_name = pk.col_name.deref().to_case(Case::Pascal); let pk_type = &product_type.unwrap().elements[pk.col_pos.idx()].1; - let pk_type_str = cpp_ty_fmt_with_module(module, pk_type, module_name).to_string(); + let pk_type_str = cpp_ty_fmt_with_module(module_prefix, module, pk_type, module_name).to_string(); writeln!(output, " Diff.DeriveUpdatesByPrimaryKey<{pk_type_str}>("); writeln!(output, " [](const {row_struct}& Row) "); writeln!(output, " {{"); @@ -1226,7 +1327,7 @@ fn generate_table_cpp(module: &ModuleDef, table: &TableDef, module_name: &str, s // Helper functions for generating the consolidated SpacetimeDBClient file -fn generate_delegates(output: &mut UnrealCppAutogen) { +fn generate_delegates(output: &mut UnrealCppAutogen, module_prefix: &str) { writeln!( output, "// Delegates using the generated connection type. These wrap the base" @@ -1235,16 +1336,19 @@ fn generate_delegates(output: &mut UnrealCppAutogen) { output, "// delegates defined in the SDK so that projects can work directly with" ); - writeln!(output, "// UDbConnection without manual casting in user code."); + writeln!( + output, + "// U{module_prefix}DbConnection without manual casting in user code." + ); writeln!(output, "DECLARE_DYNAMIC_DELEGATE_ThreeParams("); - writeln!(output, "\tFOnConnectDelegate,"); - writeln!(output, "\tUDbConnection*, Connection,"); + writeln!(output, "\tF{module_prefix}OnConnectDelegate,"); + writeln!(output, "\tU{module_prefix}DbConnection*, Connection,"); writeln!(output, "\tFSpacetimeDBIdentity, Identity,"); writeln!(output, "\tconst FString&, Token);"); writeln!(output); writeln!(output, "DECLARE_DYNAMIC_DELEGATE_TwoParams("); - writeln!(output, "\tFOnDisconnectDelegate,"); - writeln!(output, "\tUDbConnection*, Connection,"); + writeln!(output, "\tF{module_prefix}OnDisconnectDelegate,"); + writeln!(output, "\tU{module_prefix}DbConnection*, Connection,"); writeln!(output, "\tconst FString&, Error);"); writeln!(output); writeln!(output); @@ -1254,33 +1358,34 @@ fn generate_context_structs( output: &mut UnrealCppAutogen, module: &ModuleDef, visibility: CodegenVisibility, + module_prefix: &str, api_macro: &str, module_name: &str, ) { writeln!(output, "// Context classes for event handling"); writeln!(output); writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FContextBase"); + writeln!(output, "struct {api_macro} F{module_prefix}ContextBase"); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); writeln!( output, - "\tFContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Procedures(nullptr), Conn(nullptr) {{}};" + "\tF{module_prefix}ContextBase() : Db(nullptr), Reducers(nullptr), Procedures(nullptr), Conn(nullptr) {{}};" + ); + writeln!( + output, + "\tF{module_prefix}ContextBase(U{module_prefix}DbConnection* InConn);" ); - writeln!(output, "\tFContextBase(UDbConnection* InConn);"); - writeln!(output); - writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, "\tURemoteTables* Db;"); writeln!(output); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, "\tURemoteReducers* Reducers;"); + writeln!(output, "\tU{module_prefix}RemoteTables* Db;"); writeln!(output); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, "\tUSetReducerFlags* SetReducerFlags;"); + writeln!(output, "\tU{module_prefix}RemoteReducers* Reducers;"); writeln!(output); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, "\tURemoteProcedures* Procedures;"); + writeln!(output, "\tU{module_prefix}RemoteProcedures* Procedures;"); writeln!(output); writeln!(output, "\tbool IsActive() const;"); writeln!(output, "\tvoid Disconnect();"); @@ -1289,20 +1394,20 @@ fn generate_context_structs( "\tbool TryGetIdentity(FSpacetimeDBIdentity& OutIdentity) const;" ); writeln!(output, "\tFSpacetimeDBConnectionId GetConnectionId() const;"); - writeln!(output, "\tUSubscriptionBuilder* SubscriptionBuilder();"); + writeln!(output, "\tU{module_prefix}SubscriptionBuilder* SubscriptionBuilder();"); writeln!(output); writeln!(output, "protected:"); writeln!(output, "\tUPROPERTY()"); - writeln!(output, "\tUDbConnection* Conn;"); + writeln!(output, "\tU{module_prefix}DbConnection* Conn;"); writeln!(output); writeln!(output, "}};"); writeln!(output); - // BPLib for FContextBase - Needed to allow inheritance in Blueprint + // BPLib for F{module_prefix}ContextBase - Needed to allow inheritance in Blueprint writeln!(output, "UCLASS()"); writeln!( output, - "class {api_macro} UContextBaseBpLib : public UBlueprintFunctionLibrary" + "class {api_macro} U{module_prefix}ContextBaseBpLib : public UBlueprintFunctionLibrary" ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); @@ -1312,38 +1417,31 @@ fn generate_context_structs( writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")"); writeln!( output, - "\tstatic URemoteTables* GetDb(const FContextBase& Ctx) {{ return Ctx.Db; }}" + "\tstatic U{module_prefix}RemoteTables* GetDb(const F{module_prefix}ContextBase& Ctx) {{ return Ctx.Db; }}" ); writeln!(output); writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")"); writeln!( output, - "\tstatic URemoteReducers* GetReducers(const FContextBase& Ctx) {{ return Ctx.Reducers; }}" + "\tstatic U{module_prefix}RemoteReducers* GetReducers(const F{module_prefix}ContextBase& Ctx) {{ return Ctx.Reducers; }}" ); writeln!(output); - writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")"); writeln!( output, - "\tstatic USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) {{ return Ctx.SetReducerFlags; }}" - ); - writeln!(output); - writeln!( - output, - "\tstatic URemoteProcedures* GetProcedures(const FContextBase& Ctx) {{ return Ctx.Procedures; }}" + "\tstatic U{module_prefix}RemoteProcedures* GetProcedures(const F{module_prefix}ContextBase& Ctx) {{ return Ctx.Procedures; }}" ); writeln!(output); writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")"); writeln!( output, - "\tstatic bool IsActive(const FContextBase& Ctx) {{ return Ctx.IsActive(); }}" + "\tstatic bool IsActive(const F{module_prefix}ContextBase& Ctx) {{ return Ctx.IsActive(); }}" ); writeln!(output, "}};"); writeln!(output); - generate_reducer_bindings(output, module, visibility, api_macro, module_name); - generate_procedure_bindings(output, module, visibility, api_macro, module_name); - + generate_reducer_bindings(output, module_prefix, module, visibility, api_macro, module_name); + generate_procedure_bindings(output, module_prefix, module, visibility, api_macro, module_name); // {}Event: union-like struct representing SpacetimeDB event messages writeln!(output, "/** Represents event with variant message data. */"); writeln!(output, "USTRUCT(BlueprintType)"); @@ -1356,7 +1454,10 @@ fn generate_context_structs( output, "\t/** Tagged union holding reducer call, unit events, or error string */" ); - writeln!(output, "\tTVariant MessageData;"); + writeln!( + output, + "\tTVariant MessageData;" + ); writeln!(output); writeln!(output, "\t/** Type tag indicating what this event represents */"); @@ -1369,11 +1470,14 @@ fn generate_context_structs( // === Static factory methods === writeln!(output, "\t/** === Static factory methods ===*/"); - writeln!(output, "\tstatic F{module_name}Event Reducer(const FReducer& Value)"); + writeln!( + output, + "\tstatic F{module_name}Event Reducer(const F{module_prefix}Reducer& Value)" + ); writeln!(output, "\t{{"); writeln!(output, "\t\tF{module_name}Event Obj;"); writeln!(output, "\t\tObj.Tag = ESpacetimeDBEventTag::Reducer;"); - writeln!(output, "\t\tObj.MessageData.Set(Value);"); + writeln!(output, "\t\tObj.MessageData.Set(Value);"); writeln!(output, "\t\treturn Obj;"); writeln!(output, "\t}}"); writeln!(output); @@ -1413,6 +1517,18 @@ fn generate_context_structs( writeln!(output, "\t}}"); writeln!(output); + writeln!( + output, + "\tstatic F{module_name}Event Transaction(const FSpacetimeDBUnit& Value)" + ); + writeln!(output, "\t{{"); + writeln!(output, "\t\tF{module_name}Event Obj;"); + writeln!(output, "\t\tObj.Tag = ESpacetimeDBEventTag::Transaction;"); + writeln!(output, "\t\tObj.MessageData.Set(Value);"); + writeln!(output, "\t\treturn Obj;"); + writeln!(output, "\t}}"); + writeln!(output); + writeln!( output, "\tstatic F{module_name}Event SubscribeError(const FString& Value)" @@ -1442,13 +1558,13 @@ fn generate_context_structs( output, "\tFORCEINLINE bool IsReducer() const {{ return Tag == ESpacetimeDBEventTag::Reducer; }}" ); - writeln!(output, "\tFORCEINLINE FReducer GetAsReducer() const"); + writeln!(output, "\tFORCEINLINE F{module_prefix}Reducer GetAsReducer() const"); writeln!(output, "\t{{"); writeln!( output, "\t\tensureMsgf(IsReducer(), TEXT(\"MessageData does not hold Reducer!\"));" ); - writeln!(output, "\t\treturn MessageData.Get();"); + writeln!(output, "\t\treturn MessageData.Get();"); writeln!(output, "\t}}"); writeln!(output); writeln!( @@ -1490,6 +1606,19 @@ fn generate_context_structs( writeln!(output, "\t\treturn MessageData.Get();"); writeln!(output, "\t}}"); writeln!(output); + writeln!( + output, + "\tFORCEINLINE bool IsTransaction() const {{ return Tag == ESpacetimeDBEventTag::Transaction; }}" + ); + writeln!(output, "\tFORCEINLINE FSpacetimeDBUnit GetAsTransaction() const"); + writeln!(output, "\t{{"); + writeln!( + output, + "\t\tensureMsgf(IsTransaction(), TEXT(\"MessageData does not hold Transaction!\"));" + ); + writeln!(output, "\t\treturn MessageData.Get();"); + writeln!(output, "\t}}"); + writeln!(output); writeln!( output, "\tFORCEINLINE bool IsSubscribeError() const {{ return Tag == ESpacetimeDBEventTag::SubscribeError; }}" @@ -1536,6 +1665,10 @@ fn generate_context_structs( output, "\t\tcase ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected();" ); + writeln!( + output, + "\t\tcase ESpacetimeDBEventTag::Transaction: return GetAsTransaction() == Other.GetAsTransaction();" + ); writeln!( output, "\t\tcase ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError();" @@ -1574,7 +1707,7 @@ fn generate_context_structs( ); writeln!( output, - " static F{module_name}Event Reducer(const FReducer& InValue)" + " static F{module_name}Event Reducer(const F{module_prefix}Reducer& InValue)" ); writeln!(output, " {{"); writeln!(output, " return F{module_name}Event::Reducer(InValue);"); @@ -1626,6 +1759,20 @@ fn generate_context_structs( writeln!(output, " }}"); writeln!(output); + // Transaction + writeln!( + output, + " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB|{module_name}Event\")" + ); + writeln!( + output, + " static F{module_name}Event Transaction(const FSpacetimeDBUnit& InValue)" + ); + writeln!(output, " {{"); + writeln!(output, " return F{module_name}Event::Transaction(InValue);"); + writeln!(output, " }}"); + writeln!(output); + // SubscribeError writeln!( output, @@ -1663,6 +1810,7 @@ fn generate_context_structs( "SubscribeApplied", "UnsubscribeApplied", "Disconnected", + "Transaction", "SubscribeError", "UnknownTransaction", ] { @@ -1684,7 +1832,7 @@ fn generate_context_structs( ); writeln!( output, - " static FReducer GetAsReducer(const F{module_name}Event& Event)" + " static F{module_prefix}Reducer GetAsReducer(const F{module_name}Event& Event)" ); writeln!(output, " {{"); writeln!(output, " return Event.GetAsReducer();"); @@ -1730,6 +1878,19 @@ fn generate_context_structs( writeln!(output, " }}"); writeln!(output); + writeln!( + output, + " UFUNCTION(BlueprintPure, Category = \"SpacetimeDB|{module_name}Event\")" + ); + writeln!( + output, + " static FSpacetimeDBUnit GetAsTransaction(const F{module_name}Event& Event)" + ); + writeln!(output, " {{"); + writeln!(output, " return Event.GetAsTransaction();"); + writeln!(output, " }}"); + writeln!(output); + writeln!( output, " UFUNCTION(BlueprintPure, Category = \"SpacetimeDB|{module_name}Event\")" @@ -1759,17 +1920,20 @@ fn generate_context_structs( writeln!(output, "}};"); writeln!(output); - // FEventContext, FReducerEventContext, FErrorContext, FSubscriptionEventContext + // F{module_prefix}EventContext, F{module_prefix}ReducerEventContext, F{module_prefix}ErrorContext, F{module_prefix}SubscriptionEventContext writeln!(output); writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FEventContext : public FContextBase"); + writeln!( + output, + "struct {api_macro} F{module_prefix}EventContext : public F{module_prefix}ContextBase" + ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); - writeln!(output, "\tFEventContext() = default;"); + writeln!(output, "\tF{module_prefix}EventContext() = default;"); writeln!( output, - "\tFEventContext(UDbConnection* InConn, const F{module_name}Event& InEvent) : FContextBase(InConn), Event(InEvent) {{}}" + "\tF{module_prefix}EventContext(U{module_prefix}DbConnection* InConn, const F{module_name}Event& InEvent) : F{module_prefix}ContextBase(InConn), Event(InEvent) {{}}" ); writeln!(output); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); @@ -1777,47 +1941,53 @@ fn generate_context_structs( writeln!(output, "}};"); writeln!(output); - // FReducerEventContext + // F{module_prefix}ReducerEventContext writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FReducerEventContext : public FContextBase"); + writeln!( + output, + "struct {api_macro} F{module_prefix}ReducerEventContext : public F{module_prefix}ContextBase" + ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); - writeln!(output, "\tFReducerEventContext() = default;"); - writeln!(output, "\tFReducerEventContext(UDbConnection* InConn, F{module_name}ReducerEvent InEvent) : FContextBase(InConn), Event(InEvent) {{}}"); + writeln!(output, "\tF{module_prefix}ReducerEventContext() = default;"); + writeln!(output, "\tF{module_prefix}ReducerEventContext(U{module_prefix}DbConnection* InConn, F{module_name}ReducerEvent InEvent) : F{module_prefix}ContextBase(InConn), Event(InEvent) {{}}"); writeln!(output, "\t"); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\") "); writeln!(output, "\tF{module_name}ReducerEvent Event;"); writeln!(output, "}};"); writeln!(output); - // FProcedureEventContext + // F{module_prefix}ProcedureEventContext writeln!(output, "USTRUCT(BlueprintType)"); writeln!( output, - "struct {api_macro} FProcedureEventContext : public FContextBase" + "struct {api_macro} F{module_prefix}ProcedureEventContext : public F{module_prefix}ContextBase" ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); - writeln!(output, "\tFProcedureEventContext() = default;"); - writeln!(output, "\tFProcedureEventContext(UDbConnection* InConn, F{module_name}ProcedureEvent InEvent) : FContextBase(InConn), Event(InEvent) {{}}"); + writeln!(output, "\tF{module_prefix}ProcedureEventContext() = default;"); + writeln!(output, "\tF{module_prefix}ProcedureEventContext(U{module_prefix}DbConnection* InConn, F{module_name}ProcedureEvent InEvent) : F{module_prefix}ContextBase(InConn), Event(InEvent) {{}}"); writeln!(output, "\t"); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\") "); writeln!(output, "\tF{module_name}ProcedureEvent Event;"); writeln!(output, "}};"); writeln!(output); - // FErrorContext + // F{module_prefix}ErrorContext writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FErrorContext : public FContextBase"); + writeln!( + output, + "struct {api_macro} F{module_prefix}ErrorContext : public F{module_prefix}ContextBase" + ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); - writeln!(output, "\tFErrorContext() = default;"); + writeln!(output, "\tF{module_prefix}ErrorContext() = default;"); writeln!( output, - "\tFErrorContext(UDbConnection* InConn, const FString& InError) : FContextBase(InConn), Error(InError) {{}}" + "\tF{module_prefix}ErrorContext(U{module_prefix}DbConnection* InConn, const FString& InError) : F{module_prefix}ContextBase(InConn), Error(InError) {{}}" ); writeln!(output); writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); @@ -1826,35 +1996,36 @@ fn generate_context_structs( writeln!(output, "}};"); writeln!(output); - // FSubscriptionEventContext + // F{module_prefix}SubscriptionEventContext writeln!(output, "USTRUCT(BlueprintType)"); writeln!( output, - "struct {api_macro} FSubscriptionEventContext : public FContextBase" + "struct {api_macro} F{module_prefix}SubscriptionEventContext : public F{module_prefix}ContextBase" ); writeln!(output, "{{"); writeln!(output, "\tGENERATED_BODY()"); writeln!(output); - writeln!(output, "\tFSubscriptionEventContext() = default;"); + writeln!(output, "\tF{module_prefix}SubscriptionEventContext() = default;"); writeln!( output, - "\tFSubscriptionEventContext(UDbConnection* InConn) : FContextBase(InConn) {{}}" + "\tF{module_prefix}SubscriptionEventContext(U{module_prefix}DbConnection* InConn) : F{module_prefix}ContextBase(InConn) {{}}" ); writeln!(output); writeln!(output, "}};"); writeln!(output); writeln!(output, "DECLARE_DYNAMIC_DELEGATE_OneParam("); - writeln!(output, "\tFOnSubscriptionApplied,"); - writeln!(output, "\tFSubscriptionEventContext, Context);"); + writeln!(output, "\tF{module_prefix}OnSubscriptionApplied,"); + writeln!(output, "\tF{module_prefix}SubscriptionEventContext, Context);"); writeln!(output); writeln!(output, "DECLARE_DYNAMIC_DELEGATE_OneParam("); - writeln!(output, "\tFOnSubscriptionError,"); - writeln!(output, "\tFErrorContext, Context);"); + writeln!(output, "\tF{module_prefix}OnSubscriptionError,"); + writeln!(output, "\tF{module_prefix}ErrorContext, Context);"); writeln!(output); } fn generate_reducer_bindings( output: &mut UnrealCppAutogen, + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, api_macro: &str, @@ -1865,18 +2036,18 @@ fn generate_reducer_bindings( // Per-module typed Reducer tagged union + typed Event // --------------------------------------------------------------------- writeln!(output, "UENUM(BlueprintType, Category = \"SpacetimeDB\")"); - writeln!(output, "enum class EReducerTag : uint8"); + writeln!(output, "enum class E{module_prefix}ReducerTag : uint8"); writeln!(output, "{{"); { let mut first = true; for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); if !first { writeln!(output, ","); } else { first = false; } - write!(output, " {reducer_pascal}"); + write!(output, " {reducer_name}"); } writeln!(output); } @@ -1887,21 +2058,24 @@ fn generate_reducer_bindings( writeln!(output, "}};"); writeln!(output); - // FReducer: tagged union over reducer args, with optional metadata + // F{module_prefix}Reducer: tagged union over reducer args, with optional metadata writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FReducer"); + writeln!(output, "struct {api_macro} F{module_prefix}Reducer"); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); writeln!(output, "public:"); writeln!(output, " UPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, " EReducerTag Tag = static_cast(0);"); + writeln!( + output, + " E{module_prefix}ReducerTag Tag = static_cast(0);" + ); writeln!(output); write!(output, " TVariant<"); { let mut first = true; for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{}", reducer.name.deref().to_case(Case::Pascal)); if !first { write!(output, ", "); } else { @@ -1924,14 +2098,15 @@ fn generate_reducer_bindings( // Static constructors, Is*, GetAs* for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{reducer_name}"); writeln!( output, - " static FReducer {reducer_pascal}(const F{reducer_pascal}Args& Value)" + " static F{module_prefix}Reducer {reducer_name}(const F{reducer_pascal}Args& Value)" ); writeln!(output, " {{"); - writeln!(output, " FReducer Out;"); - writeln!(output, " Out.Tag = EReducerTag::{reducer_pascal};"); + writeln!(output, " F{module_prefix}Reducer Out;"); + writeln!(output, " Out.Tag = E{module_prefix}ReducerTag::{reducer_name};"); writeln!(output, " Out.Data.Set(Value);"); writeln!(output, " Out.ReducerName = TEXT(\"{}\");", reducer.name.deref()); writeln!(output, " return Out;"); @@ -1939,36 +2114,39 @@ fn generate_reducer_bindings( writeln!(output); writeln!( output, - " FORCEINLINE bool Is{reducer_pascal}() const {{ return Tag == EReducerTag::{reducer_pascal}; }}" + " FORCEINLINE bool Is{reducer_name}() const {{ return Tag == E{module_prefix}ReducerTag::{reducer_name}; }}" ); writeln!( output, - " FORCEINLINE F{reducer_pascal}Args GetAs{reducer_pascal}() const" + " FORCEINLINE F{reducer_pascal}Args GetAs{reducer_name}() const" ); writeln!(output, " {{"); writeln!( output, - " ensureMsgf(Is{reducer_pascal}(), TEXT(\"Reducer does not hold {reducer_pascal}!\"));" + " ensureMsgf(Is{reducer_name}(), TEXT(\"Reducer does not hold {reducer_name}!\"));" ); writeln!(output, " return Data.Get();"); writeln!(output, " }}"); writeln!(output); } - writeln!(output, " FORCEINLINE bool operator==(const FReducer& Other) const"); + writeln!( + output, + " FORCEINLINE bool operator==(const F{module_prefix}Reducer& Other) const" + ); writeln!(output, " {{"); writeln!(output, " if (Tag != Other.Tag || ReducerId != Other.ReducerId || RequestId != Other.RequestId || ReducerName != Other.ReducerName) return false;"); writeln!(output, " switch (Tag)"); writeln!(output, " {{"); for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); - writeln!(output, " case EReducerTag::{reducer_pascal}:"); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); + writeln!(output, " case E{module_prefix}ReducerTag::{reducer_name}:"); writeln!( output, - " return GetAs{reducer_pascal}() == Other.GetAs{reducer_pascal}();" + " return GetAs{reducer_name}() == Other.GetAs{reducer_name}();" ); } if reducer_count == 0 { - writeln!(output, " case EReducerTag::None:"); + writeln!(output, " case E{module_prefix}ReducerTag::None:"); writeln!(output, " return true;"); } @@ -1977,16 +2155,16 @@ fn generate_reducer_bindings( writeln!(output, " }}"); writeln!( output, - " FORCEINLINE bool operator!=(const FReducer& Other) const {{ return !(*this == Other); }}" + " FORCEINLINE bool operator!=(const F{module_prefix}Reducer& Other) const {{ return !(*this == Other); }}" ); writeln!(output, "}};"); writeln!(output); - // BPLib for FReducer + // BPLib for F{module_prefix}Reducer writeln!(output, "UCLASS()"); writeln!( output, - "class {api_macro} UReducerBpLib : public UBlueprintFunctionLibrary" + "class {api_macro} U{module_prefix}ReducerBpLib : public UBlueprintFunctionLibrary" ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); @@ -1994,7 +2172,8 @@ fn generate_reducer_bindings( writeln!(output, "private:"); for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{reducer_name}"); // ---- Static constructors ---- writeln!(output); writeln!( @@ -2003,9 +2182,9 @@ fn generate_reducer_bindings( ); writeln!( output, - " static FReducer {reducer_pascal}(const F{reducer_pascal}Args& Value) {{" + " static F{module_prefix}Reducer {reducer_name}(const F{reducer_pascal}Args& Value) {{" ); - writeln!(output, " return FReducer::{reducer_pascal}(Value);"); + writeln!(output, " return F{module_prefix}Reducer::{reducer_name}(Value);"); writeln!(output, " }}"); writeln!(output); @@ -2016,7 +2195,7 @@ fn generate_reducer_bindings( ); writeln!( output, - " static bool Is{reducer_pascal}(const FReducer& Reducer) {{ return Reducer.Is{reducer_pascal}(); }}" + " static bool Is{reducer_name}(const F{module_prefix}Reducer& Reducer) {{ return Reducer.Is{reducer_name}(); }}" ); writeln!(output); @@ -2027,9 +2206,9 @@ fn generate_reducer_bindings( ); writeln!( output, - " static F{reducer_pascal}Args GetAs{reducer_pascal}(const FReducer& Reducer) {{" + " static F{reducer_pascal}Args GetAs{reducer_name}(const F{module_prefix}Reducer& Reducer) {{" ); - writeln!(output, " return Reducer.GetAs{reducer_pascal}();"); + writeln!(output, " return Reducer.GetAs{reducer_name}();"); writeln!(output, " }}"); } @@ -2089,7 +2268,7 @@ fn generate_reducer_bindings( output, "\tUPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"SpacetimeDB\")" ); - writeln!(output, "\tFReducer Reducer;"); + writeln!(output, "\tF{module_prefix}Reducer Reducer;"); writeln!(output); writeln!( @@ -2119,6 +2298,7 @@ fn generate_reducer_bindings( fn generate_procedure_bindings( output: &mut UnrealCppAutogen, + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, api_macro: &str, @@ -2130,39 +2310,42 @@ fn generate_procedure_bindings( // Per-module typed Procedure tagged union + typed Event // --------------------------------------------------------------------- writeln!(output, "UENUM(BlueprintType, Category = \"SpacetimeDB\")"); - writeln!(output, "enum class EProcedureTag : uint8"); + writeln!(output, "enum class E{module_prefix}ProcedureTag : uint8"); writeln!(output, "{{"); { let mut first = true; for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); if !first { writeln!(output, ","); } else { first = false; } - write!(output, " {procedure_pascal}"); + write!(output, " {procedure_name}"); } writeln!(output); } writeln!(output, "}};"); writeln!(output); - // FProcedure: tagged union over procedure args, with optional metadata + // F{module_prefix}Procedure: tagged union over procedure args, with optional metadata writeln!(output, "USTRUCT(BlueprintType)"); - writeln!(output, "struct {api_macro} FProcedure"); + writeln!(output, "struct {api_macro} F{module_prefix}Procedure"); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); writeln!(output, "public:"); writeln!(output, " UPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")"); - writeln!(output, " EProcedureTag Tag = static_cast(0);"); + writeln!( + output, + " E{module_prefix}ProcedureTag Tag = static_cast(0);" + ); writeln!(output); write!(output, " TVariant<"); { let mut first = true; for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_pascal = format!("{module_prefix}{}", procedure.name.deref().to_case(Case::Pascal)); if !first { write!(output, ", "); } else { @@ -2182,14 +2365,18 @@ fn generate_procedure_bindings( // Static constructors, Is*, GetAs* for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); + let procedure_pascal = format!("{module_prefix}{procedure_name}"); writeln!( output, - " static FProcedure {procedure_pascal}(const F{procedure_pascal}Args& Value)" + " static F{module_prefix}Procedure {procedure_name}(const F{procedure_pascal}Args& Value)" ); writeln!(output, " {{"); - writeln!(output, " FProcedure Out;"); - writeln!(output, " Out.Tag = EProcedureTag::{procedure_pascal};"); + writeln!(output, " F{module_prefix}Procedure Out;"); + writeln!( + output, + " Out.Tag = E{module_prefix}ProcedureTag::{procedure_name};" + ); writeln!(output, " Out.Data.Set(Value);"); writeln!( output, @@ -2200,33 +2387,36 @@ fn generate_procedure_bindings( writeln!(output, " }}"); writeln!(output); writeln!( - output, - " FORCEINLINE bool Is{procedure_pascal}() const {{ return Tag == EProcedureTag::{procedure_pascal}; }}" - ); + output, + " FORCEINLINE bool Is{procedure_name}() const {{ return Tag == E{module_prefix}ProcedureTag::{procedure_name}; }}" + ); writeln!( output, - " FORCEINLINE F{procedure_pascal}Args GetAs{procedure_pascal}() const" + " FORCEINLINE F{procedure_pascal}Args GetAs{procedure_name}() const" ); writeln!(output, " {{"); writeln!( output, - " ensureMsgf(Is{procedure_pascal}(), TEXT(\"Procedure does not hold {procedure_pascal}!\"));" + " ensureMsgf(Is{procedure_name}(), TEXT(\"Procedure does not hold {procedure_name}!\"));" ); writeln!(output, " return Data.Get();"); writeln!(output, " }}"); writeln!(output); } - writeln!(output, " FORCEINLINE bool operator==(const FProcedure& Other) const"); + writeln!( + output, + " FORCEINLINE bool operator==(const F{module_prefix}Procedure& Other) const" + ); writeln!(output, " {{"); writeln!(output, " if (Tag != Other.Tag || ProcedureId != Other.ProcedureId || RequestId != Other.RequestId || ProcedureName != Other.ProcedureName) return false;"); writeln!(output, " switch (Tag)"); writeln!(output, " {{"); for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); - writeln!(output, " case EProcedureTag::{procedure_pascal}:"); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); + writeln!(output, " case E{module_prefix}ProcedureTag::{procedure_name}:"); writeln!( output, - " return GetAs{procedure_pascal}() == Other.GetAs{procedure_pascal}();" + " return GetAs{procedure_name}() == Other.GetAs{procedure_name}();" ); } writeln!(output, " default: return false;"); @@ -2234,16 +2424,16 @@ fn generate_procedure_bindings( writeln!(output, " }}"); writeln!( output, - " FORCEINLINE bool operator!=(const FProcedure& Other) const {{ return !(*this == Other); }}" + " FORCEINLINE bool operator!=(const F{module_prefix}Procedure& Other) const {{ return !(*this == Other); }}" ); writeln!(output, "}};"); writeln!(output); - // BPLib for FProcedure + // BPLib for F{module_prefix}Procedure writeln!(output, "UCLASS()"); writeln!( output, - "class {api_macro} UProcedureBpLib : public UBlueprintFunctionLibrary" + "class {api_macro} U{module_prefix}ProcedureBpLib : public UBlueprintFunctionLibrary" ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); @@ -2251,7 +2441,8 @@ fn generate_procedure_bindings( writeln!(output, "private:"); for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); + let procedure_pascal = format!("{module_prefix}{procedure_name}"); // ---- Static constructors ---- writeln!(output); writeln!( @@ -2260,9 +2451,12 @@ fn generate_procedure_bindings( ); writeln!( output, - " static FProcedure {procedure_pascal}(const F{procedure_pascal}Args& Value) {{" + " static F{module_prefix}Procedure {procedure_name}(const F{procedure_pascal}Args& Value) {{" + ); + writeln!( + output, + " return F{module_prefix}Procedure::{procedure_name}(Value);" ); - writeln!(output, " return FProcedure::{procedure_pascal}(Value);"); writeln!(output, " }}"); writeln!(output); @@ -2273,7 +2467,7 @@ fn generate_procedure_bindings( ); writeln!( output, - " static bool Is{procedure_pascal}(const FProcedure& Procedure) {{ return Procedure.Is{procedure_pascal}(); }}" + " static bool Is{procedure_name}(const F{module_prefix}Procedure& Procedure) {{ return Procedure.Is{procedure_name}(); }}" ); writeln!(output); @@ -2284,9 +2478,9 @@ fn generate_procedure_bindings( ); writeln!( output, - " static F{procedure_pascal}Args GetAs{procedure_pascal}(const FProcedure& Procedure) {{" + " static F{procedure_pascal}Args GetAs{procedure_name}(const F{module_prefix}Procedure& Procedure) {{" ); - writeln!(output, " return Procedure.GetAs{procedure_pascal}();"); + writeln!(output, " return Procedure.GetAs{procedure_name}();"); writeln!(output, " }}"); } @@ -2370,13 +2564,17 @@ fn generate_procedure_bindings( fn generate_remote_tables_class( output: &mut UnrealCppAutogen, + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, api_macro: &str, ) { writeln!(output, "// RemoteTables class"); writeln!(output, "UCLASS(BlueprintType)"); - writeln!(output, "class {api_macro} URemoteTables : public UObject"); + writeln!( + output, + "class {api_macro} U{module_prefix}RemoteTables : public UObject" + ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); @@ -2389,7 +2587,7 @@ fn generate_remote_tables_class( writeln!(output, " UPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); writeln!( output, - " U{}Table* {};", + " U{module_prefix}{}Table* {};", accessor_name.deref().to_case(Case::Pascal), accessor_name.deref().to_case(Case::Pascal) ); @@ -2402,6 +2600,7 @@ fn generate_remote_tables_class( fn generate_remote_reducers_class( output: &mut UnrealCppAutogen, + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, api_macro: &str, @@ -2409,7 +2608,10 @@ fn generate_remote_reducers_class( ) { writeln!(output, "// RemoteReducers class"); writeln!(output, "UCLASS(BlueprintType)"); - writeln!(output, "class {api_macro} URemoteReducers : public UObject"); + writeln!( + output, + "class {api_macro} U{module_prefix}RemoteReducers : public UObject" + ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); @@ -2418,7 +2620,8 @@ fn generate_remote_reducers_class( // Generate reducer events and call methods for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{reducer_name}"); // Generate delegate for reducer event let param_count = reducer.params_for_generate.elements.len() + 1; // +1 for context @@ -2431,19 +2634,19 @@ fn generate_remote_reducers_class( // For more than 9 params, use a struct to wrap the arguments writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams("); writeln!(output, " F{reducer_pascal}Handler,"); - writeln!(output, " const FReducerEventContext&, Context,"); + writeln!(output, " const F{module_prefix}ReducerEventContext&, Context,"); writeln!(output, " const F{reducer_pascal}Args&, Args"); writeln!(output, " );"); // For delegates using args struct, check the actual delegate parameters: - // 1. FReducerEventContext (always blueprintable) + // 1. F{module_prefix}ReducerEventContext (always blueprintable) // 2. F{Reducer}Args struct (always blueprintable as a USTRUCT) // So delegates with args struct are always blueprintable // But functions still need to check individual parameters for (_, param_type) in &reducer.params_for_generate.elements { if !is_type_blueprintable_for_delegates(module, param_type) { - let type_str = cpp_ty_fmt_with_module(module, param_type, module_name).to_string(); + let type_str = cpp_ty_fmt_with_module(module_prefix, module, param_type, module_name).to_string(); non_blueprintable_types_for_function.push(type_str); } } @@ -2464,12 +2667,13 @@ fn generate_remote_reducers_class( write!( output, - " {delegate_macro}(\n F{reducer_pascal}Handler,\n const FReducerEventContext&, Context" + " {delegate_macro}(\n F{reducer_pascal}Handler,\n const F{module_prefix}ReducerEventContext&, Context" ); for (param_name, param_type) in &reducer.params_for_generate.elements { // Use Blueprint-compatible types for delegates - let type_str = cpp_ty_fmt_blueprint_compatible(module, param_type, module_name).to_string(); + let type_str = + cpp_ty_fmt_blueprint_compatible(module_prefix, module, param_type, module_name).to_string(); // Collect non-blueprintable types for both delegate and function if !is_type_blueprintable_for_delegates(module, param_type) { @@ -2507,21 +2711,21 @@ fn generate_remote_reducers_class( " // NOTE: Not exposed to Blueprint because {types_str} types are not Blueprint-compatible" ); } - writeln!(output, " F{reducer_pascal}Handler On{reducer_pascal};"); + writeln!(output, " F{reducer_pascal}Handler On{reducer_name};"); writeln!(output); // Generate call method if non_blueprintable_types_for_function.is_empty() { write!( output, - " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")\n void {reducer_pascal}(" + " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")\n void {reducer_name}(" ); } else { // Generate specific message about which types are not Blueprint-compatible let types_str = non_blueprintable_types_for_function.join(", "); write!( output, - " // NOTE: Not exposed to Blueprint because {types_str} types are not Blueprint-compatible\n void {reducer_pascal}(" + " // NOTE: Not exposed to Blueprint because {types_str} types are not Blueprint-compatible\n void {reducer_name}(" ); } @@ -2534,9 +2738,9 @@ fn generate_remote_reducers_class( // For UFUNCTION parameters, use Blueprint-compatible types let type_str = if non_blueprintable_types_for_function.is_empty() { - cpp_ty_fmt_blueprint_compatible(module, param_type, module_name).to_string() + cpp_ty_fmt_blueprint_compatible(module_prefix, module, param_type, module_name).to_string() } else { - cpp_ty_fmt_with_module(module, param_type, module_name).to_string() + cpp_ty_fmt_with_module(module_prefix, module, param_type, module_name).to_string() }; if should_pass_by_value_in_delegate(module, param_type) { @@ -2563,14 +2767,14 @@ fn generate_remote_reducers_class( // Generate invoke method (UObject version - kept for backwards compatibility) write!( output, - " bool Invoke{reducer_pascal}(const FReducerEventContext& Context, const U{reducer_pascal}Reducer* Args);" + " bool Invoke{reducer_name}(const F{module_prefix}ReducerEventContext& Context, const U{reducer_pascal}Reducer* Args);" ); writeln!(output); // Generate invoke method (FArgs version - zero allocation, used internally) write!( output, - " bool Invoke{reducer_pascal}WithArgs(const FReducerEventContext& Context, const F{reducer_pascal}Args& Args);" + " bool Invoke{reducer_name}WithArgs(const F{module_prefix}ReducerEventContext& Context, const F{reducer_pascal}Args& Args);" ); writeln!(output); writeln!(output); @@ -2578,41 +2782,39 @@ fn generate_remote_reducers_class( // Internal error handling writeln!(output, " // Internal error handling"); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FInternalOnUnhandledReducerError, const FReducerEventContext&, Context, const FString&, Error);"); + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(F{module_prefix}InternalOnUnhandledReducerError, const F{module_prefix}ReducerEventContext&, Context, const FString&, Error);"); writeln!( output, - " FInternalOnUnhandledReducerError InternalOnUnhandledReducerError;" + " F{module_prefix}InternalOnUnhandledReducerError InternalOnUnhandledReducerError;" ); writeln!(output); writeln!(output, "private:"); writeln!(output); - writeln!(output, " friend UDbConnection;"); + writeln!(output, " friend U{module_prefix}DbConnection;"); writeln!(output); writeln!(output, " UPROPERTY()"); - writeln!(output, " class UDbConnection* Conn;"); - writeln!(output); - writeln!(output, " UPROPERTY()"); - writeln!(output, " USetReducerFlags* SetCallReducerFlags;"); + writeln!(output, " class U{module_prefix}DbConnection* Conn;"); writeln!(output, "}};"); writeln!(output); } fn generate_remote_procedures_class( output: &mut UnrealCppAutogen, + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, api_macro: &str, module_name: &str, ) { for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); let blueprintable_type_for_return = is_type_blueprintable_for_delegates(module, &procedure.return_type_for_generate); // In generate_remote_procedures_class, before the existing event delegate generation: let return_type_str = - cpp_ty_fmt_with_module(module, &procedure.return_type_for_generate, module_name).to_string(); + cpp_ty_fmt_with_module(module_prefix, module, &procedure.return_type_for_generate, module_name).to_string(); let return_type_ref = if return_type_str.starts_with('F') && return_type_str != "FSpacetimeDBUnit" { format!("const {}&", return_type_str) } else { @@ -2622,19 +2824,22 @@ fn generate_remote_procedures_class( if !blueprintable_type_for_return { writeln!( output, - "// NOTE: Procedure {procedure_pascal} has non-Blueprint-compatible return type: {return_type_str}" + "// NOTE: Procedure {procedure_name} has non-Blueprint-compatible return type: {return_type_str}" + ); + writeln!( + output, + "DECLARE_DELEGATE_ThreeParams(F{module_prefix}On{procedure_name}Complete," ); - writeln!(output, "DECLARE_DELEGATE_ThreeParams(FOn{procedure_pascal}Complete,"); - writeln!(output, " const FProcedureEventContext&, /*Context*/"); + writeln!(output, " const F{module_prefix}ProcedureEventContext&, /*Context*/"); writeln!(output, " {return_type_ref}, /*Result,*/"); writeln!(output, " bool /*bSuccess*/);"); writeln!(output); } else { writeln!( output, - "DECLARE_DYNAMIC_DELEGATE_ThreeParams(FOn{procedure_pascal}Complete," + "DECLARE_DYNAMIC_DELEGATE_ThreeParams(F{module_prefix}On{procedure_name}Complete," ); - writeln!(output, " const FProcedureEventContext&, Context,"); + writeln!(output, " const F{module_prefix}ProcedureEventContext&, Context,"); writeln!(output, " {}, Result,", return_type_ref); writeln!(output, " bool, bSuccess);"); writeln!(output); @@ -2643,7 +2848,10 @@ fn generate_remote_procedures_class( writeln!(output, "// RemoteProcedures class"); writeln!(output, "UCLASS(BlueprintType)"); - writeln!(output, "class {api_macro} URemoteProcedures : public UObject"); + writeln!( + output, + "class {api_macro} U{module_prefix}RemoteProcedures : public UObject" + ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); @@ -2652,13 +2860,13 @@ fn generate_remote_procedures_class( // Generate procedure events and call methods for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); let mut non_blueprintable_types_for_function = Vec::new(); for (_, param_type) in &procedure.params_for_generate.elements { if !is_type_blueprintable_for_delegates(module, param_type) { - let type_str = cpp_ty_fmt_with_module(module, param_type, module_name).to_string(); + let type_str = cpp_ty_fmt_with_module(module_prefix, module, param_type, module_name).to_string(); non_blueprintable_types_for_function.push(type_str); } } @@ -2669,14 +2877,14 @@ fn generate_remote_procedures_class( if non_blueprintable_types_for_function.is_empty() && blueprintable_type_for_return { write!( output, - " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")\n void {procedure_pascal}(" + " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")\n void {procedure_name}(" ); } else { // Generate specific message about which types are not Blueprint-compatible let types_str = non_blueprintable_types_for_function.join(", "); write!( output, - " // NOTE: Not exposed to Blueprint because return type or {types_str} types are not Blueprint-compatible\n void {procedure_pascal}(" + " // NOTE: Not exposed to Blueprint because return type or {types_str} types are not Blueprint-compatible\n void {procedure_name}(" ); } @@ -2689,9 +2897,9 @@ fn generate_remote_procedures_class( // For UFUNCTION parameters, use Blueprint-compatible types let type_str = if non_blueprintable_types_for_function.is_empty() { - cpp_ty_fmt_blueprint_compatible(module, param_type, module_name).to_string() + cpp_ty_fmt_blueprint_compatible(module_prefix, module, param_type, module_name).to_string() } else { - cpp_ty_fmt_with_module(module, param_type, module_name).to_string() + cpp_ty_fmt_with_module(module_prefix, module, param_type, module_name).to_string() }; if should_pass_by_value_in_delegate(module, param_type) { @@ -2715,7 +2923,7 @@ fn generate_remote_procedures_class( if !first { write!(output, ", "); } - writeln!(output, "FOn{}Complete Callback);", procedure_pascal); + writeln!(output, "F{module_prefix}On{}Complete Callback);", procedure_name); writeln!(output); writeln!(output); @@ -2723,7 +2931,7 @@ fn generate_remote_procedures_class( // Internal error handling writeln!(output, " // Internal error handling"); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FInternalOnUnhandledProcedureError, const FProcedureEventContext&, Context, const FString&, Error);"); + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FInternalOnUnhandledProcedureError, const F{module_prefix}ProcedureEventContext&, Context, const FString&, Error);"); writeln!( output, " FInternalOnUnhandledProcedureError InternalOnUnhandledProcedureError;" @@ -2732,20 +2940,20 @@ fn generate_remote_procedures_class( writeln!(output, "private:"); writeln!(output); - writeln!(output, " friend UDbConnection;"); + writeln!(output, " friend U{module_prefix}DbConnection;"); writeln!(output); writeln!(output, " UPROPERTY()"); - writeln!(output, " class UDbConnection* Conn;"); + writeln!(output, " class U{module_prefix}DbConnection* Conn;"); writeln!(output, "}};"); writeln!(output); } -fn generate_subscription_builder_class(output: &mut UnrealCppAutogen, api_macro: &str) { +fn generate_subscription_builder_class(output: &mut UnrealCppAutogen, module_prefix: &str, api_macro: &str) { writeln!(output, "// SubscriptionBuilder class"); writeln!(output, "UCLASS(BlueprintType)"); writeln!( output, - "class {api_macro} USubscriptionBuilder : public USubscriptionBuilderBase" + "class {api_macro} U{module_prefix}SubscriptionBuilder : public USubscriptionBuilderBase" ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); @@ -2755,19 +2963,19 @@ fn generate_subscription_builder_class(output: &mut UnrealCppAutogen, api_macro: writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " USubscriptionBuilder* OnApplied(FOnSubscriptionApplied Callback);" + " U{module_prefix}SubscriptionBuilder* OnApplied(F{module_prefix}OnSubscriptionApplied Callback);" ); writeln!(output); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " USubscriptionBuilder* OnError(FOnSubscriptionError Callback);" + " U{module_prefix}SubscriptionBuilder* OnError(F{module_prefix}OnSubscriptionError Callback);" ); writeln!(output); writeln!(output, " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")"); writeln!( output, - " USubscriptionHandle* Subscribe(const TArray& SQL);" + " U{module_prefix}SubscriptionHandle* Subscribe(const TArray& SQL);" ); writeln!(output); writeln!( @@ -2775,54 +2983,66 @@ fn generate_subscription_builder_class(output: &mut UnrealCppAutogen, api_macro: " /** Convenience for subscribing to all rows from all tables */" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); - writeln!(output, " USubscriptionHandle* SubscribeToAllTables();"); + writeln!( + output, + " U{module_prefix}SubscriptionHandle* SubscribeToAllTables();" + ); writeln!(output); writeln!(output); - writeln!(output, " friend class UDbConnection;"); + writeln!(output, " friend class U{module_prefix}DbConnection;"); writeln!(output, " friend class UDbConnectionBase;"); writeln!(output); writeln!(output, "protected:"); writeln!(output, " UPROPERTY()"); - writeln!(output, " class UDbConnection* Conn;"); + writeln!(output, " class U{module_prefix}DbConnection* Conn;"); writeln!(output); writeln!( output, " // Delegates stored so Subscribe() can bind forwarding callbacks" ); - writeln!(output, " FOnSubscriptionApplied OnAppliedDelegateInternal;"); - writeln!(output, " FOnSubscriptionError OnErrorDelegateInternal;"); + writeln!( + output, + " F{module_prefix}OnSubscriptionApplied OnAppliedDelegateInternal;" + ); + writeln!( + output, + " F{module_prefix}OnSubscriptionError OnErrorDelegateInternal;" + ); writeln!(output, "}};"); writeln!(output); } -fn generate_subscription_handle_class(output: &mut UnrealCppAutogen, api_macro: &str) { +fn generate_subscription_handle_class(output: &mut UnrealCppAutogen, module_prefix: &str, api_macro: &str) { writeln!(output, "// SubscriptionHandle class"); writeln!(output, "UCLASS(BlueprintType)"); writeln!( output, - "class {api_macro} USubscriptionHandle : public USubscriptionHandleBase" + "class {api_macro} U{module_prefix}SubscriptionHandle : public USubscriptionHandleBase" ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); writeln!(output, "public:"); writeln!(output); - writeln!(output, " USubscriptionHandle() {{}};"); + writeln!(output, " U{module_prefix}SubscriptionHandle() {{}};"); writeln!(output); - writeln!(output, " explicit USubscriptionHandle(UDbConnection* InConn);"); + writeln!( + output, + " explicit U{module_prefix}SubscriptionHandle(U{module_prefix}DbConnection* InConn);" + ); writeln!(output); - writeln!(output, " friend class USubscriptionBuilder;"); + writeln!(output, " friend class U{module_prefix}SubscriptionBuilder;"); writeln!(output); writeln!(output, "private:"); writeln!(output, " UPROPERTY()"); - writeln!(output, " class UDbConnection* Conn;"); + writeln!(output, " class U{module_prefix}DbConnection* Conn;"); writeln!(output); writeln!( output, " // Delegates that expose subscription events with connection aware contexts" ); - writeln!(output, " FOnSubscriptionApplied OnAppliedDelegate;"); - writeln!(output, " FOnSubscriptionError OnErrorDelegate;"); + writeln!(output, " F{module_prefix}OnSubscriptionApplied OnAppliedDelegate;"); + writeln!(output, " F{module_prefix}OnSubscriptionError OnErrorDelegate;"); writeln!(output); writeln!(output, " UFUNCTION()"); writeln!( @@ -2836,50 +3056,56 @@ fn generate_subscription_handle_class(output: &mut UnrealCppAutogen, api_macro: writeln!(output); } -fn generate_db_connection_builder_class(output: &mut UnrealCppAutogen, api_macro: &str) { +fn generate_db_connection_builder_class(output: &mut UnrealCppAutogen, module_prefix: &str, api_macro: &str) { writeln!(output, "/*"); writeln!(output, " @Note: Child class of UDbConnectionBuilderBase."); writeln!(output, "*/"); writeln!(output, "UCLASS(BlueprintType)"); writeln!( output, - "class {api_macro} UDbConnectionBuilder : public UDbConnectionBuilderBase" + "class {api_macro} U{module_prefix}DbConnectionBuilder : public UDbConnectionBuilderBase" ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output, "public:"); writeln!(output); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); - writeln!(output, " UDbConnectionBuilder* WithUri(const FString& InUri);"); + writeln!( + output, + " U{module_prefix}DbConnectionBuilder* WithUri(const FString& InUri);" + ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " UDbConnectionBuilder* WithDatabaseName(const FString& InName);" + " U{module_prefix}DbConnectionBuilder* WithDatabaseName(const FString& InName);" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); - writeln!(output, " UDbConnectionBuilder* WithToken(const FString& InToken);"); + writeln!( + output, + " U{module_prefix}DbConnectionBuilder* WithToken(const FString& InToken);" + ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " UDbConnectionBuilder* WithCompression(const ESpacetimeDBCompression& InCompression);" + " U{module_prefix}DbConnectionBuilder* WithCompression(const ESpacetimeDBCompression& InCompression);" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " UDbConnectionBuilder* OnConnect(FOnConnectDelegate Callback);" + " U{module_prefix}DbConnectionBuilder* OnConnect(F{module_prefix}OnConnectDelegate Callback);" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " UDbConnectionBuilder* OnConnectError(FOnConnectErrorDelegate Callback);" + " U{module_prefix}DbConnectionBuilder* OnConnectError(FOnConnectErrorDelegate Callback);" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); writeln!( output, - " UDbConnectionBuilder* OnDisconnect(FOnDisconnectDelegate Callback);" + " U{module_prefix}DbConnectionBuilder* OnDisconnect(F{module_prefix}OnDisconnectDelegate Callback);" ); writeln!(output, " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\")"); - writeln!(output, " UDbConnection* Build();"); + writeln!(output, " U{module_prefix}DbConnection* Build();"); writeln!(output); writeln!(output, "private:"); writeln!(output); @@ -2887,64 +3113,85 @@ fn generate_db_connection_builder_class(output: &mut UnrealCppAutogen, api_macro output, " // Stored delegates which will be forwarded when the connection events occur." ); - writeln!(output, " FOnConnectDelegate OnConnectDelegateInternal;"); - writeln!(output, " FOnDisconnectDelegate OnDisconnectDelegateInternal;"); + writeln!( + output, + " F{module_prefix}OnConnectDelegate OnConnectDelegateInternal;" + ); + writeln!( + output, + " F{module_prefix}OnDisconnectDelegate OnDisconnectDelegateInternal;" + ); writeln!(output, "}};"); writeln!(output); } -fn generate_db_connection_class(output: &mut UnrealCppAutogen, _module: &ModuleDef, api_macro: &str) { +fn generate_db_connection_class( + output: &mut UnrealCppAutogen, + module_prefix: &str, + module_name: &str, + _module: &ModuleDef, + api_macro: &str, +) { writeln!(output, "// Main DbConnection class"); writeln!(output, "UCLASS(BlueprintType)"); - writeln!(output, "class {api_macro} UDbConnection : public UDbConnectionBase"); + writeln!( + output, + "class {api_macro} U{module_prefix}DbConnection : public UDbConnectionBase" + ); writeln!(output, "{{"); writeln!(output, " GENERATED_BODY()"); writeln!(output); writeln!(output, "public:"); writeln!( output, - " explicit UDbConnection(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());" + " explicit U{module_prefix}DbConnection(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());" ); writeln!(output); writeln!(output); writeln!(output, " UPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); - writeln!(output, " URemoteTables* Db;"); - writeln!(output); - writeln!(output, " UPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); - writeln!(output, " URemoteReducers* Reducers;"); + writeln!(output, " U{module_prefix}RemoteTables* Db;"); writeln!(output); writeln!(output, " UPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); - writeln!(output, " USetReducerFlags* SetReducerFlags;"); + writeln!(output, " U{module_prefix}RemoteReducers* Reducers;"); writeln!(output); writeln!(output, " UPROPERTY(BlueprintReadOnly, Category=\"SpacetimeDB\")"); - writeln!(output, " URemoteProcedures* Procedures;"); + writeln!(output, " U{module_prefix}RemoteProcedures* Procedures;"); writeln!(output); writeln!( output, " // Delegates that allow users to bind with the concrete connection type." ); - writeln!(output, " FOnConnectDelegate OnConnectDelegate;"); - writeln!(output, " FOnDisconnectDelegate OnDisconnectDelegate;"); + writeln!(output, " F{module_prefix}OnConnectDelegate OnConnectDelegate;"); + writeln!(output, " F{module_prefix}OnDisconnectDelegate OnDisconnectDelegate;"); writeln!(output); writeln!(output, " UFUNCTION(BlueprintCallable, Category=\"SpacetimeDB\")"); - writeln!(output, " USubscriptionBuilder* SubscriptionBuilder();"); + writeln!( + output, + " U{module_prefix}SubscriptionBuilder* SubscriptionBuilder();" + ); writeln!(output); writeln!(output, " /** Static entry point for constructing a connection. */"); writeln!( output, - " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\", DisplayName = \"SpacetimeDB Builder\")" + " UFUNCTION(BlueprintCallable, Category = \"SpacetimeDB\", DisplayName = \"SpacetimeDB {module_name} Builder\")" ); - writeln!(output, " static UDbConnectionBuilder* Builder();"); + writeln!(output, " static U{module_prefix}DbConnectionBuilder* Builder();"); writeln!(output); writeln!(output, " // Error handling"); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnUnhandledReducerError, const FReducerEventContext&, Context, const FString&, Error);"); + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(F{module_prefix}OnUnhandledReducerError, const F{module_prefix}ReducerEventContext&, Context, const FString&, Error);"); writeln!(output, " UPROPERTY(BlueprintAssignable, Category=\"SpacetimeDB\")"); - writeln!(output, " FOnUnhandledReducerError OnUnhandledReducerError;"); + writeln!( + output, + " F{module_prefix}OnUnhandledReducerError OnUnhandledReducerError;" + ); writeln!(output); writeln!(output, " // Error handling"); - writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnUnhandledProcedureError, const FProcedureEventContext&, Context, const FString&, Error);"); + writeln!(output, " DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(F{module_prefix}OnUnhandledProcedureError, const F{module_prefix}ProcedureEventContext&, Context, const FString&, Error);"); writeln!(output, " UPROPERTY(BlueprintAssignable, Category=\"SpacetimeDB\")"); - writeln!(output, " FOnUnhandledProcedureError OnUnhandledProcedureError;"); + writeln!( + output, + " F{module_prefix}OnUnhandledProcedureError OnUnhandledProcedureError;" + ); writeln!(output); writeln!(output); writeln!(output, "protected:"); @@ -2963,13 +3210,13 @@ fn generate_db_connection_class(output: &mut UnrealCppAutogen, _module: &ModuleD writeln!(output, " UFUNCTION()"); writeln!( output, - " void OnUnhandledReducerErrorHandler(const FReducerEventContext& Context, const FString& Error);" + " void OnUnhandledReducerErrorHandler(const F{module_prefix}ReducerEventContext& Context, const FString& Error);" ); writeln!(output); writeln!(output, " UFUNCTION()"); writeln!( output, - " void OnUnhandledProcedureErrorHandler(const FProcedureEventContext& Context, const FString& Error);" + " void OnUnhandledProcedureErrorHandler(const F{module_prefix}ProcedureEventContext& Context, const FString& Error);" ); writeln!(output); writeln!( @@ -3000,6 +3247,33 @@ fn generate_db_connection_class(output: &mut UnrealCppAutogen, _module: &ModuleD output, " virtual void ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) override;" ); + writeln!(output); + writeln!(output, " friend class U{module_prefix}SubscriptionBuilder;"); + writeln!(output, " friend class U{module_prefix}DbConnectionBuilder;"); + writeln!(output, " friend class U{module_prefix}RemoteReducers;"); + writeln!(output); + writeln!( + output, + " // Internal reducer correlation helpers (request_id -> typed reducer)" + ); + writeln!( + output, + " void RegisterPendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer Reducer);" + ); + writeln!( + output, + " bool TryGetPendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer& OutReducer) const;" + ); + writeln!( + output, + " bool TryTakePendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer& OutReducer);" + ); + writeln!(output); + writeln!(output, "private:"); + writeln!( + output, + " TMap PendingTypedReducers;" + ); writeln!(output, "}};"); writeln!(output); } @@ -3008,70 +3282,40 @@ fn generate_client_implementation( output: &mut UnrealCppAutogen, module: &ModuleDef, visibility: CodegenVisibility, + module_prefix: &str, module_name: &str, ) { - // Helper: Decode reducer args into FReducer from either event types - writeln!(output, "static FReducer DecodeReducer(const FReducerEvent& Event)"); - writeln!(output, "{{"); + // U{module_prefix}DbConnection constructor writeln!( output, - " const FString& ReducerName = Event.ReducerCall.ReducerName;" - ); - writeln!(output); - - for reducer in iter_reducers(module, visibility) { - let reducer_name = reducer.name.deref(); - let reducer_pascal = reducer_name.to_case(Case::Pascal); - - writeln!(output, " if (ReducerName == TEXT(\"{reducer_name}\"))"); - writeln!(output, " {{"); - writeln!( - output, - " F{reducer_pascal}Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args);" - ); - writeln!(output, " return FReducer::{reducer_pascal}(Args);"); - writeln!(output, " }}"); - writeln!(output); - } - - writeln!(output, " return FReducer();"); - writeln!(output, "}}"); - writeln!(output); - - // UDbConnection constructor - writeln!( - output, - "UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)" + "U{module_prefix}DbConnection::U{module_prefix}DbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)" ); writeln!(output, "{{"); - writeln!(output, "\tSetReducerFlags = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"SetReducerFlags\"));"); - writeln!(output); writeln!( output, - "\tDb = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteTables\"));" + "\tDb = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteTables\"));" ); writeln!(output, "\tDb->Initialize();"); writeln!(output, "\t"); writeln!( output, - "\tReducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteReducers\"));" + "\tReducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteReducers\"));" ); - writeln!(output, "\tReducers->SetCallReducerFlags = SetReducerFlags;"); writeln!(output, "\tReducers->Conn = this;"); writeln!(output); writeln!( output, - "\tProcedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteProcedures\"));" + "\tProcedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT(\"RemoteProcedures\"));" ); writeln!(output, "\tProcedures->Conn = this;"); writeln!(output); for (name, accessor_name, product_type_ref) in iter_table_names_and_types(module, visibility) { - let struct_name = type_ref_name(module, product_type_ref); + let struct_name = type_ref_name(module_prefix, module, product_type_ref); let accessor = accessor_name.deref(); writeln!( output, - "\tRegisterTable(TEXT(\"{}\"), Db->{});", + "\tRegisterTable(TEXT(\"{}\"), Db->{});", struct_name, accessor.to_case(Case::Pascal), name.deref(), @@ -3081,51 +3325,59 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!(output); - // FContextBase constructor - writeln!(output, "FContextBase::FContextBase(UDbConnection* InConn)"); + // F{module_prefix}ContextBase constructor + writeln!( + output, + "F{module_prefix}ContextBase::F{module_prefix}ContextBase(U{module_prefix}DbConnection* InConn)" + ); writeln!(output, "{{"); writeln!(output, "\tDb = InConn->Db;"); writeln!(output, "\tReducers = InConn->Reducers;"); - writeln!(output, "\tSetReducerFlags = InConn->SetReducerFlags;"); writeln!(output, "\tProcedures = InConn->Procedures;"); writeln!(output, "\tConn = InConn;"); writeln!(output, "}}"); - // FContextBase methods - writeln!(output, "bool FContextBase::IsActive() const"); + // F{module_prefix}ContextBase methods + writeln!(output, "bool F{module_prefix}ContextBase::IsActive() const"); writeln!(output, "{{"); writeln!(output, "\treturn Conn->IsActive();"); writeln!(output, "}}"); - writeln!(output, "void FContextBase::Disconnect()"); + writeln!(output, "void F{module_prefix}ContextBase::Disconnect()"); writeln!(output, "{{"); writeln!(output, "\tConn->Disconnect();"); writeln!(output, "}}"); - writeln!(output, "USubscriptionBuilder* FContextBase::SubscriptionBuilder()"); + writeln!( + output, + "U{module_prefix}SubscriptionBuilder* F{module_prefix}ContextBase::SubscriptionBuilder()" + ); writeln!(output, "{{"); writeln!(output, "\treturn Conn->SubscriptionBuilder();"); writeln!(output, "}}"); writeln!( output, - "bool FContextBase::TryGetIdentity(FSpacetimeDBIdentity& OutIdentity) const" + "bool F{module_prefix}ContextBase::TryGetIdentity(FSpacetimeDBIdentity& OutIdentity) const" ); writeln!(output, "{{"); writeln!(output, "\treturn Conn->TryGetIdentity(OutIdentity);"); writeln!(output, "}}"); - writeln!(output, "FSpacetimeDBConnectionId FContextBase::GetConnectionId() const"); + writeln!( + output, + "FSpacetimeDBConnectionId F{module_prefix}ContextBase::GetConnectionId() const" + ); writeln!(output, "{{"); writeln!(output, "\treturn Conn->GetConnectionId();"); writeln!(output, "}}"); writeln!(output); - // URemoteTables Initialize method - writeln!(output, "void URemoteTables::Initialize()"); + // U{module_prefix}RemoteTables Initialize method + writeln!(output, "void U{module_prefix}RemoteTables::Initialize()"); writeln!(output, "{{"); writeln!(output); writeln!(output, "\t/** Creating tables */"); for (_, accessor_name, _) in iter_table_names_and_types(module, visibility) { writeln!( output, - "\t{} = NewObject(this);", + "\t{} = NewObject(this);", accessor_name.deref().to_case(Case::Pascal), accessor_name.deref().to_case(Case::Pascal) ); @@ -3144,24 +3396,11 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!(output); - // USetReducerFlags methods - for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); - writeln!( - output, - "void USetReducerFlags::{reducer_pascal}(ECallReducerFlags Flag)" - ); - writeln!(output, "{{"); - writeln!(output, "\tFlagMap.Add(\"{reducer_pascal}\", Flag);"); - writeln!(output, "}}"); - } - writeln!(output); - - generate_remote_reducer_calls(output, module, visibility, module_name); - generate_remote_procedure_calls(output, module, visibility, module_name); + generate_remote_reducer_calls(output, module, visibility, module_prefix, module_name); + generate_remote_procedure_calls(output, module, visibility, module_prefix, module_name); // Hook up error handling - writeln!(output, "void UDbConnection::PostInitProperties()"); + writeln!(output, "void U{module_prefix}DbConnection::PostInitProperties()"); writeln!(output, "{{"); writeln!(output, " Super::PostInitProperties();"); writeln!(output, " "); @@ -3171,7 +3410,7 @@ fn generate_client_implementation( ); writeln!(output, " if (Reducers)"); writeln!(output, " {{"); - writeln!(output, " Reducers->InternalOnUnhandledReducerError.AddDynamic(this, &UDbConnection::OnUnhandledReducerErrorHandler);"); + writeln!(output, " Reducers->InternalOnUnhandledReducerError.AddDynamic(this, &U{module_prefix}DbConnection::OnUnhandledReducerErrorHandler);"); writeln!(output, " }}"); writeln!(output); writeln!( @@ -3180,7 +3419,7 @@ fn generate_client_implementation( ); writeln!(output, " if (Procedures)"); writeln!(output, " {{"); - writeln!(output, " Procedures->InternalOnUnhandledProcedureError.AddDynamic(this, &UDbConnection::OnUnhandledProcedureErrorHandler);"); + writeln!(output, " Procedures->InternalOnUnhandledProcedureError.AddDynamic(this, &U{module_prefix}DbConnection::OnUnhandledProcedureErrorHandler);"); writeln!(output, " }}"); writeln!(output, "}}"); writeln!(output); @@ -3189,7 +3428,7 @@ fn generate_client_implementation( writeln!(output, "UFUNCTION()"); writeln!( output, - "void UDbConnection::OnUnhandledReducerErrorHandler(const FReducerEventContext& Context, const FString& Error)" + "void U{module_prefix}DbConnection::OnUnhandledReducerErrorHandler(const F{module_prefix}ReducerEventContext& Context, const FString& Error)" ); writeln!(output, "{{"); writeln!(output, " if (OnUnhandledReducerError.IsBound())"); @@ -3203,7 +3442,7 @@ fn generate_client_implementation( writeln!(output, "UFUNCTION()"); writeln!( output, - "void UDbConnection::OnUnhandledProcedureErrorHandler(const FProcedureEventContext& Context, const FString& Error)" + "void U{module_prefix}DbConnection::OnUnhandledProcedureErrorHandler(const F{module_prefix}ProcedureEventContext& Context, const FString& Error)" ); writeln!(output, "{{"); writeln!(output, " if (OnUnhandledProcedureError.IsBound())"); @@ -3213,14 +3452,71 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!(output); + writeln!( + output, + "void U{module_prefix}DbConnection::RegisterPendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer Reducer)" + ); + writeln!(output, "{{"); + writeln!(output, " Reducer.RequestId = RequestId;"); + writeln!(output, " PendingTypedReducers.Add(RequestId, MoveTemp(Reducer));"); + writeln!(output, "}}"); + writeln!(output); + writeln!( + output, + "bool U{module_prefix}DbConnection::TryGetPendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer& OutReducer) const" + ); + writeln!(output, "{{"); + writeln!( + output, + " if (const F{module_prefix}Reducer* Found = PendingTypedReducers.Find(RequestId))" + ); + writeln!(output, " {{"); + writeln!(output, " OutReducer = *Found;"); + writeln!(output, " return true;"); + writeln!(output, " }}"); + writeln!(output, " return false;"); + writeln!(output, "}}"); + writeln!(output); + writeln!( + output, + "bool U{module_prefix}DbConnection::TryTakePendingTypedReducer(uint32 RequestId, F{module_prefix}Reducer& OutReducer)" + ); + writeln!(output, "{{"); + writeln!( + output, + " if (F{module_prefix}Reducer* Found = PendingTypedReducers.Find(RequestId))" + ); + writeln!(output, " {{"); + writeln!(output, " OutReducer = *Found;"); + writeln!(output, " PendingTypedReducers.Remove(RequestId);"); + writeln!(output, " return true;"); + writeln!(output, " }}"); + writeln!(output, " return false;"); + writeln!(output, "}}"); + writeln!(output); + // ReducerEvent method implementation - writeln!(output, "void UDbConnection::ReducerEvent(const FReducerEvent& Event)"); + writeln!( + output, + "void U{module_prefix}DbConnection::ReducerEvent(const FReducerEvent& Event)" + ); writeln!(output, "{{"); writeln!(output, " if (!Reducers) {{ return; }}"); writeln!(output); - // Decode reducer call args - writeln!(output, " FReducer DecodedReducer = DecodeReducer(Event);"); + writeln!(output, " F{module_prefix}Reducer DecodedReducer;"); + writeln!( + output, + " if (!TryTakePendingTypedReducer(Event.RequestId, DecodedReducer))" + ); + writeln!(output, " {{"); + writeln!( + output, + " const FString ErrorMessage = FString::Printf(TEXT(\"Reducer result for unknown request_id %u\"), Event.RequestId);" + ); + writeln!(output, " HandleProtocolViolation(ErrorMessage);"); + writeln!(output, " return;"); + writeln!(output, " }}"); writeln!(output); let module_name_pascal = module_name.to_case(Case::Pascal); @@ -3237,30 +3533,34 @@ fn generate_client_implementation( writeln!(output, " ReducerEvent.Reducer = DecodedReducer;"); writeln!(output); - writeln!(output, " FReducerEventContext Context(this, ReducerEvent);"); + writeln!( + output, + " F{module_prefix}ReducerEventContext Context(this, ReducerEvent);" + ); writeln!(output); - writeln!(output, " // Use hardcoded string matching for reducer dispatching"); + writeln!(output, " // Dispatch by typed reducer metadata"); writeln!( output, - " const FString& ReducerName = Event.ReducerCall.ReducerName;" + " const FString& ReducerName = ReducerEvent.Reducer.ReducerName;" ); writeln!(output); for reducer in iter_reducers(module, visibility) { let reducer_name = reducer.name.deref(); - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_method = reducer_name.to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{reducer_method}"); writeln!(output, " if (ReducerName == TEXT(\"{reducer_name}\"))"); writeln!(output, " {{"); writeln!( output, - " F{reducer_pascal}Args Args = ReducerEvent.Reducer.GetAs{reducer_pascal}();" + " F{reducer_pascal}Args Args = ReducerEvent.Reducer.GetAs{reducer_method}();" ); // FIX: Pass FArgs directly to InvokeWithArgs instead of creating UReducer UObject. // UObject creation/destruction cannot keep up at 30Hz tick rate, causing memory leak. // Stack-allocated FArgs struct has zero allocation overhead. writeln!( output, - " Reducers->Invoke{reducer_pascal}WithArgs(Context, Args);" + " Reducers->Invoke{reducer_method}WithArgs(Context, Args);" ); writeln!(output, " return;"); writeln!(output, " }}"); @@ -3276,7 +3576,7 @@ fn generate_client_implementation( // ReducerEventFailed method implementation writeln!( output, - "void UDbConnection::ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage)" + "void U{module_prefix}DbConnection::ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage)" ); writeln!(output, "{{"); writeln!(output, " if (!Reducers) {{ return; }}"); @@ -3294,7 +3594,10 @@ fn generate_client_implementation( writeln!(output, " ReducerEvent.Timestamp = Event.Timestamp;"); writeln!(output); - writeln!(output, " FReducerEventContext Context(this, ReducerEvent);"); + writeln!( + output, + " F{module_prefix}ReducerEventContext Context(this, ReducerEvent);" + ); writeln!(output); writeln!(output, " if (Reducers->InternalOnUnhandledReducerError.IsBound())"); writeln!(output, " {{"); @@ -3309,7 +3612,7 @@ fn generate_client_implementation( // ProcedureEventFailed method implementation writeln!( output, - "void UDbConnection::ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage)" + "void U{module_prefix}DbConnection::ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage)" ); writeln!(output, "{{"); writeln!(output, " if (!Procedures) {{ return; }}"); @@ -3324,7 +3627,10 @@ fn generate_client_implementation( writeln!(output, " ProcedureEvent.Timestamp = Event.Timestamp;"); writeln!(output); - writeln!(output, " FProcedureEventContext Context(this, ProcedureEvent);"); + writeln!( + output, + " F{module_prefix}ProcedureEventContext Context(this, ProcedureEvent);" + ); writeln!(output); writeln!( output, @@ -3340,23 +3646,29 @@ fn generate_client_implementation( writeln!(output); // Additional methods from manual reference - writeln!(output, "UDbConnectionBuilder* UDbConnection::Builder()"); + writeln!( + output, + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnection::Builder()" + ); writeln!(output, "{{"); - writeln!(output, "\treturn NewObject();"); + writeln!(output, "\treturn NewObject();"); writeln!(output, "}}"); writeln!(output, "// Added for creating subscriptions"); - writeln!(output, "USubscriptionBuilder* UDbConnection::SubscriptionBuilder()"); + writeln!( + output, + "U{module_prefix}SubscriptionBuilder* U{module_prefix}DbConnection::SubscriptionBuilder()" + ); writeln!(output, "{{"); writeln!( output, - "\tUSubscriptionBuilder* Builder = NewObject(this);" + "\tU{module_prefix}SubscriptionBuilder* Builder = NewObject(this);" ); writeln!(output, "\tBuilder->Conn = this;"); writeln!(output, "\treturn Builder;"); writeln!(output, "}}"); writeln!( output, - "USubscriptionBuilder* USubscriptionBuilder::OnApplied(FOnSubscriptionApplied Callback)" + "U{module_prefix}SubscriptionBuilder* U{module_prefix}SubscriptionBuilder::OnApplied(F{module_prefix}OnSubscriptionApplied Callback)" ); writeln!(output, "{{"); writeln!(output, "\tOnAppliedDelegateInternal = Callback;"); @@ -3364,7 +3676,7 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!( output, - "USubscriptionBuilder* USubscriptionBuilder::OnError(FOnSubscriptionError Callback)" + "U{module_prefix}SubscriptionBuilder* U{module_prefix}SubscriptionBuilder::OnError(F{module_prefix}OnSubscriptionError Callback)" ); writeln!(output, "{{"); writeln!(output, "\tOnErrorDelegateInternal = Callback;"); @@ -3372,12 +3684,12 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!( output, - "USubscriptionHandle* USubscriptionBuilder::Subscribe(const TArray& SQL)" + "U{module_prefix}SubscriptionHandle* U{module_prefix}SubscriptionBuilder::Subscribe(const TArray& SQL)" ); writeln!(output, "{{"); writeln!( output, - "\tUSubscriptionHandle* Handle = NewObject();" + "\tU{module_prefix}SubscriptionHandle* Handle = NewObject();" ); writeln!(output); writeln!(output, "\t// Store user callbacks on the handle"); @@ -3406,7 +3718,7 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!( output, - "USubscriptionHandle* USubscriptionBuilder::SubscribeToAllTables()" + "U{module_prefix}SubscriptionHandle* U{module_prefix}SubscriptionBuilder::SubscribeToAllTables()" ); writeln!(output, "{{"); writeln!(output, "\treturn Subscribe({{ \"SELECT * FROM * \" }});"); @@ -3414,7 +3726,7 @@ fn generate_client_implementation( writeln!(output); writeln!( output, - "USubscriptionHandle::USubscriptionHandle(UDbConnection* InConn)" + "U{module_prefix}SubscriptionHandle::U{module_prefix}SubscriptionHandle(U{module_prefix}DbConnection* InConn)" ); writeln!(output, "{{"); writeln!(output, "\tConn = InConn;"); @@ -3422,24 +3734,24 @@ fn generate_client_implementation( writeln!(output); writeln!( output, - "void USubscriptionHandle::ForwardOnApplied(const FSubscriptionEventContextBase& BaseCtx)" + "void U{module_prefix}SubscriptionHandle::ForwardOnApplied(const FSubscriptionEventContextBase& BaseCtx)" ); writeln!(output, "{{"); writeln!(output, "\tif (OnAppliedDelegate.IsBound())"); writeln!(output, "\t{{"); - writeln!(output, "\t\tFSubscriptionEventContext Ctx(Conn);"); + writeln!(output, "\t\tF{module_prefix}SubscriptionEventContext Ctx(Conn);"); writeln!(output, "\t\tOnAppliedDelegate.Execute(Ctx);"); writeln!(output, "\t}}"); writeln!(output, "}}"); writeln!(output); writeln!( output, - "void USubscriptionHandle::ForwardOnError(const FErrorContextBase& BaseCtx)" + "void U{module_prefix}SubscriptionHandle::ForwardOnError(const FErrorContextBase& BaseCtx)" ); writeln!(output, "{{"); writeln!(output, "\tif (OnErrorDelegate.IsBound())"); writeln!(output, "\t{{"); - writeln!(output, "\t\tFErrorContext Ctx(Conn, BaseCtx.Error);"); + writeln!(output, "\t\tF{module_prefix}ErrorContext Ctx(Conn, BaseCtx.Error);"); writeln!(output, "\t\tOnErrorDelegate.Execute(Ctx);"); writeln!(output, "\t}}"); writeln!(output, "}}"); @@ -3448,41 +3760,47 @@ fn generate_client_implementation( writeln!(output, "// Cast from parent to child class"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::WithUri(const FString& InUri)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::WithUri(const FString& InUri)" ); writeln!(output, "{{"); - writeln!(output, "\treturn Cast(WithUriBase(InUri));"); + writeln!( + output, + "\treturn Cast(WithUriBase(InUri));" + ); writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::WithDatabaseName(const FString& InName)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::WithDatabaseName(const FString& InName)" ); writeln!(output, "{{"); writeln!( output, - "\treturn Cast(WithDatabaseNameBase(InName));" + "\treturn Cast(WithDatabaseNameBase(InName));" ); writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::WithToken(const FString& InToken)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::WithToken(const FString& InToken)" ); writeln!(output, "{{"); - writeln!(output, "\treturn Cast(WithTokenBase(InToken));"); + writeln!( + output, + "\treturn Cast(WithTokenBase(InToken));" + ); writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::WithCompression(const ESpacetimeDBCompression& InCompression)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::WithCompression(const ESpacetimeDBCompression& InCompression)" ); writeln!(output, "{{"); writeln!( output, - "\treturn Cast(WithCompressionBase(InCompression));" + "\treturn Cast(WithCompressionBase(InCompression));" ); writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::OnConnect(FOnConnectDelegate Callback)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::OnConnect(F{module_prefix}OnConnectDelegate Callback)" ); writeln!(output, "{{"); writeln!(output, "\tOnConnectDelegateInternal = Callback;"); @@ -3490,25 +3808,31 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::OnConnectError(FOnConnectErrorDelegate Callback)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::OnConnectError(FOnConnectErrorDelegate Callback)" ); writeln!(output, "{{"); writeln!( output, - "\treturn Cast(OnConnectErrorBase(Callback));" + "\treturn Cast(OnConnectErrorBase(Callback));" ); writeln!(output, "}}"); writeln!( output, - "UDbConnectionBuilder* UDbConnectionBuilder::OnDisconnect(FOnDisconnectDelegate Callback)" + "U{module_prefix}DbConnectionBuilder* U{module_prefix}DbConnectionBuilder::OnDisconnect(F{module_prefix}OnDisconnectDelegate Callback)" ); writeln!(output, "{{"); writeln!(output, "\tOnDisconnectDelegateInternal = Callback;"); writeln!(output, "\treturn this;"); writeln!(output, "}}"); - writeln!(output, "UDbConnection* UDbConnectionBuilder::Build()"); + writeln!( + output, + "U{module_prefix}DbConnection* U{module_prefix}DbConnectionBuilder::Build()" + ); writeln!(output, "{{"); - writeln!(output, "\tUDbConnection* Connection = NewObject();"); + writeln!( + output, + "\tU{module_prefix}DbConnection* Connection = NewObject();" + ); writeln!(output); writeln!(output, "\t// Store delegates on the connection for later use"); writeln!(output, "\tConnection->OnConnectDelegate = OnConnectDelegateInternal;"); @@ -3534,9 +3858,12 @@ fn generate_client_implementation( writeln!(output, "\tConnection->SetOnDisconnectDelegate(BaseDisconnect);"); writeln!(output, "\tOnDisconnectBase(BaseDisconnect);"); writeln!(output); - writeln!(output, "\treturn Cast(BuildConnection(Connection));"); + writeln!( + output, + "\treturn Cast(BuildConnection(Connection));" + ); writeln!(output, "}}"); - writeln!(output, "void UDbConnection::ForwardOnConnect(UDbConnectionBase* BaseConnection, FSpacetimeDBIdentity InIdentity, const FString& InToken)"); + writeln!(output, "void U{module_prefix}DbConnection::ForwardOnConnect(UDbConnectionBase* BaseConnection, FSpacetimeDBIdentity InIdentity, const FString& InToken)"); writeln!(output, "{{"); writeln!(output, "\tif (OnConnectDelegate.IsBound())"); writeln!(output, "\t{{"); @@ -3545,9 +3872,10 @@ fn generate_client_implementation( writeln!(output, "}}"); writeln!( output, - "void UDbConnection::ForwardOnDisconnect(UDbConnectionBase* BaseConnection, const FString& Error)" + "void U{module_prefix}DbConnection::ForwardOnDisconnect(UDbConnectionBase* BaseConnection, const FString& Error)" ); writeln!(output, "{{"); + writeln!(output, "\tPendingTypedReducers.Empty();"); writeln!(output, "\tif (OnDisconnectDelegate.IsBound())"); writeln!(output, "\t{{"); writeln!(output, "\t\tOnDisconnectDelegate.Execute(this, Error);"); @@ -3558,7 +3886,7 @@ fn generate_client_implementation( writeln!( output, - "void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetimeDBEvent& Event)" + "void U{module_prefix}DbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetimeDBEvent& Event)" ); writeln!(output, "{{"); @@ -3575,7 +3903,19 @@ fn generate_client_implementation( writeln!(output, " case ESpacetimeDBEventTag::Reducer:"); writeln!(output, " {{"); writeln!(output, " FReducerEvent ReducerEvent = Event.GetAsReducer();"); - writeln!(output, " FReducer Reducer = DecodeReducer(ReducerEvent);"); + writeln!(output, " F{module_prefix}Reducer Reducer;"); + writeln!( + output, + " if (!TryGetPendingTypedReducer(ReducerEvent.RequestId, Reducer))" + ); + writeln!(output, " {{"); + writeln!( + output, + " const FString ErrorMessage = FString::Printf(TEXT(\"Reducer result for unknown request_id %u\"), ReducerEvent.RequestId);" + ); + writeln!(output, " HandleProtocolViolation(ErrorMessage);"); + writeln!(output, " return;"); + writeln!(output, " }}"); writeln!( output, " BaseEvent = F{module_name_pascal}Event::Reducer(Reducer);" @@ -3609,6 +3949,14 @@ fn generate_client_implementation( writeln!(output, " break;"); writeln!(output); + writeln!(output, " case ESpacetimeDBEventTag::Transaction:"); + writeln!( + output, + " BaseEvent = F{module_name_pascal}Event::Transaction(Event.GetAsTransaction());" + ); + writeln!(output, " break;"); + writeln!(output); + writeln!(output, " case ESpacetimeDBEventTag::SubscribeError:"); writeln!( output, @@ -3631,7 +3979,7 @@ fn generate_client_implementation( writeln!(output); // Wrap in EventContext - writeln!(output, " FEventContext Context(this, BaseEvent);"); + writeln!(output, " F{module_prefix}EventContext Context(this, BaseEvent);"); writeln!( output, " // Populate typed reducer args for convenience in table handlers" @@ -3648,15 +3996,17 @@ fn generate_remote_reducer_calls( output: &mut UnrealCppAutogen, module: &ModuleDef, visibility: CodegenVisibility, + module_prefix: &str, module_name: &str, ) { // Reducer implementations for reducer in iter_reducers(module, visibility) { - let reducer_pascal = reducer.name.deref().to_case(Case::Pascal); + let reducer_name = reducer.name.deref().to_case(Case::Pascal); + let reducer_pascal = format!("{module_prefix}{reducer_name}"); let reducer_snake = reducer.name.deref(); // Call method implementation - write!(output, "void URemoteReducers::{reducer_pascal}("); + write!(output, "void U{module_prefix}RemoteReducers::{reducer_name}("); let mut first = true; for (param_name, param_type) in &reducer.params_for_generate.elements { if !first { @@ -3664,9 +4014,9 @@ fn generate_remote_reducer_calls( } first = false; // Use Blueprint-compatible types (same as UFUNCTION and delegates) - let type_str = cpp_ty_fmt_blueprint_compatible(module, param_type, module_name).to_string(); + let type_str = cpp_ty_fmt_blueprint_compatible(module_prefix, module, param_type, module_name).to_string(); if should_pass_by_value_in_delegate(module, param_type) { - // Primitives use const by-value in URemoteReducers methods (same as UFUNCTION) + // Primitives use const by-value in U{module_prefix}RemoteReducers methods (same as UFUNCTION) write!( output, "const {} {}", @@ -3696,15 +4046,17 @@ fn generate_remote_reducer_calls( writeln!(output); // Call reducer using typed helper to hide serialization if reducer.params_for_generate.elements.is_empty() { + writeln!(output, "\tF{reducer_pascal}Args ReducerArgs;"); writeln!( output, - "\tConn->CallReducerTyped(TEXT(\"{reducer_snake}\"), F{reducer_pascal}Args(), SetCallReducerFlags);" + "\tconst uint32 RequestId = Conn->CallReducerTyped(TEXT(\"{reducer_snake}\"), ReducerArgs);" ); - } else { - write!( + writeln!( output, - "\tConn->CallReducerTyped(TEXT(\"{reducer_snake}\"), F{reducer_pascal}Args(" + "\tif (RequestId != 0) {{ Conn->RegisterPendingTypedReducer(RequestId, F{module_prefix}Reducer::{reducer_name}(ReducerArgs)); }}" ); + } else { + write!(output, "\tF{reducer_pascal}Args ReducerArgs("); let mut first = true; for (param_name, _) in &reducer.params_for_generate.elements { if !first { @@ -3714,7 +4066,15 @@ fn generate_remote_reducer_calls( let param_pascal = param_name.deref().to_case(Case::Pascal); write!(output, "{param_pascal}"); } - writeln!(output, "), SetCallReducerFlags);"); + writeln!(output, ");"); + writeln!( + output, + "\tconst uint32 RequestId = Conn->CallReducerTyped(TEXT(\"{reducer_snake}\"), ReducerArgs);" + ); + writeln!( + output, + "\tif (RequestId != 0) {{ Conn->RegisterPendingTypedReducer(RequestId, F{module_prefix}Reducer::{reducer_name}(ReducerArgs)); }}" + ); } writeln!(output, "}}"); writeln!(output); @@ -3722,11 +4082,11 @@ fn generate_remote_reducer_calls( // Invoke method implementation write!( output, - "bool URemoteReducers::Invoke{reducer_pascal}(const FReducerEventContext& Context, const U{reducer_pascal}Reducer* Args)" + "bool U{module_prefix}RemoteReducers::Invoke{reducer_name}(const F{module_prefix}ReducerEventContext& Context, const U{reducer_pascal}Reducer* Args)" ); writeln!(output); writeln!(output, "{{"); - writeln!(output, " if (!On{reducer_pascal}.IsBound())"); + writeln!(output, " if (!On{reducer_name}.IsBound())"); writeln!(output, " {{"); writeln!(output, " // Handle unhandled reducer error"); writeln!(output, " if (InternalOnUnhandledReducerError.IsBound())"); @@ -3738,7 +4098,7 @@ fn generate_remote_reducer_calls( writeln!(output, " // For now, just broadcast any error"); writeln!( output, - " InternalOnUnhandledReducerError.Broadcast(Context, TEXT(\"No handler registered for {reducer_pascal}\"));" + " InternalOnUnhandledReducerError.Broadcast(Context, TEXT(\"No handler registered for {reducer_name}\"));" ); writeln!(output, " }}"); writeln!(output, " return false;"); @@ -3756,10 +4116,10 @@ fn generate_remote_reducer_calls( let param_pascal = param_name.deref().to_case(Case::Pascal); writeln!(output, " ArgsStruct.{param_pascal} = Args->{param_pascal};"); } - writeln!(output, " On{reducer_pascal}.Broadcast(Context, ArgsStruct);"); + writeln!(output, " On{reducer_name}.Broadcast(Context, ArgsStruct);"); } else { // Use individual parameters - write!(output, " On{reducer_pascal}.Broadcast(Context"); + write!(output, " On{reducer_name}.Broadcast(Context"); for (param_name, _) in &reducer.params_for_generate.elements { let param_pascal = param_name.deref().to_case(Case::Pascal); write!(output, ", Args->{param_pascal}"); @@ -3774,17 +4134,17 @@ fn generate_remote_reducer_calls( // InvokeWithArgs method implementation (zero allocation version) write!( output, - "bool URemoteReducers::Invoke{reducer_pascal}WithArgs(const FReducerEventContext& Context, const F{reducer_pascal}Args& Args)" + "bool U{module_prefix}RemoteReducers::Invoke{reducer_name}WithArgs(const F{module_prefix}ReducerEventContext& Context, const F{reducer_pascal}Args& Args)" ); writeln!(output); writeln!(output, "{{"); - writeln!(output, " if (!On{reducer_pascal}.IsBound())"); + writeln!(output, " if (!On{reducer_name}.IsBound())"); writeln!(output, " {{"); writeln!(output, " if (InternalOnUnhandledReducerError.IsBound())"); writeln!(output, " {{"); writeln!( output, - " InternalOnUnhandledReducerError.Broadcast(Context, TEXT(\"No handler registered for {reducer_pascal}\"));" + " InternalOnUnhandledReducerError.Broadcast(Context, TEXT(\"No handler registered for {reducer_name}\"));" ); writeln!(output, " }}"); writeln!(output, " return false;"); @@ -3794,10 +4154,10 @@ fn generate_remote_reducer_calls( // Check if we're using args struct (more than 9 params including context) if use_args_struct { // Pass args struct directly - writeln!(output, " On{reducer_pascal}.Broadcast(Context, Args);"); + writeln!(output, " On{reducer_name}.Broadcast(Context, Args);"); } else { // Use individual parameters from Args struct - write!(output, " On{reducer_pascal}.Broadcast(Context"); + write!(output, " On{reducer_name}.Broadcast(Context"); for (param_name, _) in &reducer.params_for_generate.elements { let param_pascal = param_name.deref().to_case(Case::Pascal); write!(output, ", Args.{param_pascal}"); @@ -3815,15 +4175,17 @@ fn generate_remote_procedure_calls( output: &mut UnrealCppAutogen, module: &ModuleDef, visibility: CodegenVisibility, + module_prefix: &str, module_name: &str, ) { // Procedure implementations for procedure in iter_procedures(module, visibility) { - let procedure_pascal = procedure.name.deref().to_case(Case::Pascal); + let procedure_name = procedure.name.deref().to_case(Case::Pascal); + let procedure_pascal = format!("{module_prefix}{procedure_name}"); let procedure_snake = procedure.name.deref(); // Call method implementation - write!(output, "void URemoteProcedures::{procedure_pascal}("); + write!(output, "void U{module_prefix}RemoteProcedures::{procedure_name}("); let mut first = true; for (param_name, param_type) in &procedure.params_for_generate.elements { if !first { @@ -3831,9 +4193,9 @@ fn generate_remote_procedure_calls( } first = false; // Use Blueprint-compatible types (same as UFUNCTION and delegates) - let type_str = cpp_ty_fmt_blueprint_compatible(module, param_type, module_name).to_string(); + let type_str = cpp_ty_fmt_blueprint_compatible(module_prefix, module, param_type, module_name).to_string(); if should_pass_by_value_in_delegate(module, param_type) { - // Primitives use const by-value in URemoteProcedures methods (same as UFUNCTION) + // Primitives use const by-value in U{module_prefix}RemoteProcedures methods (same as UFUNCTION) write!( output, "const {} {}", @@ -3853,7 +4215,7 @@ fn generate_remote_procedure_calls( if !first { write!(output, ", "); } - writeln!(output, "FOn{}Complete Callback)", procedure_pascal); + writeln!(output, "F{module_prefix}On{}Complete Callback)", procedure_name); writeln!(output, "{{"); writeln!(output, " if (!Conn)"); writeln!(output, " {{"); @@ -3867,7 +4229,7 @@ fn generate_remote_procedure_calls( // Get the actual return type for this procedure let return_type_str = - cpp_ty_fmt_with_module(module, &procedure.return_type_for_generate, module_name).to_string(); + cpp_ty_fmt_with_module(module_prefix, module, &procedure.return_type_for_generate, module_name).to_string(); writeln!(output, " FOnProcedureCompleteDelegate Wrapper;"); writeln!(output, " Wrapper.BindLambda("); @@ -3889,7 +4251,7 @@ fn generate_remote_procedure_calls( writeln!(output, " F{module_name}ProcedureEvent ProcedureEvent = F{module_name}ProcedureEvent(Event.GetAsProcedure());"); writeln!( output, - " FProcedureEventContext Context = FProcedureEventContext(Conn, ProcedureEvent);" + " F{module_prefix}ProcedureEventContext Context = F{module_prefix}ProcedureEventContext(Conn, ProcedureEvent);" ); writeln!(output, " // Fire the user's typed delegate"); writeln!( @@ -3982,6 +4344,7 @@ impl UnrealCppAutogen { // Unified helper function to collect special wrapper types (optionals and results) fn collect_wrapper_types( + module_prefix: &str, module: &ModuleDef, visibility: CodegenVisibility, ) -> (HashSet, HashSet<(String, String)>) { @@ -3990,6 +4353,7 @@ fn collect_wrapper_types( // Helper function to recursively collect from a type fn collect_from_type( + module_prefix: &str, module: &ModuleDef, ty: &AlgebraicTypeUse, optional_types: &mut HashSet, @@ -3998,34 +4362,34 @@ fn collect_wrapper_types( match ty { AlgebraicTypeUse::Option(inner) => { // Generate the optional type name - let optional_name = get_optional_type_name(module, inner); + let optional_name = get_optional_type_name(module_prefix, module, inner); optional_types.insert(optional_name); // Recursively collect from inner type - collect_from_type(module, inner, optional_types, result_types); + collect_from_type(module_prefix, module, inner, optional_types, result_types); } AlgebraicTypeUse::Result { ok_ty, err_ty } => { // Generate the result type name components - let ok_name = get_type_name_for_result(module, ok_ty); - let err_name = get_type_name_for_result(module, err_ty); + let ok_name = get_type_name_for_result(module_prefix, module, ok_ty); + let err_name = get_type_name_for_result(module_prefix, module, err_ty); result_types.insert((ok_name, err_name)); // Recursively collect from both inner types - collect_from_type(module, ok_ty, optional_types, result_types); - collect_from_type(module, err_ty, optional_types, result_types); + collect_from_type(module_prefix, module, ok_ty, optional_types, result_types); + collect_from_type(module_prefix, module, err_ty, optional_types, result_types); } AlgebraicTypeUse::Array(elem) => { - collect_from_type(module, elem, optional_types, result_types); + collect_from_type(module_prefix, module, elem, optional_types, result_types); } AlgebraicTypeUse::Ref(r) => { // Check if the referenced type contains optionals or results match &module.typespace_for_generate()[*r] { AlgebraicTypeDef::Product(product) => { for (_, field_ty) in &product.elements { - collect_from_type(module, field_ty, optional_types, result_types); + collect_from_type(module_prefix, module, field_ty, optional_types, result_types); } } AlgebraicTypeDef::Sum(sum) => { for (_, variant_ty) in &sum.variants { - collect_from_type(module, variant_ty, optional_types, result_types); + collect_from_type(module_prefix, module, variant_ty, optional_types, result_types); } } _ => {} @@ -4039,7 +4403,7 @@ fn collect_wrapper_types( for (_, _, product_type_ref) in iter_table_names_and_types(module, visibility) { let product_type = module.typespace_for_generate()[product_type_ref].as_product().unwrap(); for (_, field_ty) in &product_type.elements { - collect_from_type(module, field_ty, &mut optional_types, &mut result_types); + collect_from_type(module_prefix, module, field_ty, &mut optional_types, &mut result_types); } } @@ -4048,12 +4412,18 @@ fn collect_wrapper_types( match &module.typespace_for_generate()[typ.ty] { AlgebraicTypeDef::Product(product) => { for (_, field_ty) in &product.elements { - collect_from_type(module, field_ty, &mut optional_types, &mut result_types); + collect_from_type(module_prefix, module, field_ty, &mut optional_types, &mut result_types); } } AlgebraicTypeDef::Sum(sum) => { for (_, variant_ty) in &sum.variants { - collect_from_type(module, variant_ty, &mut optional_types, &mut result_types); + collect_from_type( + module_prefix, + module, + variant_ty, + &mut optional_types, + &mut result_types, + ); } } _ => {} @@ -4063,16 +4433,17 @@ fn collect_wrapper_types( // Collect from reducer parameters for reducer in iter_reducers(module, visibility) { for (_, param_ty) in &reducer.params_for_generate.elements { - collect_from_type(module, param_ty, &mut optional_types, &mut result_types); + collect_from_type(module_prefix, module, param_ty, &mut optional_types, &mut result_types); } } // Collect from procedure parameters and return types for procedure in iter_procedures(module, visibility) { for (_, param_ty) in &procedure.params_for_generate.elements { - collect_from_type(module, param_ty, &mut optional_types, &mut result_types); + collect_from_type(module_prefix, module, param_ty, &mut optional_types, &mut result_types); } collect_from_type( + module_prefix, module, &procedure.return_type_for_generate, &mut optional_types, @@ -4084,7 +4455,12 @@ fn collect_wrapper_types( } // Helper function to get C++ type for array elements in optional arrays -fn get_cpp_type_for_array_element(elem_type_str: &str, module: &ModuleDef, module_name: &str) -> String { +fn get_cpp_type_for_array_element( + module_prefix: &str, + elem_type_str: &str, + module: &ModuleDef, + module_name: &str, +) -> String { match elem_type_str { "Bool" => "bool".to_string(), "I8" | "Int8" => "int8".to_string(), @@ -4121,7 +4497,8 @@ fn get_cpp_type_for_array_element(elem_type_str: &str, module: &ModuleDef, modul .last() .map(|id| id.deref().to_string()) .unwrap_or_else(|| "Unnamed".to_string()); - type_name == elem_type_str + let prefixed_type_name = format!("{module_prefix}{type_name}"); + prefixed_type_name == elem_type_str && matches!( module.typespace_for_generate()[type_def.ty], AlgebraicTypeDef::PlainEnum(_) @@ -4138,7 +4515,7 @@ fn get_cpp_type_for_array_element(elem_type_str: &str, module: &ModuleDef, modul } // Helper function to get array element type name for optional array types -fn get_array_element_type_name(module: &ModuleDef, elem: &AlgebraicTypeUse) -> String { +fn get_array_element_type_name(module_prefix: &str, module: &ModuleDef, elem: &AlgebraicTypeUse) -> String { match elem { AlgebraicTypeUse::Primitive(p) => match p { PrimitiveType::Bool => "Bool".to_string(), @@ -4164,21 +4541,21 @@ fn get_array_element_type_name(module: &ModuleDef, elem: &AlgebraicTypeUse) -> S AlgebraicTypeUse::TimeDuration => "TimeDuration".to_string(), AlgebraicTypeUse::Uuid => "Uuid".to_string(), AlgebraicTypeUse::ScheduleAt => "ScheduleAt".to_string(), - AlgebraicTypeUse::Ref(r) => type_ref_name(module, *r), + AlgebraicTypeUse::Ref(r) => type_ref_name(module_prefix, module, *r), AlgebraicTypeUse::Option(nested_inner) => { // Handle optional elements in arrays like Vec> - get_optional_type_name(module, nested_inner) + get_optional_type_name(module_prefix, module, nested_inner) } AlgebraicTypeUse::Result { ok_ty, err_ty } => { // Handle result elements in arrays like Vec> - get_result_type_name(module, ok_ty, err_ty) + get_result_type_name(module_prefix, module, ok_ty, err_ty) } _ => "Unknown".to_string(), } } // Get the name for an optional type (e.g., "OptionalString", "OptionalInt32") -fn get_optional_type_name(module: &ModuleDef, inner: &AlgebraicTypeUse) -> String { +fn get_optional_type_name(module_prefix: &str, module: &ModuleDef, inner: &AlgebraicTypeUse) -> String { match inner { AlgebraicTypeUse::Primitive(p) => match p { PrimitiveType::Bool => "OptionalBool".to_string(), @@ -4206,20 +4583,20 @@ fn get_optional_type_name(module: &ModuleDef, inner: &AlgebraicTypeUse) -> Strin AlgebraicTypeUse::ScheduleAt => "OptionalScheduleAt".to_string(), AlgebraicTypeUse::Array(elem) => { // Generate specific optional array types based on element type - let elem_name = get_array_element_type_name(module, elem); + let elem_name = get_array_element_type_name(module_prefix, module, elem); format!("OptionalVec{elem_name}") } AlgebraicTypeUse::Ref(r) => { - let type_name = type_ref_name(module, *r); + let type_name = type_ref_name(module_prefix, module, *r); format!("Optional{type_name}") } AlgebraicTypeUse::Option(nested_inner) => { // Handle nested optionals like Option> - let inner_optional_name = get_optional_type_name(module, nested_inner); + let inner_optional_name = get_optional_type_name(module_prefix, module, nested_inner); format!("Optional{inner_optional_name}") } AlgebraicTypeUse::Result { ok_ty, err_ty } => { - let result_name = get_result_type_name(module, ok_ty, err_ty); + let result_name = get_result_type_name(module_prefix, module, ok_ty, err_ty); format!("Optional{result_name}") } _ => "OptionalUnknown".to_string(), @@ -4227,7 +4604,12 @@ fn get_optional_type_name(module: &ModuleDef, inner: &AlgebraicTypeUse) -> Strin } // Helper function to determine C++ type from type name string for result types -fn determine_cpp_type_for_result(type_name: &str, module: &ModuleDef, module_name: &str) -> String { +fn determine_cpp_type_for_result( + module_prefix: &str, + type_name: &str, + module: &ModuleDef, + module_name: &str, +) -> String { match type_name { "Bool" => "bool".to_string(), "Int8" => "int8".to_string(), @@ -4266,7 +4648,7 @@ fn determine_cpp_type_for_result(type_name: &str, module: &ModuleDef, module_nam _ if type_name.starts_with("Vec") => { // Handle array types like VecInt32 let elem_type_str = &type_name[3..]; // Remove "Vec" prefix - let cpp_elem_type = get_cpp_type_for_array_element(elem_type_str, module, module_name); + let cpp_elem_type = get_cpp_type_for_array_element(module_prefix, elem_type_str, module, module_name); format!("TArray<{cpp_elem_type}>") } _ if type_name.starts_with("Result") => { @@ -4283,7 +4665,8 @@ fn determine_cpp_type_for_result(type_name: &str, module: &ModuleDef, module_nam .last() .map(|id| id.deref().to_string()) .unwrap_or_else(|| "Unnamed".to_string()); - type_name_from_def == type_name + let prefixed_type_name = format!("{module_prefix}{type_name_from_def}"); + prefixed_type_name == type_name && matches!( module.typespace_for_generate()[type_def.ty], AlgebraicTypeDef::PlainEnum(_) @@ -4373,12 +4756,18 @@ fn add_includes_for_type_name(type_name: &str, includes: &mut Vec, modul } // Generate the content for an optional type file -fn generate_optional_type(optional_name: &str, module: &ModuleDef, api_macro: &str, module_name: &str) -> String { +fn generate_optional_type( + optional_name: &str, + module_prefix: &str, + module: &ModuleDef, + api_macro: &str, + module_name: &str, +) -> String { // Extract the inner type from the optional name let inner_type_str = optional_name.strip_prefix("Optional").unwrap_or(optional_name); // Determine the C++ type for the inner value - let cpp_inner_type = determine_cpp_type_for_result(inner_type_str, module, module_name); + let cpp_inner_type = determine_cpp_type_for_result(module_prefix, inner_type_str, module, module_name); // Determine if we need extra includes let mut extra_includes = vec![]; @@ -4417,7 +4806,7 @@ fn generate_optional_type(optional_name: &str, module: &ModuleDef, api_macro: &s "// NOTE: {cpp_inner_type} field not exposed to Blueprint due to non-blueprintable elements" ); } - writeln!(output, "{cpp_inner_type} Value;"); + writeln!(output, "{cpp_inner_type} Value = {{}};"); writeln!(output); // Constructors @@ -4490,14 +4879,19 @@ fn generate_optional_type(optional_name: &str, module: &ModuleDef, api_macro: &s } // Get the name for a result type (e.g., "ResultStringString", "ResultInt32String") -fn get_result_type_name(module: &ModuleDef, ok_ty: &AlgebraicTypeUse, err_ty: &AlgebraicTypeUse) -> String { - let ok_name = get_type_name_for_result(module, ok_ty); - let err_name = get_type_name_for_result(module, err_ty); +fn get_result_type_name( + module_prefix: &str, + module: &ModuleDef, + ok_ty: &AlgebraicTypeUse, + err_ty: &AlgebraicTypeUse, +) -> String { + let ok_name = get_type_name_for_result(module_prefix, module, ok_ty); + let err_name = get_type_name_for_result(module_prefix, module, err_ty); format!("Result{ok_name}{err_name}") } // Helper function to get the type name component for result types -fn get_type_name_for_result(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { +fn get_type_name_for_result(module_prefix: &str, module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { match ty { AlgebraicTypeUse::Primitive(p) => match p { PrimitiveType::Bool => "Bool".to_string(), @@ -4526,18 +4920,18 @@ fn get_type_name_for_result(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String AlgebraicTypeUse::Unit => "Unit".to_string(), AlgebraicTypeUse::Array(elem) => { // Generate specific array types based on element type - let elem_name = get_array_element_type_name(module, elem); + let elem_name = get_array_element_type_name(module_prefix, module, elem); format!("Vec{elem_name}") } - AlgebraicTypeUse::Ref(r) => type_ref_name(module, *r), + AlgebraicTypeUse::Ref(r) => type_ref_name(module_prefix, module, *r), AlgebraicTypeUse::Option(inner) => { // Handle optional types like Option - let inner_name = get_type_name_for_result(module, inner); + let inner_name = get_type_name_for_result(module_prefix, module, inner); format!("Optional{inner_name}") } AlgebraicTypeUse::Result { ok_ty, err_ty } => { // Handle nested results like Result, bool> - get_result_type_name(module, ok_ty, err_ty) + get_result_type_name(module_prefix, module, ok_ty, err_ty) } AlgebraicTypeUse::Never => "Never".to_string(), } @@ -4545,6 +4939,7 @@ fn get_type_name_for_result(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String // Generate the content for a result type file fn generate_result_type( + module_prefix: &str, ok_type_name: &str, err_type_name: &str, module: &ModuleDef, @@ -4552,10 +4947,10 @@ fn generate_result_type( module_name: &str, ) -> String { // Determine the C++ type for the ok value - let cpp_ok_type = determine_cpp_type_for_result(ok_type_name, module, module_name); + let cpp_ok_type = determine_cpp_type_for_result(module_prefix, ok_type_name, module, module_name); // Determine the C++ type for the err value - let cpp_err_type = determine_cpp_type_for_result(err_type_name, module, module_name); + let cpp_err_type = determine_cpp_type_for_result(module_prefix, err_type_name, module, module_name); // Determine if we need extra includes let mut extra_includes = vec![]; @@ -4594,7 +4989,7 @@ fn generate_result_type( "// NOTE: {cpp_ok_type} field not exposed to Blueprint due to non-blueprintable type" ); } - writeln!(output, "{cpp_ok_type} OkValue;"); + writeln!(output, "{cpp_ok_type} OkValue = {{}};"); writeln!(output); // The err value @@ -4607,7 +5002,7 @@ fn generate_result_type( "// NOTE: {cpp_err_type} field not exposed to Blueprint due to non-blueprintable type" ); } - writeln!(output, "{cpp_err_type} ErrValue;"); + writeln!(output, "{cpp_err_type} ErrValue = {{}};"); writeln!(output); // Constructors @@ -4737,6 +5132,7 @@ fn generate_result_type( } fn autogen_cpp_struct( + module_prefix: &str, module: &ModuleDef, name: &str, // Changed to &str product_type: &ProductTypeDef, @@ -4746,7 +5142,7 @@ fn autogen_cpp_struct( let mut headers = HashSet::::new(); for (_, field_ty) in product_type { - collect_includes_for_type(module, field_ty, &mut headers, module_name); + collect_includes_for_type(module_prefix, module, field_ty, &mut headers, module_name); } // Convert to `Vec<&str>` so UnrealCppAutogen::new works @@ -4766,8 +5162,8 @@ fn autogen_cpp_struct( for (orig_name, ty) in product_type.into_iter() { let field_name = orig_name.deref().to_case(Case::Pascal); - let ty_str = cpp_ty_fmt_with_module(module, ty, module_name).to_string(); - let init_str = cpp_ty_init_fmt_impl(module, ty); + let ty_str = cpp_ty_fmt_with_module(module_prefix, module, ty, module_name).to_string(); + let init_str = cpp_ty_init_fmt_impl(module_prefix, module, ty); let field_decl = format!("{ty_str} {field_name}{init_str}"); // Check if the type is blueprintable @@ -5048,6 +5444,7 @@ fn autogen_cpp_enum(name: &str, enum_type: &PlainEnumTypeDef) -> String { } fn autogen_cpp_sum( + module_prefix: &str, module: &ModuleDef, name: &str, sum_type: &SumTypeDef, @@ -5061,7 +5458,7 @@ fn autogen_cpp_sum( /* ------------------------------------------------------------------ */ let mut includes = HashSet::::new(); for (_, alg_ty) in &sum_type.variants { - collect_includes_for_type(module, alg_ty, &mut includes, module_name); + collect_includes_for_type(module_prefix, module, alg_ty, &mut includes, module_name); } includes.insert("Kismet/BlueprintFunctionLibrary.h".to_string()); @@ -5085,7 +5482,7 @@ fn autogen_cpp_sum( let comma = if ix + 1 == sum_type.variants.len() { "" } else { "," }; writeln!(output, " {}{}", variant.to_case(Case::Pascal), comma); - let variant_cpp_type = cpp_ty_fmt_with_module(module, _variant_type, module_name).to_string(); + let variant_cpp_type = cpp_ty_fmt_with_module(module_prefix, module, _variant_type, module_name).to_string(); variant_type.insert(variant_cpp_type); } writeln!(output, "}};\n"); @@ -5121,7 +5518,7 @@ fn autogen_cpp_sum( /* 4a. Static factories per variant -------------------------------- */ for (variant_name, variant_type) in &sum_type.variants { let pas = variant_name.to_case(Case::Pascal); - let variant_cpp_type = cpp_ty_fmt_with_module(module, variant_type, module_name).to_string(); + let variant_cpp_type = cpp_ty_fmt_with_module(module_prefix, module, variant_type, module_name).to_string(); let param_type = format!("const {variant_cpp_type}& "); writeln!(output, " static F{name}Type {pas}({param_type}Value)\n {{"); @@ -5138,7 +5535,7 @@ fn autogen_cpp_sum( /* 4b. Get/Is helpers ---------------------------------------------- */ for (variant_name, variant_type) in &sum_type.variants { let pas = variant_name.to_case(Case::Pascal); - let variant_cpp_type = cpp_ty_fmt_with_module(module, variant_type, module_name).to_string(); + let variant_cpp_type = cpp_ty_fmt_with_module(module_prefix, module, variant_type, module_name).to_string(); // Is* writeln!( @@ -5258,7 +5655,7 @@ fn autogen_cpp_sum( let variant_count = sum_type.variants.len(); for (idx, (variant_name, variant_type)) in sum_type.variants.iter().enumerate() { let variant_pascal = variant_name.to_case(Case::Pascal); - let variant_cpp_type = cpp_ty_fmt_with_module(module, variant_type, module_name).to_string(); + let variant_cpp_type = cpp_ty_fmt_with_module(module_prefix, module, variant_type, module_name).to_string(); if idx < variant_count - 1 { writeln!(output, " {variant_pascal}, {variant_cpp_type},"); @@ -5282,7 +5679,7 @@ fn autogen_cpp_sum( for (variant_name, variant_type) in &sum_type.variants { let pas = variant_name.to_case(Case::Pascal); - let variant_cpp_type = cpp_ty_fmt_with_module(module, variant_type, module_name).to_string(); + let variant_cpp_type = cpp_ty_fmt_with_module(module_prefix, module, variant_type, module_name).to_string(); // ctor functions if is_blueprintable(module, variant_type) { @@ -5355,40 +5752,44 @@ impl IdentifierCasing for Identifier { } fn cpp_ty_fmt_with_module<'a>( + module_prefix: &'a str, module: &'a ModuleDef, ty: &'a AlgebraicTypeUse, module_name: &'a str, ) -> impl fmt::Display + 'a { - cpp_ty_fmt_impl(module, ty, module_name) + cpp_ty_fmt_impl(module_prefix, module, ty, module_name) } fn cpp_ty_fmt_blueprint_compatible<'a>( + module_prefix: &'a str, module: &'a ModuleDef, ty: &'a AlgebraicTypeUse, module_name: &'a str, ) -> impl fmt::Display + 'a { - cpp_ty_fmt_blueprint_impl(module, ty, module_name) + cpp_ty_fmt_blueprint_impl(module_prefix, module, ty, module_name) } fn cpp_ty_fmt_blueprint_impl<'a>( + module_prefix: &'a str, module: &'a ModuleDef, ty: &'a AlgebraicTypeUse, module_name: &'a str, ) -> impl fmt::Display + 'a { fmt_fn(move |f| match ty { AlgebraicTypeUse::Array(elem) => { - let elem_type = cpp_ty_fmt_with_module(module, elem, module_name).to_string(); + let elem_type = cpp_ty_fmt_with_module(module_prefix, module, elem, module_name).to_string(); write!(f, "TArray<{elem_type}>") } // For all other types, use the regular implementation _ => { - let display_obj = cpp_ty_fmt_with_module(module, ty, module_name); + let display_obj = cpp_ty_fmt_with_module(module_prefix, module, ty, module_name); write!(f, "{display_obj}") } }) } fn cpp_ty_fmt_impl<'a>( + module_prefix: &'a str, module: &'a ModuleDef, ty: &'a AlgebraicTypeUse, module_name: &'a str, @@ -5418,7 +5819,7 @@ fn cpp_ty_fmt_impl<'a>( } AlgebraicTypeUse::Array(elem) => { - let elem_type = cpp_ty_fmt_impl(module, elem, module_name).to_string(); + let elem_type = cpp_ty_fmt_impl(module_prefix, module, elem, module_name).to_string(); write!(f, "TArray<{elem_type}>") } @@ -5433,7 +5834,7 @@ fn cpp_ty_fmt_impl<'a>( // --------- references to user-defined types --------- AlgebraicTypeUse::Ref(r) => { - let scoped = type_ref_name(module, *r); // PascalCase + let scoped = type_ref_name(module_prefix, module, *r); // PascalCase match &module.typespace_for_generate()[*r] { AlgebraicTypeDef::PlainEnum(_) => write!(f, "E{scoped}Type"), // enum → EFooType AlgebraicTypeDef::Product(_) => write!(f, "F{scoped}Type"), // struct/record → FFooType @@ -5443,7 +5844,7 @@ fn cpp_ty_fmt_impl<'a>( // Options use the generated optional types AlgebraicTypeUse::Option(inner) => { - let optional_name = get_optional_type_name(module, inner); + let optional_name = get_optional_type_name(module_prefix, module, inner); if module_name.is_empty() { write!(f, "F{optional_name}") } else { @@ -5454,8 +5855,8 @@ fn cpp_ty_fmt_impl<'a>( // Result use the generated result types AlgebraicTypeUse::Result { ok_ty, err_ty } => { - let ok_name = get_type_name_for_result(module, ok_ty); - let err_name = get_type_name_for_result(module, err_ty); + let ok_name = get_type_name_for_result(module_prefix, module, ok_ty); + let err_name = get_type_name_for_result(module_prefix, module, err_ty); let module_name_pascal = module_name.to_case(Case::Pascal); write!(f, "F{module_name_pascal}Result{ok_name}{err_name}") @@ -5470,7 +5871,7 @@ fn cpp_ty_fmt_impl<'a>( // otherwise the engine logs "property not initialized properly" errors. // This includes primitives (bool defaults to true if not initialized to false), // and enum types (must be initialized to a valid enum value). -fn cpp_ty_init_fmt_impl(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { +fn cpp_ty_init_fmt_impl(module_prefix: &str, module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { match ty { AlgebraicTypeUse::Primitive(p) => match p { PrimitiveType::Bool => " = false".to_string(), @@ -5504,7 +5905,7 @@ fn cpp_ty_init_fmt_impl(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { // Use the first variant as the default value. match &module.typespace_for_generate()[*r] { AlgebraicTypeDef::PlainEnum(plain_enum) => { - let type_name = type_ref_name(module, *r); + let type_name = type_ref_name(module_prefix, module, *r); if let Some(first_variant) = plain_enum.variants.first() { let variant_name = first_variant.deref().to_case(Case::Pascal); format!(" = E{type_name}Type::{variant_name}") @@ -5527,34 +5928,43 @@ fn cpp_ty_init_fmt_impl(module: &ModuleDef, ty: &AlgebraicTypeUse) -> String { // Given an `AlgebraicTypeUse`, add every referenced type’s generated // header name (`".g.h"`) into `out` (a `HashSet` avoids dups). -fn collect_includes_for_type(module: &ModuleDef, ty: &AlgebraicTypeUse, out: &mut HashSet, module_name: &str) { +fn collect_includes_for_type( + module_prefix: &str, + module: &ModuleDef, + ty: &AlgebraicTypeUse, + out: &mut HashSet, + module_name: &str, +) { use AlgebraicTypeUse::*; match ty { Ref(r) => { - let header = format!("ModuleBindings/Types/{}Type.g.h", type_ref_name(module, *r)); + let header = format!( + "ModuleBindings/Types/{}Type.g.h", + type_ref_name(module_prefix, module, *r) + ); out.insert(header); } Option(inner) => { // Add the optional type header - let optional_name = get_optional_type_name(module, inner); + let optional_name = get_optional_type_name(module_prefix, module, inner); let module_name_pascal = module_name.to_case(Case::Pascal); let header = format!("ModuleBindings/Optionals/{module_name_pascal}{optional_name}.g.h"); out.insert(header); // Also collect includes for the inner type - collect_includes_for_type(module, inner, out, module_name); + collect_includes_for_type(module_prefix, module, inner, out, module_name); } Result { ok_ty, err_ty } => { // Add the result type header - let result_name = get_result_type_name(module, ok_ty, err_ty); + let result_name = get_result_type_name(module_prefix, module, ok_ty, err_ty); let module_name_pascal = module_name.to_case(Case::Pascal); let header = format!("ModuleBindings/Results/{module_name_pascal}{result_name}.g.h"); out.insert(header); // Also collect includes for the ok and err types - collect_includes_for_type(module, ok_ty, out, module_name); - collect_includes_for_type(module, err_ty, out, module_name); + collect_includes_for_type(module_prefix, module, ok_ty, out, module_name); + collect_includes_for_type(module_prefix, module, err_ty, out, module_name); } Array(inner) => { - collect_includes_for_type(module, inner, out, module_name); + collect_includes_for_type(module_prefix, module, inner, out, module_name); } // Builtin types that require Builtins.h (also includes LargeIntegers.h) Identity | ConnectionId | Timestamp | TimeDuration | ScheduleAt | Uuid => { @@ -5585,11 +5995,134 @@ fn collect_includes_for_type(module: &ModuleDef, ty: &AlgebraicTypeUse, out: &mu } // UnrealCPP-specific type reference name function that preserves original case -fn type_ref_name(module: &ModuleDef, typeref: spacetimedb_lib::sats::AlgebraicTypeRef) -> String { +fn type_ref_name(module_prefix: &str, module: &ModuleDef, typeref: spacetimedb_lib::sats::AlgebraicTypeRef) -> String { let (name, _def) = module.type_def_from_ref(typeref).unwrap(); // Preserve original case instead of applying Pascal case conversion - name.name_segments() + let base_name = name + .name_segments() .last() .map(|id| id.deref().to_string()) - .unwrap_or_else(|| "Unnamed".to_string()) + .unwrap_or_else(|| "Unnamed".to_string()); + format!("{module_prefix}{base_name}") +} + +fn ensure_module_in_uproject(uproject_dir: &Path, module_name: &str) -> Result<(), String> { + let uproject_file = std::fs::read_dir(uproject_dir) + .map_err(|e| format!("Failed to read Unreal project directory '{}': {e}", uproject_dir.display()))? + .filter_map(|entry| entry.ok()) + .find(|entry| { + entry + .path() + .extension() + .and_then(|ext| ext.to_str()) + .map(|ext| ext == "uproject") + .unwrap_or(false) + }) + .ok_or_else(|| { + format!( + "No .uproject file found in '{}'. Unreal code generation requires a project directory containing a .uproject file.", + uproject_dir.display() + ) + })?; + + let uproject_path = uproject_file.path(); + let content = std::fs::read_to_string(&uproject_path) + .map_err(|e| format!("Failed to read .uproject file '{}': {e}", uproject_path.display()))?; + + let mut json: serde_json::Value = serde_json::from_str(&content) + .map_err(|e| format!("Invalid JSON in .uproject file '{}': {e}", uproject_path.display()))?; + + if !json.is_object() { + return Err(format!( + "Invalid .uproject file '{}': top-level JSON must be an object.", + uproject_path.display() + )); + } + + let json_obj = json + .as_object_mut() + .expect("validated object .uproject JSON should have an object map"); + + if !json_obj.contains_key("Modules") { + json_obj.insert("Modules".to_string(), serde_json::Value::Array(vec![])); + } + + let modules = json_obj + .get_mut("Modules") + .and_then(|m| m.as_array_mut()) + .ok_or_else(|| { + format!( + "Invalid .uproject file '{}': 'Modules' must be an array.", + uproject_path.display() + ) + })?; + + let module_exists = modules.iter().any(|module| { + module + .get("Name") + .and_then(|name| name.as_str()) + .map(|name| name == module_name) + .unwrap_or(false) + }); + + if !module_exists { + modules.push(serde_json::json!({ + "Name": module_name, + "Type": "Runtime", + "LoadingPhase": "Default" + })); + + let formatted_json = serde_json::to_string_pretty(&json) + .map_err(|e| format!("Failed to serialize .uproject file '{}': {e}", uproject_path.display()))?; + + std::fs::write(&uproject_path, formatted_json) + .map_err(|e| format!("Failed to write .uproject file '{}': {e}", uproject_path.display()))?; + } + + Ok(()) +} + +fn generate_build_cs_content(module_name: &str) -> String { + format!( + r#"using UnrealBuildTool; + +public class {module_name} : ModuleRules +{{ + public {module_name}(ReadOnlyTargetRules Target) : base(Target) + {{ + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] {{ + "Core", + "CoreUObject", + "Engine", + "SpacetimeDbSdk" + }}); + + PrivateDependencyModuleNames.AddRange(new string[] {{ + }}); + }} +}} +"#, + module_name = module_name + ) +} + +fn generate_module_cpp_content(module_name: &str) -> String { + format!( + r#"#include "{module_name}.h" +#include "Modules/ModuleManager.h" + +IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, {module_name}, "{module_name}"); +"#, + module_name = module_name + ) +} + +fn generate_module_h_content(_module_name: &str) -> String { + r#"#pragma once + +#include "CoreMinimal.h" +"# + .to_string() } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/Entity.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/Entity.cpp index 9d307293b52..e74c1321e7d 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/Entity.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/Entity.cpp @@ -49,6 +49,20 @@ void AEntity::ConsumeDespawn(float DeltaTime) } } +void AEntity::StartConsumeDespawn(AEntity* InConsumingEntity) +{ + if (!InConsumingEntity) + { + return; + } + + ConsumingEntity = InConsumingEntity; + bIsDespawning = true; + DespawnElapsed = 0.f; + ConsumeStartPosition = GetActorLocation(); + ConsumeStartScale = GetActorScale3D(); +} + void AEntity::Spawn(int32 InEntityId) { EntityId = InEntityId; @@ -72,39 +86,16 @@ void AEntity::OnEntityUpdated(const FEntityType& NewVal) void AEntity::OnDelete(const FEventContext& Context) { - if (ConsumeDelete(Context)) + if (bIsDespawning) return; Destroy(); } -bool AEntity::ConsumeDelete(const FEventContext& Context) -{ - if (!Context.Event.IsReducer()) - return false; - - const FReducer Reducer = Context.Event.GetAsReducer(); - - if (!Reducer.IsConsumeEntity()) - return false; - - const FConsumeEntityArgs Args = Reducer.GetAsConsumeEntity(); - const int32 ConsumerId = Args.Request.ConsumerEntityId; - ConsumingEntity = AGameManager::Instance->GetEntity(ConsumerId); - if (!ConsumingEntity) - return false; - - bIsDespawning = true; - DespawnElapsed = 0.f; - ConsumeStartPosition = GetActorLocation(); - ConsumeStartScale = GetActorScale3D(); - return true; -} - void AEntity::SetColor(const FLinearColor& Color) const { if (UPaperSpriteComponent* SpriteComponent = FindComponentByClass()) { SpriteComponent->SetSpriteColor(Color); } -} \ No newline at end of file +} diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/GameManager.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/GameManager.cpp index 4579401dadd..4ddab00c278 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/GameManager.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/GameManager.cpp @@ -7,6 +7,7 @@ #include "Connection/Credentials.h" #include "ModuleBindings/Tables/CircleTable.g.h" #include "ModuleBindings/Tables/ConfigTable.g.h" +#include "ModuleBindings/Tables/ConsumeEntityEventTable.g.h" #include "ModuleBindings/Tables/EntityTable.g.h" #include "ModuleBindings/Tables/FoodTable.g.h" #include "ModuleBindings/Tables/PlayerTable.g.h" @@ -103,6 +104,7 @@ void AGameManager::HandleConnect(UDbConnection* InConn, FSpacetimeDBIdentity Ide LocalIdentity = Identity; Conn->Db->Circle->OnInsert.AddDynamic(this, &AGameManager::OnCircleInsert); + Conn->Db->ConsumeEntityEvent->OnInsert.AddDynamic(this, &AGameManager::OnConsumeEntityEventInsert); Conn->Db->Entity->OnUpdate.AddDynamic(this, &AGameManager::OnEntityUpdate); Conn->Db->Entity->OnDelete.AddDynamic(this, &AGameManager::OnEntityDelete); Conn->Db->Food->OnInsert.AddDynamic(this, &AGameManager::OnFoodInsert); @@ -254,6 +256,18 @@ void AGameManager::OnFoodInsert(const FEventContext& Context, const FFoodType& N SpawnFood(NewRow); } +void AGameManager::OnConsumeEntityEventInsert(const FEventContext& Context, const FConsumeEntityEventType& NewRow) +{ + AEntity* ConsumedEntity = GetEntity(NewRow.ConsumedEntityId); + AEntity* ConsumerEntity = GetEntity(NewRow.ConsumerEntityId); + if (!ConsumedEntity || !ConsumerEntity) + { + return; + } + + ConsumedEntity->StartConsumeDespawn(ConsumerEntity); +} + void AGameManager::OnPlayerInsert(const FEventContext& Context, const FPlayerType& NewRow) { SpawnOrGetPlayer(NewRow); diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/SpacetimeDBClient.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/SpacetimeDBClient.g.cpp index 8071a62f7fa..2a5c2f73f72 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/SpacetimeDBClient.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/SpacetimeDBClient.g.cpp @@ -11,52 +11,12 @@ #include "ModuleBindings/Tables/FoodTable.g.h" #include "ModuleBindings/Tables/PlayerTable.g.h" -static FReducer DecodeReducer(const FReducerEvent& Event) -{ - const FString& ReducerName = Event.ReducerCall.ReducerName; - - if (ReducerName == TEXT("enter_game")) - { - FEnterGameArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::EnterGame(Args); - } - - if (ReducerName == TEXT("player_split")) - { - FPlayerSplitArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::PlayerSplit(Args); - } - - if (ReducerName == TEXT("respawn")) - { - FRespawnArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::Respawn(Args); - } - - if (ReducerName == TEXT("suicide")) - { - FSuicideArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::Suicide(Args); - } - - if (ReducerName == TEXT("update_player_input")) - { - FUpdatePlayerInputArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePlayerInput(Args); - } - - return FReducer(); -} - UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - SetReducerFlags = ObjectInitializer.CreateDefaultSubobject(this, TEXT("SetReducerFlags")); - Db = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteTables")); Db->Initialize(); Reducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteReducers")); - Reducers->SetCallReducerFlags = SetReducerFlags; Reducers->Conn = this; Procedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteProcedures")); @@ -74,7 +34,6 @@ FContextBase::FContextBase(UDbConnection* InConn) { Db = InConn->Db; Reducers = InConn->Reducers; - SetReducerFlags = InConn->SetReducerFlags; Procedures = InConn->Procedures; Conn = InConn; } @@ -121,27 +80,6 @@ void URemoteTables::Initialize() /**/ } -void USetReducerFlags::EnterGame(ECallReducerFlags Flag) -{ - FlagMap.Add("EnterGame", Flag); -} -void USetReducerFlags::PlayerSplit(ECallReducerFlags Flag) -{ - FlagMap.Add("PlayerSplit", Flag); -} -void USetReducerFlags::Respawn(ECallReducerFlags Flag) -{ - FlagMap.Add("Respawn", Flag); -} -void USetReducerFlags::Suicide(ECallReducerFlags Flag) -{ - FlagMap.Add("Suicide", Flag); -} -void USetReducerFlags::UpdatePlayerInput(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePlayerInput", Flag); -} - void URemoteReducers::EnterGame(const FString& Name) { if (!Conn) @@ -150,7 +88,9 @@ void URemoteReducers::EnterGame(const FString& Name) return; } - Conn->CallReducerTyped(TEXT("enter_game"), FEnterGameArgs(Name), SetCallReducerFlags); + FEnterGameArgs ReducerArgs(Name); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("enter_game"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::EnterGame(ReducerArgs)); } } bool URemoteReducers::InvokeEnterGame(const FReducerEventContext& Context, const UEnterGameReducer* Args) @@ -194,7 +134,9 @@ void URemoteReducers::PlayerSplit() return; } - Conn->CallReducerTyped(TEXT("player_split"), FPlayerSplitArgs(), SetCallReducerFlags); + FPlayerSplitArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("player_split"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::PlayerSplit(ReducerArgs)); } } bool URemoteReducers::InvokePlayerSplit(const FReducerEventContext& Context, const UPlayerSplitReducer* Args) @@ -238,7 +180,9 @@ void URemoteReducers::Respawn() return; } - Conn->CallReducerTyped(TEXT("respawn"), FRespawnArgs(), SetCallReducerFlags); + FRespawnArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("respawn"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::Respawn(ReducerArgs)); } } bool URemoteReducers::InvokeRespawn(const FReducerEventContext& Context, const URespawnReducer* Args) @@ -282,7 +226,9 @@ void URemoteReducers::Suicide() return; } - Conn->CallReducerTyped(TEXT("suicide"), FSuicideArgs(), SetCallReducerFlags); + FSuicideArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("suicide"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::Suicide(ReducerArgs)); } } bool URemoteReducers::InvokeSuicide(const FReducerEventContext& Context, const USuicideReducer* Args) @@ -326,7 +272,9 @@ void URemoteReducers::UpdatePlayerInput(const FDbVector2Type& Direction) return; } - Conn->CallReducerTyped(TEXT("update_player_input"), FUpdatePlayerInputArgs(Direction), SetCallReducerFlags); + FUpdatePlayerInputArgs ReducerArgs(Direction); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_player_input"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePlayerInput(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePlayerInput(const FReducerEventContext& Context, const UUpdatePlayerInputReducer* Args) @@ -397,11 +345,45 @@ void UDbConnection::OnUnhandledProcedureErrorHandler(const FProcedureEventContex } } +void UDbConnection::RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer) +{ + Reducer.RequestId = RequestId; + PendingTypedReducers.Add(RequestId, MoveTemp(Reducer)); +} + +bool UDbConnection::TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const +{ + if (const FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + return true; + } + return false; +} + +bool UDbConnection::TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer) +{ + if (FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + PendingTypedReducers.Remove(RequestId); + return true; + } + return false; +} + void UDbConnection::ReducerEvent(const FReducerEvent& Event) { if (!Reducers) { return; } - FReducer DecodedReducer = DecodeReducer(Event); + FReducer DecodedReducer; + if (!TryTakePendingTypedReducer(Event.RequestId, DecodedReducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), Event.RequestId); + UE_LOG(LogTemp, Error, TEXT("%s"), *ErrorMessage); + ReducerEventFailed(Event, ErrorMessage); + return; + } FClientUnrealReducerEvent ReducerEvent; ReducerEvent.CallerConnectionId = Event.CallerConnectionId; @@ -413,8 +395,8 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) FReducerEventContext Context(this, ReducerEvent); - // Use hardcoded string matching for reducer dispatching - const FString& ReducerName = Event.ReducerCall.ReducerName; + // Dispatch by typed reducer metadata + const FString& ReducerName = ReducerEvent.Reducer.ReducerName; if (ReducerName == TEXT("enter_game")) { @@ -638,7 +620,13 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime case ESpacetimeDBEventTag::Reducer: { FReducerEvent ReducerEvent = Event.GetAsReducer(); - FReducer Reducer = DecodeReducer(ReducerEvent); + FReducer Reducer; + if (!TryGetPendingTypedReducer(ReducerEvent.RequestId, Reducer)) + { + UE_LOG(LogTemp, Warning, TEXT("Missing typed reducer for request_id %u while building table-update event context; using UnknownTransaction event"), ReducerEvent.RequestId); + BaseEvent = FClientUnrealEvent::UnknownTransaction(FSpacetimeDBUnit()); + break; + } BaseEvent = FClientUnrealEvent::Reducer(Reducer); break; } @@ -655,6 +643,10 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime BaseEvent = FClientUnrealEvent::Disconnected(Event.GetAsDisconnected()); break; + case ESpacetimeDBEventTag::Transaction: + BaseEvent = FClientUnrealEvent::Transaction(Event.GetAsTransaction()); + break; + case ESpacetimeDBEventTag::SubscribeError: BaseEvent = FClientUnrealEvent::SubscribeError(Event.GetAsSubscribeError()); break; diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/CircleTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/CircleTable.g.cpp index 975329c06d0..198f20ae88f 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/CircleTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/CircleTable.g.cpp @@ -13,6 +13,24 @@ void UCircleTable::PostInitialize() Data = MakeShared>(); TSharedPtr> CircleTable = Data->GetOrAdd(TableName); + CircleTable->AddUniqueConstraint("entity_id", [](const FCircleType& Row) -> const int32& { + return Row.EntityId; }); + + EntityId = NewObject(this); + EntityId->SetCache(CircleTable); + + // Register a new multi-key B-Tree index named "player_id" on the CircleTable. + CircleTable->AddMultiKeyBTreeIndex>( + TEXT("player_id"), + [](const FCircleType& Row) + { + // This tuple is stored in the B-Tree index for fast composite key lookups. + return MakeTuple(Row.PlayerId); + } + ); + + PlayerId = NewObject(this); + PlayerId->SetCache(CircleTable); /***/ } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConfigTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConfigTable.g.cpp index 6f7a6d774ca..d6523596f27 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConfigTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConfigTable.g.cpp @@ -13,6 +13,11 @@ void UConfigTable::PostInitialize() Data = MakeShared>(); TSharedPtr> ConfigTable = Data->GetOrAdd(TableName); + ConfigTable->AddUniqueConstraint("id", [](const FConfigType& Row) -> const int32& { + return Row.Id; }); + + Id = NewObject(this); + Id->SetCache(ConfigTable); /***/ } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConsumeEntityEventTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConsumeEntityEventTable.g.cpp index 2ab6e4ef260..65a5cac52e0 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConsumeEntityEventTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/ConsumeEntityEventTable.g.cpp @@ -19,7 +19,12 @@ void UConsumeEntityEventTable::PostInitialize() FTableAppliedDiff UConsumeEntityEventTable::Update(TArray> InsertsRef, TArray> DeletesRef) { - FTableAppliedDiff Diff = BaseUpdate(InsertsRef, DeletesRef, Data, TableName); + // Event tables are callback-only: do not persist rows in the local cache. + FTableAppliedDiff Diff; + for (const FWithBsatn& Insert : InsertsRef) + { + Diff.Inserts.Add(Insert.Bsatn, Insert.Row); + } return Diff; } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/EntityTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/EntityTable.g.cpp index 15f46a924ff..33aa332bbf9 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/EntityTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/EntityTable.g.cpp @@ -13,6 +13,11 @@ void UEntityTable::PostInitialize() Data = MakeShared>(); TSharedPtr> EntityTable = Data->GetOrAdd(TableName); + EntityTable->AddUniqueConstraint("entity_id", [](const FEntityType& Row) -> const int32& { + return Row.EntityId; }); + + EntityId = NewObject(this); + EntityId->SetCache(EntityTable); /***/ } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/FoodTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/FoodTable.g.cpp index 12191581ea2..313969e8b47 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/FoodTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/FoodTable.g.cpp @@ -13,6 +13,11 @@ void UFoodTable::PostInitialize() Data = MakeShared>(); TSharedPtr> FoodTable = Data->GetOrAdd(TableName); + FoodTable->AddUniqueConstraint("entity_id", [](const FFoodType& Row) -> const int32& { + return Row.EntityId; }); + + EntityId = NewObject(this); + EntityId->SetCache(FoodTable); /***/ } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/PlayerTable.g.cpp b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/PlayerTable.g.cpp index 9c2a69f9bda..f8c52f4d4e6 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/PlayerTable.g.cpp +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/Tables/PlayerTable.g.cpp @@ -13,6 +13,16 @@ void UPlayerTable::PostInitialize() Data = MakeShared>(); TSharedPtr> PlayerTable = Data->GetOrAdd(TableName); + PlayerTable->AddUniqueConstraint("identity", [](const FPlayerType& Row) -> const FSpacetimeDBIdentity& { + return Row.Identity; }); + PlayerTable->AddUniqueConstraint("player_id", [](const FPlayerType& Row) -> const int32& { + return Row.PlayerId; }); + + Identity = NewObject(this); + Identity->SetCache(PlayerTable); + + PlayerId = NewObject(this); + PlayerId->SetCache(PlayerTable); /***/ } diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/Entity.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/Entity.h index 11016809f31..3a1c051f75a 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/Entity.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/Entity.h @@ -32,11 +32,11 @@ class CLIENT_UNREAL_API AEntity : public AActor int32 EntityId = 0; virtual void Tick(float DeltaTime) override; void ConsumeDespawn(float DeltaTime); + void StartConsumeDespawn(AEntity* InConsumingEntity); void Spawn(int32 InEntityId); virtual void OnEntityUpdated(const FEntityType& NewVal); virtual void OnDelete(const FEventContext& Context); - bool ConsumeDelete(const FEventContext& Context); void SetColor(const FLinearColor& Color) const; diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/GameManager.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/GameManager.h index 939319b3ce1..7adcfdc89fb 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/GameManager.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/GameManager.h @@ -122,5 +122,7 @@ class CLIENT_UNREAL_API AGameManager : public AActor void OnPlayerInsert(const FEventContext& Context, const FPlayerType& NewRow); UFUNCTION() void OnPlayerDelete(const FEventContext& Context, const FPlayerType& RemovedRow); + UFUNCTION() + void OnConsumeEntityEventInsert(const FEventContext& Context, const FConsumeEntityEventType& NewRow); /* Data Bindings */ }; diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/SpacetimeDBClient.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/SpacetimeDBClient.g.h index decf7040e1a..891bde00912 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/SpacetimeDBClient.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/SpacetimeDBClient.g.h @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 2.0.0 (commit 6a6b5a6616f0578aa641bc0689691f953b13feb8). +// This was generated using spacetimedb cli version 2.0.3 (commit b6045fcc908d2846f8fb26570c2f300f5d685996). #pragma once #include "CoreMinimal.h" @@ -9,7 +9,6 @@ #include "Connection/Callback.h" #include "Connection/DbConnectionBase.h" #include "Connection/DbConnectionBuilder.h" -#include "Connection/SetReducerFlags.h" #include "Connection/Subscription.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "ModuleBindings/ReducerBase.g.h" @@ -61,7 +60,7 @@ struct CLIENT_UNREAL_API FContextBase { GENERATED_BODY() - FContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Procedures(nullptr), Conn(nullptr) {}; + FContextBase() : Db(nullptr), Reducers(nullptr), Procedures(nullptr), Conn(nullptr) {}; FContextBase(UDbConnection* InConn); UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") @@ -70,9 +69,6 @@ struct CLIENT_UNREAL_API FContextBase UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteProcedures* Procedures; @@ -100,9 +96,6 @@ class CLIENT_UNREAL_API UContextBaseBpLib : public UBlueprintFunctionLibrary UFUNCTION(BlueprintPure, Category="SpacetimeDB") static URemoteReducers* GetReducers(const FContextBase& Ctx) { return Ctx.Reducers; } - UFUNCTION(BlueprintPure, Category="SpacetimeDB") - static USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) { return Ctx.SetReducerFlags; } - static URemoteProcedures* GetProcedures(const FContextBase& Ctx) { return Ctx.Procedures; } UFUNCTION(BlueprintPure, Category="SpacetimeDB") @@ -437,6 +430,14 @@ struct CLIENT_UNREAL_API FClientUnrealEvent return Obj; } + static FClientUnrealEvent Transaction(const FSpacetimeDBUnit& Value) + { + FClientUnrealEvent Obj; + Obj.Tag = ESpacetimeDBEventTag::Transaction; + Obj.MessageData.Set(Value); + return Obj; + } + static FClientUnrealEvent SubscribeError(const FString& Value) { FClientUnrealEvent Obj; @@ -481,6 +482,13 @@ struct CLIENT_UNREAL_API FClientUnrealEvent return MessageData.Get(); } + FORCEINLINE bool IsTransaction() const { return Tag == ESpacetimeDBEventTag::Transaction; } + FORCEINLINE FSpacetimeDBUnit GetAsTransaction() const + { + ensureMsgf(IsTransaction(), TEXT("MessageData does not hold Transaction!")); + return MessageData.Get(); + } + FORCEINLINE bool IsSubscribeError() const { return Tag == ESpacetimeDBEventTag::SubscribeError; } FORCEINLINE FString GetAsSubscribeError() const { @@ -504,6 +512,7 @@ struct CLIENT_UNREAL_API FClientUnrealEvent case ESpacetimeDBEventTag::SubscribeApplied: return GetAsSubscribeApplied() == Other.GetAsSubscribeApplied(); case ESpacetimeDBEventTag::UnsubscribeApplied: return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected(); + case ESpacetimeDBEventTag::Transaction: return GetAsTransaction() == Other.GetAsTransaction(); case ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError(); case ESpacetimeDBEventTag::UnknownTransaction: return GetAsUnknownTransaction() == Other.GetAsUnknownTransaction(); default: return false; @@ -546,6 +555,12 @@ class CLIENT_UNREAL_API UClientUnrealEventBpLib : public UBlueprintFunctionLibra return FClientUnrealEvent::Disconnected(InValue); } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientUnrealEvent") + static FClientUnrealEvent Transaction(const FSpacetimeDBUnit& InValue) + { + return FClientUnrealEvent::Transaction(InValue); + } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientUnrealEvent") static FClientUnrealEvent SubscribeError(const FString& InValue) { @@ -570,6 +585,9 @@ class CLIENT_UNREAL_API UClientUnrealEventBpLib : public UBlueprintFunctionLibra UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientUnrealEvent") static bool IsDisconnected(const FClientUnrealEvent& Event) { return Event.IsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientUnrealEvent") + static bool IsTransaction(const FClientUnrealEvent& Event) { return Event.IsTransaction(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientUnrealEvent") static bool IsSubscribeError(const FClientUnrealEvent& Event) { return Event.IsSubscribeError(); } @@ -600,6 +618,12 @@ class CLIENT_UNREAL_API UClientUnrealEventBpLib : public UBlueprintFunctionLibra return Event.GetAsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientUnrealEvent") + static FSpacetimeDBUnit GetAsTransaction(const FClientUnrealEvent& Event) + { + return Event.GetAsTransaction(); + } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientUnrealEvent") static FString GetAsSubscribeError(const FClientUnrealEvent& Event) { @@ -682,25 +706,6 @@ DECLARE_DYNAMIC_DELEGATE_OneParam( FOnSubscriptionError, FErrorContext, Context); -UCLASS(BlueprintType) -class CLIENT_UNREAL_API USetReducerFlags : public USetReducerFlagsBase -{ - GENERATED_BODY() - -public: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void EnterGame(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void PlayerSplit(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void Respawn(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void Suicide(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePlayerInput(ECallReducerFlags Flag); - -}; - // RemoteTables class UCLASS(BlueprintType) class CLIENT_UNREAL_API URemoteTables : public UObject @@ -815,9 +820,6 @@ class CLIENT_UNREAL_API URemoteReducers : public UObject UPROPERTY() class UDbConnection* Conn; - - UPROPERTY() - USetReducerFlags* SetCallReducerFlags; }; // RemoteProcedures class @@ -952,9 +954,6 @@ class CLIENT_UNREAL_API UDbConnection : public UDbConnectionBase UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteProcedures* Procedures; @@ -966,7 +965,7 @@ class CLIENT_UNREAL_API UDbConnection : public UDbConnectionBase USubscriptionBuilder* SubscriptionBuilder(); /** Static entry point for constructing a connection. */ - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB Builder") + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB client_unreal Builder") static UDbConnectionBuilder* Builder(); // Error handling @@ -1006,5 +1005,17 @@ class CLIENT_UNREAL_API UDbConnection : public UDbConnectionBase virtual void ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage) override; // Override the procedure event failed handler virtual void ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) override; + + friend class USubscriptionBuilder; + friend class UDbConnectionBuilder; + friend class URemoteReducers; + + // Internal reducer correlation helpers (request_id -> typed reducer) + void RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer); + bool TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const; + bool TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer); + +private: + TMap PendingTypedReducers; }; diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/CircleTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/CircleTable.g.h index 8f8b8cbea06..e92587259a2 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/CircleTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/CircleTable.g.h @@ -12,12 +12,89 @@ #include "DBCache/TableCache.h" #include "CircleTable.g.generated.h" +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UCircleEntityIdUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> EntityIdIndexHelper; + +public: + UCircleEntityIdUniqueIndex() + // Initialize the helper with the specific unique index name + : EntityIdIndexHelper("entity_id") { + } + + /** + * Finds a Circle by their unique entityid. + * @param Key The entityid to search for. + * @return The found FCircleType, or a default-constructed FCircleType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|CircleIndex") + FCircleType Find(int32 Key) + { + // Simply delegate the call to the internal helper + return EntityIdIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InCircleCache) + { + EntityIdIndexHelper.Cache = InCircleCache; + } +}; +/***/ + +UCLASS(Blueprintable) +class UCirclePlayerIdIndex : public UObject +{ + GENERATED_BODY() + +public: + TArray Filter(const int32& PlayerId) const + { + TArray OutResults; + + LocalCache->FindByMultiKeyBTreeIndex>( + OutResults, + TEXT("player_id"), + MakeTuple(PlayerId) + ); + + return OutResults; + } + + void SetCache(TSharedPtr> InCache) + { + LocalCache = InCache; + } + +private: + UFUNCTION(BlueprintCallable) + void FilterPlayerId(TArray& OutResults, const int32& PlayerId) + { + OutResults = Filter(PlayerId); + } + + TSharedPtr> LocalCache; +}; + UCLASS(BlueprintType) class CLIENT_UNREAL_API UCircleTable : public URemoteTable { GENERATED_BODY() public: + UPROPERTY(BlueprintReadOnly) + UCircleEntityIdUniqueIndex* EntityId; + + UPROPERTY(BlueprintReadOnly) + UCirclePlayerIdIndex* PlayerId; + void PostInitialize(); /** Update function for circle table*/ diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConfigTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConfigTable.g.h index 93a6903f6a4..57d5532ba38 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConfigTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConfigTable.g.h @@ -12,12 +12,52 @@ #include "DBCache/TableCache.h" #include "ConfigTable.g.generated.h" +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UConfigIdUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> IdIndexHelper; + +public: + UConfigIdUniqueIndex() + // Initialize the helper with the specific unique index name + : IdIndexHelper("id") { + } + + /** + * Finds a Config by their unique id. + * @param Key The id to search for. + * @return The found FConfigType, or a default-constructed FConfigType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ConfigIndex") + FConfigType Find(int32 Key) + { + // Simply delegate the call to the internal helper + return IdIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InConfigCache) + { + IdIndexHelper.Cache = InConfigCache; + } +}; +/***/ + UCLASS(BlueprintType) class CLIENT_UNREAL_API UConfigTable : public URemoteTable { GENERATED_BODY() public: + UPROPERTY(BlueprintReadOnly) + UConfigIdUniqueIndex* Id; + void PostInitialize(); /** Update function for config table*/ diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConsumeEntityEventTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConsumeEntityEventTable.g.h index 210bedcaca8..82b2ff1b858 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConsumeEntityEventTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/ConsumeEntityEventTable.g.h @@ -37,26 +37,9 @@ class CLIENT_UNREAL_API UConsumeEntityEventTable : public URemoteTable const FEventContext&, Context, const FConsumeEntityEventType&, NewRow); - DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams( - FOnConsumeEntityEventUpdate, - const FEventContext&, Context, - const FConsumeEntityEventType&, OldRow, - const FConsumeEntityEventType&, NewRow); - - DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( - FOnConsumeEntityEventDelete, - const FEventContext&, Context, - const FConsumeEntityEventType&, DeletedRow); - UPROPERTY(BlueprintAssignable, Category = "SpacetimeDB Events") FOnConsumeEntityEventInsert OnInsert; - UPROPERTY(BlueprintAssignable, Category = "SpacetimeDB Events") - FOnConsumeEntityEventUpdate OnUpdate; - - UPROPERTY(BlueprintAssignable, Category = "SpacetimeDB Events") - FOnConsumeEntityEventDelete OnDelete; - private: const FString TableName = TEXT("consume_entity_event"); diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/EntityTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/EntityTable.g.h index 21c60473f17..ac3dd913121 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/EntityTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/EntityTable.g.h @@ -12,12 +12,52 @@ #include "DBCache/TableCache.h" #include "EntityTable.g.generated.h" +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UEntityEntityIdUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> EntityIdIndexHelper; + +public: + UEntityEntityIdUniqueIndex() + // Initialize the helper with the specific unique index name + : EntityIdIndexHelper("entity_id") { + } + + /** + * Finds a Entity by their unique entityid. + * @param Key The entityid to search for. + * @return The found FEntityType, or a default-constructed FEntityType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|EntityIndex") + FEntityType Find(int32 Key) + { + // Simply delegate the call to the internal helper + return EntityIdIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InEntityCache) + { + EntityIdIndexHelper.Cache = InEntityCache; + } +}; +/***/ + UCLASS(BlueprintType) class CLIENT_UNREAL_API UEntityTable : public URemoteTable { GENERATED_BODY() public: + UPROPERTY(BlueprintReadOnly) + UEntityEntityIdUniqueIndex* EntityId; + void PostInitialize(); /** Update function for entity table*/ diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/FoodTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/FoodTable.g.h index 87ebfb95e9b..5f3e0013a82 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/FoodTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/FoodTable.g.h @@ -12,12 +12,52 @@ #include "DBCache/TableCache.h" #include "FoodTable.g.generated.h" +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UFoodEntityIdUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> EntityIdIndexHelper; + +public: + UFoodEntityIdUniqueIndex() + // Initialize the helper with the specific unique index name + : EntityIdIndexHelper("entity_id") { + } + + /** + * Finds a Food by their unique entityid. + * @param Key The entityid to search for. + * @return The found FFoodType, or a default-constructed FFoodType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|FoodIndex") + FFoodType Find(int32 Key) + { + // Simply delegate the call to the internal helper + return EntityIdIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InFoodCache) + { + EntityIdIndexHelper.Cache = InFoodCache; + } +}; +/***/ + UCLASS(BlueprintType) class CLIENT_UNREAL_API UFoodTable : public URemoteTable { GENERATED_BODY() public: + UPROPERTY(BlueprintReadOnly) + UFoodEntityIdUniqueIndex* EntityId; + void PostInitialize(); /** Update function for food table*/ diff --git a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/PlayerTable.g.h b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/PlayerTable.g.h index af4f729e441..fd13ef2a07a 100644 --- a/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/PlayerTable.g.h +++ b/demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/PlayerTable.g.h @@ -12,12 +12,92 @@ #include "DBCache/TableCache.h" #include "PlayerTable.g.generated.h" +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UPlayerIdentityUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> IdentityIndexHelper; + +public: + UPlayerIdentityUniqueIndex() + // Initialize the helper with the specific unique index name + : IdentityIndexHelper("identity") { + } + + /** + * Finds a Player by their unique identity. + * @param Key The identity to search for. + * @return The found FPlayerType, or a default-constructed FPlayerType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|PlayerIndex") + FPlayerType Find(FSpacetimeDBIdentity Key) + { + // Simply delegate the call to the internal helper + return IdentityIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InPlayerCache) + { + IdentityIndexHelper.Cache = InPlayerCache; + } +}; +/***/ + +UCLASS(Blueprintable) +class CLIENT_UNREAL_API UPlayerPlayerIdUniqueIndex : public UObject +{ + GENERATED_BODY() + +private: + // Declare an instance of your templated helper. + // It's private because the UObject wrapper will expose its functionality. + FUniqueIndexHelper> PlayerIdIndexHelper; + +public: + UPlayerPlayerIdUniqueIndex() + // Initialize the helper with the specific unique index name + : PlayerIdIndexHelper("player_id") { + } + + /** + * Finds a Player by their unique playerid. + * @param Key The playerid to search for. + * @return The found FPlayerType, or a default-constructed FPlayerType if not found. + */ + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|PlayerIndex") + FPlayerType Find(int32 Key) + { + // Simply delegate the call to the internal helper + return PlayerIdIndexHelper.FindUniqueIndex(Key); + } + + // A public setter to provide the cache to the helper after construction + // This is a common pattern when the cache might be created or provided by another system. + void SetCache(TSharedPtr> InPlayerCache) + { + PlayerIdIndexHelper.Cache = InPlayerCache; + } +}; +/***/ + UCLASS(BlueprintType) class CLIENT_UNREAL_API UPlayerTable : public URemoteTable { GENERATED_BODY() public: + UPROPERTY(BlueprintReadOnly) + UPlayerIdentityUniqueIndex* Identity; + + UPROPERTY(BlueprintReadOnly) + UPlayerPlayerIdUniqueIndex* PlayerId; + void PostInitialize(); /** Update function for player table*/ diff --git a/demo/Blackholio/server-cpp/spacetimedb/src/lib.cpp b/demo/Blackholio/server-cpp/spacetimedb/src/lib.cpp index d7297bbb074..208fdae1d79 100644 --- a/demo/Blackholio/server-cpp/spacetimedb/src/lib.cpp +++ b/demo/Blackholio/server-cpp/spacetimedb/src/lib.cpp @@ -294,7 +294,7 @@ SPACETIMEDB_INIT(init, ReducerContext ctx) { } SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { - auto logged_out = ctx.db[logged_out_player_identity].find(ctx.sender); + auto logged_out = ctx.db[logged_out_player_identity].find(ctx.sender()); if (logged_out.has_value()) { ctx.db[player].insert(logged_out.value()); (void)ctx.db[logged_out_player_identity].delete_by_key(logged_out->identity); @@ -313,14 +313,14 @@ SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { (void)ctx.db[logged_out_circle_entity_id].delete_by_key(circle_row.entity_id); } } else { - Player new_player{ctx.sender, 0, std::string()}; + Player new_player{ctx.sender(), 0, std::string()}; ctx.db[player].insert(new_player); } return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -349,7 +349,7 @@ SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { SPACETIMEDB_REDUCER(enter_game, ReducerContext ctx, std::string name) { LOG_INFO("Creating player with name " + name); - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -367,7 +367,7 @@ SPACETIMEDB_REDUCER(enter_game, ReducerContext ctx, std::string name) { } SPACETIMEDB_REDUCER(respawn, ReducerContext ctx) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("No such player found"); } @@ -381,7 +381,7 @@ SPACETIMEDB_REDUCER(respawn, ReducerContext ctx) { } SPACETIMEDB_REDUCER(suicide, ReducerContext ctx) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("No such player found"); } @@ -397,7 +397,7 @@ SPACETIMEDB_REDUCER(suicide, ReducerContext ctx) { } SPACETIMEDB_REDUCER(update_player_input, ReducerContext ctx, DbVector2 direction) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -605,7 +605,7 @@ SPACETIMEDB_REDUCER(consume_entity, ReducerContext ctx, ConsumeEntityTimer reque } SPACETIMEDB_REDUCER(player_split, ReducerContext ctx) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Sender has no player"); } diff --git a/docs/docs/00100-intro/00100-getting-started/00400-key-architecture.md b/docs/docs/00100-intro/00100-getting-started/00400-key-architecture.md index 9c1828e7d29..f17edf027cb 100644 --- a/docs/docs/00100-intro/00100-getting-started/00400-key-architecture.md +++ b/docs/docs/00100-intro/00100-getting-started/00400-key-architecture.md @@ -537,7 +537,7 @@ A view can be written in C++ like so: ```cpp SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - return ctx.db[player_identity].find(ctx.sender); + return ctx.db[player_identity].find(ctx.sender()); } ``` diff --git a/docs/docs/00100-intro/00300-tutorials/00100-chat-app.md b/docs/docs/00100-intro/00300-tutorials/00100-chat-app.md index c7cdd2f216c..8bf81f5b1c1 100644 --- a/docs/docs/00100-intro/00300-tutorials/00100-chat-app.md +++ b/docs/docs/00100-intro/00300-tutorials/00100-chat-app.md @@ -477,7 +477,7 @@ SPACETIMEDB_REDUCER(set_name, ReducerContext ctx, std::string name) { } // Find and update the user by identity (primary key) - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.name = validated.value(); @@ -598,7 +598,7 @@ SPACETIMEDB_REDUCER(send_message, ReducerContext ctx, std::string text) { return Err(validated.error()); } - Message msg{ctx.sender, ctx.timestamp, validated.value()}; + Message msg{ctx.sender(), ctx.timestamp, validated.value()}; ctx.db[message].insert(msg); return Ok(); } @@ -724,20 +724,20 @@ Add to `spacetimedb/src/lib.cpp`: ```cpp server SPACETIMEDB_CLIENT_CONNECTED(client_connected, ReducerContext ctx) { - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.online = true; ctx.db[user_identity].update(user); } else { - User new_user{ctx.sender, std::nullopt, true}; + User new_user{ctx.sender(), std::nullopt, true}; ctx.db[user].insert(new_user); } return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(client_disconnected, ReducerContext ctx) { - auto user_row = ctx.db[user_identity].find(ctx.sender); + auto user_row = ctx.db[user_identity].find(ctx.sender()); if (user_row.has_value()) { auto user = user_row.value(); user.online = false; diff --git a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00300-part-2.md b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00300-part-2.md index c2f52bdd50d..3df6b0b735a 100644 --- a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00300-part-2.md +++ b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00300-part-2.md @@ -470,7 +470,7 @@ pub fn debug(ctx: &ReducerContext) -> Result<(), String> { ```cpp SPACETIMEDB_REDUCER(debug, ReducerContext ctx) { - LOG_INFO("This reducer was called by " + ctx.sender.to_string()); + LOG_INFO("This reducer was called by " + ctx.sender().to_string()); return Ok(); } ``` @@ -614,7 +614,7 @@ Next let's connect our client to our database. Let's start by modifying our `deb ```cpp SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { - LOG_INFO(ctx.sender.to_string() + " just connected."); + LOG_INFO(ctx.sender().to_string() + " just connected."); return Ok(); } ``` diff --git a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00400-part-3.md b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00400-part-3.md index 00329cd3f68..8de2e8d1610 100644 --- a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00400-part-3.md +++ b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00400-part-3.md @@ -585,21 +585,21 @@ Next, modify your `connect` reducer and add a new `disconnect` reducer below it: ```cpp SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { // Check if this player was previously logged out - auto logged_out_player_opt = ctx.db[logged_out_player_identity].find(ctx.sender); + auto logged_out_player_opt = ctx.db[logged_out_player_identity].find(ctx.sender()); if (logged_out_player_opt.has_value()) { // Move player from logged_out_player to player table ctx.db[player].insert(logged_out_player_opt.value()); ctx.db[logged_out_player_identity].delete_by_key(logged_out_player_opt.value().identity); } else { // New player - create and insert into player table - ctx.db[player].insert(Player{ctx.sender, 0, ""}); + ctx.db[player].insert(Player{ctx.sender(), 0, ""}); } return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { // Find the player in the player table - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -801,7 +801,7 @@ SPACETIMEDB_REDUCER(enter_game, ReducerContext ctx, std::string name) { LOG_INFO("Creating player with name " + name); // Find the player - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -877,7 +877,7 @@ pub fn disconnect(ctx: &ReducerContext) -> Result<(), String> { ```cpp SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { // Find the player in the player table - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } diff --git a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00500-part-4.md b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00500-part-4.md index e39977ffea4..5ca13a1b85c 100644 --- a/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00500-part-4.md +++ b/docs/docs/00100-intro/00300-tutorials/00300-unity-tutorial/00500-part-4.md @@ -306,7 +306,7 @@ Next, add the following reducer to the end of your `lib.cpp` file. ```cpp SPACETIMEDB_REDUCER(update_player_input, ReducerContext ctx, DbVector2 direction) { // Find the player - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -324,7 +324,7 @@ SPACETIMEDB_REDUCER(update_player_input, ReducerContext ctx, DbVector2 direction } ``` -This is a simple reducer that takes the movement input from the client and applies them to all circles that that player controls. Note that it is not possible for a player to move another player's circles using this reducer, because the `ctx.sender` value is not set by the client. Instead `ctx.sender` is set by SpacetimeDB after it has authenticated that sender. You can rest assured that the caller has been authenticated as that player by the time this reducer is called. +This is a simple reducer that takes the movement input from the client and applies them to all circles that that player controls. Note that it is not possible for a player to move another player's circles using this reducer, because the `ctx.sender()` value is not set by the client. Instead `ctx.sender()` is set by SpacetimeDB after it has authenticated that sender. You can rest assured that the caller has been authenticated as that player by the time this reducer is called. diff --git a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00200-part-1.md b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00200-part-1.md index 3f99a1ea25f..f23f9d5659a 100644 --- a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00200-part-1.md +++ b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00200-part-1.md @@ -79,7 +79,7 @@ The `GameManager` class will be where we will put the high level initialization > **Note:** In a production Unreal project, you would typically implement this logic in a Subsystem. For simplicity, this tutorial uses a singleton actor. -1. Open the `client_unreal` project to launch the Unreal Editor. +1. Open the `blackholio` project to launch the Unreal Editor. 2. **Create a GameManager Blueprint** - In the **Content Drawer**, click **Add**, then select **Blueprint -> Blueprint Class**. - Click **Actor**. diff --git a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00300-part-2.md b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00300-part-2.md index 050dcd204d9..4ae2a3e84e8 100644 --- a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00300-part-2.md +++ b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00300-part-2.md @@ -48,19 +48,19 @@ The `blackholio` directory specified here is the same `blackholio` directory you Run the following command to initialize the SpacetimeDB server module project with C# as the language: ```bash -spacetime init --lang csharp --server-only blackholio +spacetime init --lang csharp --server-only --project-path . blackholio ``` -This command creates a new folder named `blackholio` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with C# as the programming language. +This command creates a new folder named `spacetimedb` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with C# as the programming language. Run the following command to initialize the SpacetimeDB server module project with Rust as the language: ```bash -spacetime init --lang rust --server-only blackholio +spacetime init --lang rust --server-only --project-path . blackholio ``` -This command creates a new folder named `blackholio` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with Rust as the programming language. +This command creates a new folder named `spacetimedb` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with Rust as the programming language. @@ -68,10 +68,10 @@ This command creates a new folder named `blackholio` inside of your Unreal proje Run the following command to initialize the SpacetimeDB server module project with C++ as the language: ```bash -spacetime init --lang cpp --server-only blackholio +spacetime init --lang cpp --server-only --project-path . blackholio ``` -This command creates a new folder named `blackholio` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with Rust as the programming language. +This command creates a new folder named `spacetimedb` inside of your Unreal project `blackholio` directory and sets up the SpacetimeDB server project with Rust as the programming language. @@ -468,7 +468,7 @@ pub fn debug(ctx: &ReducerContext) -> Result<(), String> { ```cpp SPACETIMEDB_REDUCER(debug, ReducerContext ctx) { - LOG_INFO("This reducer was called by " + ctx.sender.to_string()); + LOG_INFO("This reducer was called by " + ctx.sender().to_string()); return Ok(); } ``` @@ -524,7 +524,7 @@ Created new database with name: blackholio, identity: c200d2c69b4524292b91822afa Next, use the `spacetime` command to call our newly defined `Debug` reducer: ```sh -spacetime call --server local blackholio Debug +spacetime call --server local blackholio debug ``` @@ -610,7 +610,7 @@ Next let's connect our client to our database. Let's start by modifying our `deb ```cpp SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { - LOG_INFO(ctx.sender.to_string() + " just connected."); + LOG_INFO(ctx.sender().to_string() + " just connected."); return Ok(); } ``` @@ -649,7 +649,7 @@ Let's generate our types for our module. In the `blackholio/spacetimedb` directo ```sh -spacetime generate --lang unrealcpp --uproject-dir ../../blackholio --module-path ./ --unreal-module-name blackholio +spacetime generate --lang unrealcpp --uproject-dir .. --module-path ./ --unreal-module-name blackholio ``` This will generate a set of files in the `blackholio/Source/blackholio/Private/ModuleBindings` and `blackholio/Source/blackholio/Public/ModuleBindings` directories which contain the code generated types and reducer functions that are defined in your module, but usable on the client. @@ -658,6 +658,10 @@ This will generate a set of files in the `blackholio/Source/blackholio/Private/M `--uproject-dir` is straightforward as the path to the .uproject file. `--unreal-module-name` is the name of the Unreal module which in most projects is the name of the project, in this case `blackholio`. ::: +:::warning +After generating external code with `spacetime generate` it is highly recommended you restart the Unreal Editor, it can also help to run the `Generate project files` against the `.uproject` file. +::: + ``` ├── Reducers ├── Tables @@ -729,7 +733,7 @@ public: UPROPERTY(EditAnywhere, Category="BH|Connection") FString ServerUri = TEXT("127.0.0.1:3000"); UPROPERTY(EditAnywhere, Category="BH|Connection") - FString ModuleName = TEXT("blackholio"); + FString DatabaseName = TEXT("blackholio"); UPROPERTY(EditAnywhere, Category="BH|Connection") FString TokenFilePath = TEXT(".spacetime_blackholio"); @@ -805,7 +809,7 @@ void AGameManager::BeginPlay() UDbConnectionBuilder* Builder = UDbConnection::Builder() ->WithUri(ServerUri) - ->WithDatabaseName(ModuleName) + ->WithDatabaseName(DatabaseName) ->OnConnect(ConnectDelegate) ->OnDisconnect(DisconnectDelegate) ->OnConnectError(ConnectErrorDelegate); @@ -910,7 +914,7 @@ Next, open and update `BP_GameManager` to add the following **Variables**: - Check **Instance Editable** - Change **Category** to `Connection` - Change **Default Value** to `127.0.0.1:3000` -2. Add `ModuleName` +2. Add `DatabaseName` - Change **Variable Type** to **String** - Check **Instance Editable** - Change **Category** to `Connection` diff --git a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00400-part-3.md b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00400-part-3.md index 022aad81b48..0f3c370f0f0 100644 --- a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00400-part-3.md +++ b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00400-part-3.md @@ -578,21 +578,21 @@ Next, modify your `connect` reducer and add a new `disconnect` reducer below it: ```cpp SPACETIMEDB_CLIENT_CONNECTED(connect, ReducerContext ctx) { // Check if this player was previously logged out - auto logged_out_player_opt = ctx.db[logged_out_player_identity].find(ctx.sender); + auto logged_out_player_opt = ctx.db[logged_out_player_identity].find(ctx.sender()); if (logged_out_player_opt.has_value()) { // Move player from logged_out_player to player table ctx.db[player].insert(logged_out_player_opt.value()); ctx.db[logged_out_player_identity].delete_by_key(logged_out_player_opt.value().identity); } else { // New player - create and insert into player table - ctx.db[player].insert(Player{ctx.sender, 0, ""}); + ctx.db[player].insert(Player{ctx.sender(), 0, ""}); } return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { // Find the player in the player table - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -788,7 +788,7 @@ SPACETIMEDB_REDUCER(enter_game, ReducerContext ctx, std::string name) { LOG_INFO("Creating player with name " + name); // Find the player - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -864,7 +864,7 @@ pub fn disconnect(ctx: &ReducerContext) -> Result<(), String> { ```cpp SPACETIMEDB_CLIENT_DISCONNECTED(disconnect, ReducerContext ctx) { // Find the player in the player table - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -2400,7 +2400,7 @@ Update **Event BeginPlay** as follows: At this point, you may need to regenerate your bindings the following command from the `blackholio/spacetimedb` directory. ```sh -spacetime generate --lang unrealcpp --uproject-dir .. --unreal-module-name blackholio +spacetime generate --lang unrealcpp --uproject-dir .. --module-path ./ --unreal-module-name blackholio ``` diff --git a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00500-part-4.md b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00500-part-4.md index 05ae0d41a81..6a5f45264a7 100644 --- a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00500-part-4.md +++ b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/00500-part-4.md @@ -305,7 +305,7 @@ Next, add the following reducer to the end of your `lib.cpp` file. ```cpp SPACETIMEDB_REDUCER(update_player_input, ReducerContext ctx, DbVector2 direction) { // Find the player - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return Err("Player not found"); } @@ -323,7 +323,7 @@ SPACETIMEDB_REDUCER(update_player_input, ReducerContext ctx, DbVector2 direction } ``` -This is a simple reducer that takes the movement input from the client and applies them to all circles that that player controls. Note that it is not possible for a player to move another player's circles using this reducer, because the `ctx.sender` value is not set by the client. Instead `ctx.sender` is set by SpacetimeDB after it has authenticated that sender. You can rest assured that the caller has been authenticated as that player by the time this reducer is called. +This is a simple reducer that takes the movement input from the client and applies them to all circles that that player controls. Note that it is not possible for a player to move another player's circles using this reducer, because the `ctx.sender()` value is not set by the client. Instead `ctx.sender()` is set by SpacetimeDB after it has authenticated that sender. You can rest assured that the caller has been authenticated as that player by the time this reducer is called. @@ -526,7 +526,7 @@ spacetime publish --server local blackholio --delete-data Regenerate your server bindings with: ```sh -spacetime generate --lang unrealcpp --uproject-dir .. --unreal-module-name blackholio +spacetime generate --lang unrealcpp --uproject-dir .. --module-path ./ --unreal-module-name blackholio ``` ### Moving on the Client diff --git a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/index.md b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/index.md index befddefd5f4..b2e91caf6ac 100644 --- a/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/index.md +++ b/docs/docs/00100-intro/00300-tutorials/00400-unreal-tutorial/index.md @@ -30,7 +30,7 @@ Please file an issue [here](https://github.com/clockworklabs/SpacetimeDB/issues) ## Blackhol.io Tutorial - Basic Multiplayer -First you'll get started with the core client/server setup. For part 2, you'll be able to choose between **Rust** or **C#** for your server module language: +First you'll get started with the core client/server setup. For part 2, you'll be able to choose between **Rust**, **C#**, or **C++** for your server module language: - [Part 1 - Setup](./00200-part-1.md) - [Part 2 - Connecting to SpacetimeDB](./00300-part-2.md) diff --git a/docs/docs/00200-core-concepts/00100-databases/00500-cheat-sheet.md b/docs/docs/00200-core-concepts/00100-databases/00500-cheat-sheet.md index ec05ce1fe13..5768274a9ab 100644 --- a/docs/docs/00200-core-concepts/00100-databases/00500-cheat-sheet.md +++ b/docs/docs/00200-core-concepts/00100-databases/00500-cheat-sheet.md @@ -679,7 +679,7 @@ using namespace SpacetimeDB; // Return single row using unique indexed field SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - return ctx.db[player_identity].find(ctx.sender); + return ctx.db[player_identity].find(ctx.sender()); } // Return multiple rows using indexed field @@ -733,7 +733,7 @@ ctx.rng() // Random number generator ```cpp ctx.db // Database access (Table accessor) -ctx.sender // Identity of caller (Identity type) +ctx.sender() // Identity of caller (Identity type) ctx.connection_id // std::optional ctx.timestamp // Timestamp of current transaction (Timestamp type) ctx.identity() // Module's own identity (Identity type) diff --git a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00400-reducer-context.md b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00400-reducer-context.md index 7bd4ed6f429..0dbd82df838 100644 --- a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00400-reducer-context.md +++ b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00400-reducer-context.md @@ -238,7 +238,7 @@ FIELD_PrimaryKey(player, identity); SPACETIMEDB_REDUCER(update_score, ReducerContext ctx, uint32_t new_score) { // Get the caller's identity - auto caller = ctx.sender; + auto caller = ctx.sender(); // Find and update their player record if (auto player = ctx.db[player_identity].find(caller)) { @@ -385,7 +385,7 @@ SPACETIMEDB_SCHEDULE(scheduled_task, 1, send_reminder); SPACETIMEDB_REDUCER(send_reminder, ReducerContext ctx, ScheduledTask task) { // Only allow the scheduler (module identity) to call this - if (ctx.sender != ctx.identity()) { + if (ctx.sender() != ctx.identity()) { return Err("This reducer can only be called by the scheduler"); } diff --git a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00500-lifecycle.md b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00500-lifecycle.md index d51a704b415..5a9b58e9adf 100644 --- a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00500-lifecycle.md +++ b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00500-lifecycle.md @@ -114,7 +114,7 @@ The `init` reducer: - Failure prevents publishing or clearing :::tip Module Owner -In the `init` reducer, `ctx.sender` is the **module owner** — the identity of the user who published the database. This is the only place where the owner identity is automatically provided, so if you need to reference it later (e.g. for authorization), store it in a table during `init`: +In the `init` reducer, `ctx.sender()` is the **module owner** — the identity of the user who published the database. This is the only place where the owner identity is automatically provided, so if you need to reference it later (e.g. for authorization), store it in a table during `init`: @@ -169,7 +169,7 @@ pub fn init(ctx: &ReducerContext) -> Result<(), String> { -You can then check `ctx.sender` against the stored owner identity in other reducers to restrict admin-only operations. +You can then check `ctx.sender()` against the stored owner identity in other reducers to restrict admin-only operations. ::: ## Client Connected @@ -256,7 +256,7 @@ SPACETIMEDB_TABLE(Session, sessions, Private); FIELD_PrimaryKey(sessions, connection_id); SPACETIMEDB_CLIENT_CONNECTED(on_connect, ReducerContext ctx) { - LOG_INFO("Client connected: " + ctx.sender.to_string()); + LOG_INFO("Client connected: " + ctx.sender().to_string()); // ctx.connection_id is guaranteed to be present auto conn_id = ctx.connection_id.value(); @@ -264,7 +264,7 @@ SPACETIMEDB_CLIENT_CONNECTED(on_connect, ReducerContext ctx) { // Initialize client session ctx.db[sessions].insert(Session{ conn_id, - ctx.sender, + ctx.sender(), ctx.timestamp }); @@ -352,7 +352,7 @@ SPACETIMEDB_TABLE(Session, sessions, Private); FIELD_PrimaryKey(sessions, connection_id); SPACETIMEDB_CLIENT_DISCONNECTED(on_disconnect, ReducerContext ctx) { - LOG_INFO("Client disconnected: " + ctx.sender.to_string()); + LOG_INFO("Client disconnected: " + ctx.sender().to_string()); // ctx.connection_id is guaranteed to be present auto conn_id = ctx.connection_id.value(); diff --git a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00600-error-handling.md b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00600-error-handling.md index 02b31568a8c..4fb03251e06 100644 --- a/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00600-error-handling.md +++ b/docs/docs/00200-core-concepts/00200-functions/00300-reducers/00600-error-handling.md @@ -119,7 +119,7 @@ pub fn transfer_credits( FIELD_PrimaryKey(users, identity); SPACETIMEDB_REDUCER(transfer_credits, ReducerContext ctx, Identity to_user, uint32_t amount) { - auto from_user = ctx.db[users_identity].find(ctx.sender); + auto from_user = ctx.db[users_identity].find(ctx.sender()); if (!from_user) { return Err("User not found"); } diff --git a/docs/docs/00200-core-concepts/00200-functions/00500-views.md b/docs/docs/00200-core-concepts/00200-functions/00500-views.md index f957f8f217e..7c05b30d8c4 100644 --- a/docs/docs/00200-core-concepts/00200-functions/00500-views.md +++ b/docs/docs/00200-core-concepts/00200-functions/00500-views.md @@ -266,7 +266,7 @@ SPACETIMEDB_STRUCT(PlayerAndLevel, id, name, level) // At-most-one row: return std::optional SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - return ctx.db[player_identity].find(ctx.sender); + return ctx.db[player_identity].find(ctx.sender()); } // Multiple rows: return std::vector @@ -366,7 +366,7 @@ fn my_player(ctx: &ViewContext) -> Option { ```cpp // Per-user: each client sees their own player SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - return ctx.db[player_identity].find(ctx.sender); + return ctx.db[player_identity].find(ctx.sender()); } ``` @@ -694,7 +694,7 @@ SPACETIMEDB_VIEW(std::vector, entities_in_my_chunk, Public, ViewContext std::vector results; // Find the player's current location - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt) { return results; // Player not found } diff --git a/docs/docs/00200-core-concepts/00300-tables.md b/docs/docs/00200-core-concepts/00300-tables.md index 1778ab3d1aa..79ca0a40cb5 100644 --- a/docs/docs/00200-core-concepts/00300-tables.md +++ b/docs/docs/00200-core-concepts/00300-tables.md @@ -499,10 +499,10 @@ FIELD_UniqueAutoInc(player, player_id) FIELD_UniqueAutoInc(logged_out_player, player_id) // Move a row between tables -auto maybe_logged_out = ctx.db[logged_out_player_identity].find(ctx.sender); +auto maybe_logged_out = ctx.db[logged_out_player_identity].find(ctx.sender()); if (maybe_logged_out) { ctx.db[player].insert(*maybe_logged_out); - ctx.db[logged_out_player_identity].delete_by_key(ctx.sender); + ctx.db[logged_out_player_identity].delete_by_key(ctx.sender()); } ``` diff --git a/docs/docs/00200-core-concepts/00300-tables/00400-access-permissions.md b/docs/docs/00200-core-concepts/00300-tables/00400-access-permissions.md index 4a8f76be9c6..93cb8db3675 100644 --- a/docs/docs/00200-core-concepts/00300-tables/00400-access-permissions.md +++ b/docs/docs/00200-core-concepts/00300-tables/00400-access-permissions.md @@ -543,8 +543,8 @@ FIELD_Index(message, recipient) // Public view that only returns messages the caller can see SPACETIMEDB_VIEW(std::vector, my_messages, Public, ViewContext ctx) { // Look up messages by index where caller is sender or recipient - auto sent = ctx.db[message_sender].filter(ctx.sender).collect(); - auto received = ctx.db[message_recipient].filter(ctx.sender).collect(); + auto sent = ctx.db[message_sender].filter(ctx.sender()).collect(); + auto received = ctx.db[message_recipient].filter(ctx.sender()).collect(); // Combine both vectors sent.insert(sent.end(), received.begin(), received.end()); @@ -734,7 +734,7 @@ SPACETIMEDB_STRUCT(PublicUserProfile, id, username, created_at) // Public view that returns the caller's profile without sensitive data SPACETIMEDB_VIEW(std::optional, my_profile, Public, ViewContext ctx) { // Look up the caller's account by their identity (unique index) - auto user_opt = ctx.db[user_account_identity].find(ctx.sender); + auto user_opt = ctx.db[user_account_identity].find(ctx.sender()); if (!user_opt.has_value()) { return std::nullopt; } @@ -937,7 +937,7 @@ SPACETIMEDB_STRUCT(Colleague, id, name, department) // View that returns colleagues in the caller's department, without salary info SPACETIMEDB_VIEW(std::vector, my_colleagues, Public, ViewContext ctx) { // Find the caller's employee record by identity (unique index) - auto me_opt = ctx.db[employee_identity].find(ctx.sender); + auto me_opt = ctx.db[employee_identity].find(ctx.sender()); if (!me_opt.has_value()) { return std::vector(); } diff --git a/docs/docs/00200-core-concepts/00600-clients/00800-unreal-reference.md b/docs/docs/00200-core-concepts/00600-clients/00800-unreal-reference.md index 6f707793efe..906d62f3b0a 100644 --- a/docs/docs/00200-core-concepts/00600-clients/00800-unreal-reference.md +++ b/docs/docs/00200-core-concepts/00600-clients/00800-unreal-reference.md @@ -19,7 +19,7 @@ Before diving into the reference, you may want to review: | [DbConnection type](#type-dbconnection) | A connection to a remote database. | | [Context interfaces](#context-interfaces) | Context objects for interacting with the remote database in callbacks. | | [Access the client cache](#access-the-client-cache) | Access to your local view of the database. | -| [Observe and invoke reducers](#observe-and-invoke-reducers) | Send requests to the database to run reducers, and register callbacks to run when notified of reducers. | +| [Observe and invoke reducers](#observe-and-invoke-reducers) | Send requests to the database to run reducers, and register callbacks for reducer results on the calling connection. | | [Subscriptions](#subscriptions) | Subscribe to queries and manage subscription lifecycle. | | [Identify a client](#identify-a-client) | Types for identifying users and client connections. | @@ -182,7 +182,7 @@ class UDbConnectionBuilder }; ``` -Finalize configuration and open the connection. This creates a WebSocket connection to `ws:///v1/database//subscribe?compression=` and begins processing messages. +Finalize configuration and open the connection. This creates a WebSocket connection to `ws:///v1/database//subscribe?compression=` and begins processing messages using the Unreal SDK's binary v2 WebSocket subprotocol. ### Advance the connection and process messages @@ -198,13 +198,10 @@ class UDbConnection UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteReducers* Reducers; - - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - USetReducerFlags* SetReducerFlags; }; ``` -The `Db` property provides access to the client cache, the `Reducers` property allows invoking reducers, and the `SetReducerFlags` property configures reducer behavior. +The `Db` property provides access to the client cache, and the `Reducers` property allows invoking reducers and handling the results of reducers called by this connection. ## Context interfaces @@ -450,12 +447,12 @@ int32 CountPlayersAtLevel(URemoteTables* Tables, uint32 Level) ## Observe and invoke reducers -All context types provide access to reducers through the `.Reducers` property, which contains generated methods for invoking reducers defined by the module and registering callbacks. +All context types provide access to reducers through the `.Reducers` property, which contains generated methods for invoking reducers defined by the module and generated delegates for reducer results. Each reducer defined by the module has methods on the `.Reducers`: - An invoke method, whose name matches the reducer's name (e.g., `SendMessage`, `SetName`). This requests that the module run the reducer. -- A callback registration delegate, whose name is prefixed with `On` (e.g., `OnSendMessage`, `OnSetName`). This registers a callback to run whenever we are notified that the reducer ran. +- A generated delegate, whose name is prefixed with `On` (e.g., `OnSendMessage`, `OnSetName`). This runs when the result for a reducer call made by this connection is received and correlated by `request_id`. ### Invoke reducers @@ -470,7 +467,7 @@ class URemoteReducers }; ``` -### Observe reducer events +### Observe reducer results ```cpp class URemoteReducers @@ -493,24 +490,7 @@ class URemoteReducers }; ``` -### Reducer flags - -```cpp -class USetReducerFlags -{ - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void SendMessage(ECallReducerFlags Flag); - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void SetName(ECallReducerFlags Flag); -}; -``` - -Configure how much data to receive when a reducer runs: - -- `ECallReducerFlags::FullUpdate` - Receive all table updates (default) -- `ECallReducerFlags::NoUpdate` - Don't receive table updates -- `ECallReducerFlags::LightUpdate` - Receive minimal table updates +The generated `On` delegates are the Unreal equivalent of a per-call callback. They are not global reducer broadcasts for other clients' reducer calls. ## Subscriptions @@ -717,9 +697,8 @@ void AMyActor::BeginPlay() Conn->Db->User->OnUpdate.AddDynamic(this, &AMyActor::OnUserUpdate); Conn->Db->User->OnDelete.AddDynamic(this, &AMyActor::OnUserDelete); - // Register reducer callbacks + // Register reducer result callbacks for calls made by this connection Conn->Reducers->OnSendMessage.AddDynamic(this, &AMyActor::OnSendMessage); - Conn->SetReducerFlags->SendMessage(ECallReducerFlags::FullUpdate); } void AMyActor::OnConnected(UDbConnection* Connection, FSpacetimeDBIdentity Identity, const FString& Token) diff --git a/docs/docs/00300-resources/00100-how-to/00300-logging.md b/docs/docs/00300-resources/00100-how-to/00300-logging.md index 6d58e58418c..0e43daee80a 100644 --- a/docs/docs/00300-resources/00100-how-to/00300-logging.md +++ b/docs/docs/00300-resources/00100-how-to/00300-logging.md @@ -138,7 +138,7 @@ SPACETIMEDB_REDUCER(process_data, ReducerContext ctx, uint32_t value) { return Err("Value cannot be zero"); } - LOG_DEBUG("Debug information: ctx.sender = " + ctx.sender.to_string()); + LOG_DEBUG("Debug information: ctx.sender = " + ctx.sender().to_string()); return Ok(); } @@ -276,7 +276,7 @@ Include relevant context in your log messages: using namespace SpacetimeDB; SPACETIMEDB_REDUCER(transfer_credits, ReducerContext ctx, uint64_t to_user, uint32_t amount) { - LOG_INFO("Credit transfer: from=" + ctx.sender.to_string() + + LOG_INFO("Credit transfer: from=" + ctx.sender().to_string() + ", to=" + std::to_string(to_user) + ", amount=" + std::to_string(amount)); diff --git a/docs/docs/00300-resources/00100-how-to/00600-migrating-to-2.0.md b/docs/docs/00300-resources/00100-how-to/00600-migrating-to-2.0.md index e0e48d00891..d3de7a145c3 100644 --- a/docs/docs/00300-resources/00100-how-to/00600-migrating-to-2.0.md +++ b/docs/docs/00300-resources/00100-how-to/00600-migrating-to-2.0.md @@ -57,6 +57,20 @@ conn.reducers.on_deal_damage(|ctx, target, amount| { }); ``` + + + +```cpp +// 1.0-style global reducer callback semantics (no longer true in 2.0) +UFUNCTION() +void OnDealDamage(const FReducerEventContext& Context, const FSpacetimeDBIdentity& Target, int32 Amount) +{ + UE_LOG(LogTemp, Log, TEXT("Someone called DealDamage with args: (%s, %d)"), *Target.ToString(), Amount); +} + +Conn->Reducers->OnDealDamage.AddDynamic(this, &AMyActor::OnDealDamage); +``` + @@ -127,6 +141,34 @@ The fire-and-forget form still works: ctx.reducers.deal_damage(target, amount).unwrap(); ``` + + + +```cpp +// 2.0 -- per-call callback on the calling connection +UFUNCTION() +void OnDealDamage(const FReducerEventContext& Context, const FSpacetimeDBIdentity& Target, int32 Amount) +{ + if (Context.Event.Status.IsCommitted()) + { + UE_LOG(LogTemp, Log, TEXT("Reducer succeeded")); + } + else if (Context.Event.Status.IsFailed()) + { + UE_LOG(LogTemp, Error, TEXT("Reducer failed: %s"), *Context.Event.Status.GetAsFailed()); + } + else if (Context.Event.Status.IsOutOfEnergy()) + { + UE_LOG(LogTemp, Error, TEXT("Reducer failed: out of energy")); + } +} + +Conn->Reducers->OnDealDamage.AddDynamic(this, &AMyActor::OnDealDamage); +Conn->Reducers->DealDamage(Target, Amount); +``` + +In Unreal, there is no `_then()` method. The generated `On` delegate is correlated by `request_id` and only fires on the connection that called the reducer. + @@ -227,6 +269,39 @@ fn deal_damage(ctx: &ReducerContext, target: Identity, amount: u32) { } ``` + + + +**Server (module) -- before:** +```cpp +// 1.0-style reducer arguments were effectively observable through reducer callbacks +SPACETIMEDB_REDUCER(deal_damage, ReducerContext ctx, Identity target, uint32_t amount) { + // update game state... + return Ok(); +} +``` + +**Server (module) -- after:** +```cpp +// 2.0 server -- explicitly publish events via an event table +#include +using namespace SpacetimeDB; + +struct DamageEvent { + Identity target; + uint32_t amount; +}; +SPACETIMEDB_STRUCT(DamageEvent, target, amount); +SPACETIMEDB_TABLE(DamageEvent, damage_event, Public); + +SPACETIMEDB_REDUCER(deal_damage, ReducerContext ctx, Identity target, uint32_t amount) { + // update game state... + + ctx.db[damage_event].insert(DamageEvent{target, amount}); + return Ok(); +} +``` + @@ -293,6 +368,40 @@ conn.db.damage_event().on_insert(|ctx, event| { }); ``` + + + +**Client -- before:** +```cpp +// 1.0 -- NO LONGER VALID in 2.0 (global reducer callback) +UFUNCTION() +void OnDealDamage(const FReducerEventContext& Context, const FSpacetimeDBIdentity& Target, int32 Amount) +{ + PlayDamageAnimation(Target, Amount); +} + +Conn->Reducers->OnDealDamage.AddDynamic(this, &AMyActor::OnDealDamage); +``` + +**Client -- after:** +```cpp +// 2.0 client -- event table callback +// Note that although this callback fires, the `DamageEvent` +// table will never have any rows present in the client cache +UFUNCTION() +void OnDamageEvent(const FEventContext& Context, const FDamageEventType& DamageEvent) +{ + PlayDamageAnimation(DamageEvent.Target, DamageEvent.Amount); +} + +Conn->Db->DamageEvent->OnInsert.AddDynamic(this, &AMyActor::OnDamageEvent); + +Conn->SubscriptionBuilder() + ->OnApplied(OnAppliedDelegate) + ->OnError(OnErrorDelegate) + ->Subscribe({ TEXT("SELECT * FROM damage_event") }); +``` + @@ -394,6 +503,31 @@ conn.db.my_table().on_insert(|ctx, row| { }); ``` + + + +In 1.0, table callbacks could receive a reducer event with full reducer information when a reducer caused a table change. In 2.0: + +- **The caller** sees `Context.Event.IsReducer()` with `FReducerEvent { Timestamp, Status, Reducer }`. +- **Other clients** see `Context.Event.IsTransaction()` with no reducer details. + +```cpp +// 2.0 -- checking who caused a table change +UFUNCTION() +void OnPersonInsert(const FEventContext& Context, const FPersonType& Row) +{ + if (Context.Event.IsReducer()) + { + const auto ReducerEvent = Context.Event.GetAsReducer(); + UE_LOG(LogTemp, Log, TEXT("Our reducer: %s"), *ReducerEvent.ReducerName); + } + else if (Context.Event.IsTransaction()) + { + // Another client's action caused this insert. + } +} +``` + @@ -447,6 +581,19 @@ ctx.subscription_builder() .subscribe(); ``` + + + +```cpp +// 2.0 -- same as 1.0 today +Conn->SubscriptionBuilder() + ->OnApplied(OnAppliedDelegate) + ->OnError(OnErrorDelegate) + ->Subscribe({ TEXT("SELECT * FROM person") }); +``` + +The Unreal SDK does not expose typed query builders yet. For now, use SQL strings. Typed query builder support is planned. + @@ -485,6 +632,17 @@ ctx.subscription_builder() .subscribe(); ``` + + + +```cpp +// Event tables are excluded from SubscribeToAllTables(), so subscribe explicitly: +Conn->SubscriptionBuilder() + ->OnApplied(OnAppliedDelegate) + ->OnError(OnErrorDelegate) + ->Subscribe({ TEXT("SELECT * FROM damage_event") }); +``` + @@ -602,6 +760,31 @@ struct MyTable { } ``` + + + +The C++ module API does not have a direct `name -> accessor` rename like C# and Rust. + +In C++, the second argument to `SPACETIMEDB_TABLE(...)` is already the table accessor you use in module code, and the second argument to `FIELD_NamedMultiColumnIndex(...)` is already the index accessor. + +So for this migration step, keep using the accessor names you want in code: + +```cpp +struct MyTable { + uint32_t id; + uint32_t x; + uint32_t y; +}; +SPACETIMEDB_STRUCT(MyTable, id, x, y); + +// 2.0 +SPACETIMEDB_TABLE(MyTable, my_table, Public); +FIELD_PrimaryKeyAutoInc(my_table, id); +FIELD_NamedMultiColumnIndex(my_table, position, x, y); +``` + +If you also need to preserve or override the canonical SQL names that appear in migrations or SQL, use the explicit-name forms described in Option 2 below. + @@ -641,6 +824,15 @@ use spacetimedb::CaseConversionPolicy; const CASE_CONVERSION_POLICY: CaseConversionPolicy = CaseConversionPolicy::None; ``` + + + +```cpp +SPACETIMEDB_SETTING_CASE_CONVERSION(SpacetimeDB::CaseConversionPolicy::None) +``` + +Use `SPACETIMEDB_SETTING_CASE_CONVERSION(...)` to preserve 1.0-style canonical names when migrating a C++ module. + @@ -707,6 +899,23 @@ struct MyTable { } ``` + + + +If you need to preserve an existing canonical SQL name during migration, pass it directly to `SPACETIMEDB_TABLE(...)`. Use the `_NAMED` field/index macros only for index canonical names. + +```cpp +struct MyTable { + uint32_t id; + uint32_t x; + uint32_t y; +}; +SPACETIMEDB_STRUCT(MyTable, id, x, y); +SPACETIMEDB_TABLE(MyTable, my_table, Public, "MyTable"); +FIELD_PrimaryKeyAutoInc(my_table, id); +FIELD_MultiColumnIndex_NAMED(my_table, position, "Position", x, y); +``` + @@ -777,6 +986,26 @@ let conn = DbConnection::builder() .expect("Failed to connect"); ``` + + + +When constructing a `UDbConnection` to a remote database, use `WithDatabaseName` in 2.0. The Unreal 2.0 builder does not expose `WithModuleName`. + +```cpp +// 1.0 terminology in other SDKs / older docs +// UDbConnection::Builder() +// ->WithUri(TEXT("https://maincloud.spacetimedb.com")) +// ->WithModuleName(TEXT("my-database")) +// ->Build(); + +// 2.0 +UDbConnection* Conn = UDbConnection::Builder() + ->WithUri(TEXT("https://maincloud.spacetimedb.com")) + ->WithDatabaseName(TEXT("my-database")) + // other options... + ->Build(); +``` + @@ -813,6 +1042,26 @@ fn my_reducer(ctx: &ReducerContext) { } ``` + + +In C++ modules, the sender is now accessed with `ctx.sender()` rather than a `ctx.sender` field. + +```cpp +// 1.0 -- NO LONGER CORRECT +SPACETIMEDB_REDUCER(my_reducer, ReducerContext ctx) { + auto sender_identity = ctx.sender; + // Do stuff with `sender_identity`... + return Ok(); +} + +// 2.0 +SPACETIMEDB_REDUCER(my_reducer, ReducerContext ctx) { + auto sender_identity = ctx.sender(); + // Do stuff with `sender_identity`... + return Ok(); +} +``` + ## Only Primary Keys Have Update Methods @@ -1014,6 +1263,65 @@ fn change_user_identity(ctx: &ReducerContext, name: String, identity: Identity) } ``` + + + +In 2.0 modules, updates should go through the primary key index. If you were previously treating another unique index like an update handle, migrate to primary-key updates or an explicit delete-plus-insert. + +### Updates which preserve the primary key - update with the primary key index + +```cpp +struct User { + Identity identity; + std::string name; + uint32_t apples_owned; +}; +SPACETIMEDB_STRUCT(User, identity, name, apples_owned); +SPACETIMEDB_TABLE(User, user, Public); +FIELD_PrimaryKey(user, identity); +FIELD_Unique(user, name); + +// 2.0 +SPACETIMEDB_REDUCER(add_apple, ReducerContext ctx, std::string name) { + auto user_row = ctx.db[user_name].find(name); + if (!user_row) { + return Err("User not found"); + } + + user_row->apples_owned += 1; + ctx.db[user_identity].update(*user_row); + return Ok(); +} +``` + +### Updates which change the primary key - explicitly delete and insert + +```cpp +struct User { + Identity identity; + std::string name; + uint32_t apples_owned; +}; +SPACETIMEDB_STRUCT(User, identity, name, apples_owned); +SPACETIMEDB_TABLE(User, user, Public); +FIELD_PrimaryKey(user, identity); +FIELD_Unique(user, name); + +// 2.0 +SPACETIMEDB_REDUCER(change_user_identity, ReducerContext ctx, std::string name, Identity identity) { + auto user_row = ctx.db[user_name].find(name); + if (!user_row) { + return Err("User not found"); + } + + User updated = *user_row; + ctx.db[user_identity].delete_by_key(updated.identity); + updated.identity = identity; + ctx.db[user].insert(updated); + return Ok(); +} +``` + @@ -1119,6 +1427,35 @@ fn run_my_timer(ctx: &ReducerContext, timer: MyTimer) { } ``` + + + +```cpp +struct MyTimer { + uint64_t scheduled_id; + ScheduleAt scheduled_at; +}; +SPACETIMEDB_STRUCT(MyTimer, scheduled_id, scheduled_at); +SPACETIMEDB_TABLE(MyTimer, my_timer, Private); +FIELD_PrimaryKeyAutoInc(my_timer, scheduled_id); +SPACETIMEDB_SCHEDULE(my_timer, 1, run_my_timer); + +// 1.0 - SUPERFLUOUS IN 2.0 +SPACETIMEDB_REDUCER(run_my_timer, ReducerContext ctx, MyTimer timer) { + if (ctx.sender() != ctx.identity()) { + return Err("`run_my_timer` should only be invoked by the database!"); + } + // Do stuff... + return Ok(); +} + +// 2.0 +SPACETIMEDB_REDUCER(run_my_timer, ReducerContext ctx, MyTimer timer) { + // Do stuff... + return Ok(); +} +``` + @@ -1194,6 +1531,29 @@ fn run_my_timer(ctx: &ReducerContext, timer: MyTimer) { } ``` + + + +```cpp +struct MyTimer { + uint64_t scheduled_id; + ScheduleAt scheduled_at; +}; +SPACETIMEDB_STRUCT(MyTimer, scheduled_id, scheduled_at); +SPACETIMEDB_TABLE(MyTimer, my_timer, Private); +FIELD_PrimaryKeyAutoInc(my_timer, scheduled_id); +SPACETIMEDB_SCHEDULE(my_timer, 1, run_my_timer_private); + +SPACETIMEDB_REDUCER(run_my_timer_private, ReducerContext ctx, MyTimer timer) { + // Do stuff... + return Ok(); +} + +SPACETIMEDB_REDUCER(run_my_timer, ReducerContext ctx, MyTimer timer) { + return run_my_timer_private(ctx, timer); +} +``` + @@ -1241,6 +1601,14 @@ DbConnection::builder() // ... ``` + + + +```cpp +// 1.0 equivalent removed in 2.0 +// The Unreal 2.0 builder does not expose WithLightMode(...) +``` + @@ -1282,6 +1650,20 @@ DbConnection::builder() .build() ``` + + + +```cpp +// 2.0 +UDbConnection* Conn = UDbConnection::Builder() + ->WithUri(Uri) + ->WithDatabaseName(DatabaseName) + // no WithLightMode needed + ->Build(); +``` + +This migration item does not apply directly to Unreal. The 2.0 Unreal builder has no public `WithLightMode(...)` API. + @@ -1318,6 +1700,11 @@ ctx.reducers.my_reducer(args).unwrap(); In 2.0, the success notification is lightweight (just `request_id` and `timestamp`, no reducer args or full event data), so there is no need to suppress it. Remove any `set_reducer_flags` calls and `CallReducerFlags` imports. + + + +This migration item does not apply to Unreal. The 2.0 Unreal SDK has no public `CallReducerFlags` or `setReducerFlags` equivalent. + @@ -1373,6 +1760,11 @@ DbConnection::builder() .expect("Failed to connect"); ``` + + + +The Unreal SDK gets confirmed reads by default in 2.0. There is currently no Unreal builder method for opting out. + @@ -1388,6 +1780,7 @@ spacetime sql "SELECT * FROM my_table" - [ ] Remove all `ctx.reducers.on_()` calls - Replace with `_then()` callbacks for your own reducer calls + - Unreal: replace with generated `On` delegates on the calling connection - Replace with event tables + `on_insert` for cross-client notifications - [ ] Update `Event::UnknownTransaction` matches to `Event::Transaction` - [ ] For each reducer whose args you were observing from other clients: @@ -1400,7 +1793,7 @@ spacetime sql "SELECT * FROM my_table" - [ ] Set your module's case conversion policy to `None` - [ ] Change `with_module_name` to `with_database_name` - [ ] Change `ctx.sender` to `ctx.sender()` - - Only necessary in Rust modules. + - Only necessary in Rust and C++ modules. - [ ] Remove `update` calls on non-primary key unique indexes - When leaving the primary key value unchanged, update using the primary key index - When altering the primary key value, delete and insert @@ -1408,6 +1801,8 @@ spacetime sql "SELECT * FROM my_table" - [ ] Define wrappers around scheduled functions which are called by clients - [ ] Use `spacetime generate --include-private` if you rely on bindings for private tables or functions - [ ] Remove `with_light_mode()` from `DbConnectionBuilder` + - Unreal: no action if you are already on the 2.0 Unreal SDK; there is no public `WithLightMode(...)` - [ ] Remove `set_reducer_flags()` calls and `CallReducerFlags` imports + - Unreal: no action if you are already on the 2.0 Unreal SDK; there is no public reducer-flags API - [ ] Remove `unstable::CallReducerFlags` from imports - [ ] Note that confirmed reads are now enabled by default (no action needed unless you want to opt out with `.withConfirmedReads(false)`) diff --git a/docs/docs/00300-resources/00200-reference/00100-cli-reference/00100-cli-reference.md b/docs/docs/00300-resources/00200-reference/00100-cli-reference/00100-cli-reference.md index 903703e5473..70b33a489e8 100644 --- a/docs/docs/00300-resources/00200-reference/00100-cli-reference/00100-cli-reference.md +++ b/docs/docs/00300-resources/00200-reference/00100-cli-reference/00100-cli-reference.md @@ -321,6 +321,7 @@ Run `spacetime help generate` for more detailed information. Default value: `SpacetimeDB.Types` * `--unreal-module-name ` — The module name that should be used for DLL export macros (required for lang unrealcpp) +* `--module-prefix ` — The module prefix to use for generated types (only used with --lang unrealcpp) * `-l`, `--lang ` — The language to generate Possible values: `csharp`, `typescript`, `rust`, `unrealcpp` diff --git a/docs/src/components/CppModuleVersionNotice.tsx b/docs/src/components/CppModuleVersionNotice.tsx index c656e50b43b..a314ac67a2c 100644 --- a/docs/src/components/CppModuleVersionNotice.tsx +++ b/docs/src/components/CppModuleVersionNotice.tsx @@ -1,14 +1,7 @@ import React from "react"; -import Admonition from "@theme/Admonition"; export function CppModuleVersionNotice(): JSX.Element { return ( - -

- C++ support is currently in beta and subject to change. SpacetimeDB C++ 2.0 is - coming soon, but C++ server modules are currently pinned to v1.12.0. If you are - following the C++ tab in this guide, use the v1.12.0 release track for now. -

-
+ <> ); } diff --git a/docs/static/images/unreal/part-2-03-blueprint-add-variables.png b/docs/static/images/unreal/part-2-03-blueprint-add-variables.png index 6e1da2e76ec..96aa19bebea 100644 Binary files a/docs/static/images/unreal/part-2-03-blueprint-add-variables.png and b/docs/static/images/unreal/part-2-03-blueprint-add-variables.png differ diff --git a/docs/static/images/unreal/part-2-05-blueprint-buildconnection-1.png b/docs/static/images/unreal/part-2-05-blueprint-buildconnection-1.png index d74f410b29c..aa640ae3fd3 100644 Binary files a/docs/static/images/unreal/part-2-05-blueprint-buildconnection-1.png and b/docs/static/images/unreal/part-2-05-blueprint-buildconnection-1.png differ diff --git a/modules/module-test-cpp/src/lib.cpp b/modules/module-test-cpp/src/lib.cpp index 5a5e36be08c..a50f8e74fc8 100644 --- a/modules/module-test-cpp/src/lib.cpp +++ b/modules/module-test-cpp/src/lib.cpp @@ -217,7 +217,7 @@ FIELD_Default(table_with_defaults, active, true) // View to find the player associated with the calling identity SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - return ctx.db[player_identity].find(ctx.sender); + return ctx.db[player_identity].find(ctx.sender()); } // ============================================================================= @@ -287,7 +287,7 @@ SPACETIMEDB_REDUCER(log_module_identity, ReducerContext ctx) { // Complex test reducer with multiple parameters SPACETIMEDB_REDUCER(test, ReducerContext ctx, TestAlias arg, TestB arg2, TestC arg3, TestF arg4) { LOG_INFO("BEGIN"); - LOG_INFO("sender: " + ctx.sender.to_string()); + LOG_INFO("sender: " + ctx.sender().to_string()); LOG_INFO("timestamp: " + ctx.timestamp.to_string()); LOG_INFO("bar: " + arg2.foo); @@ -550,8 +550,8 @@ SPACETIMEDB_REDUCER(test_btree_index_args, ReducerContext ctx) { // Test reducer for assertions SPACETIMEDB_REDUCER(assert_caller_identity_is_module_identity, ReducerContext ctx) { - LOG_INFO("Sender: " + ctx.sender.to_string() + " Identity: " + ctx.identity().to_string()); - if (ctx.sender != ctx.identity()) { + LOG_INFO("Sender: " + ctx.sender().to_string() + " Identity: " + ctx.identity().to_string()); + if (ctx.sender() != ctx.identity()) { LOG_ERROR("Assertion failed: caller identity does not match module identity"); } else { LOG_INFO("Assertion passed: caller identity matches module identity"); @@ -639,14 +639,14 @@ SPACETIMEDB_REDUCER(test_jwt_auth, ReducerContext ctx) { LOG_INFO("JWT Identity: " + identity.to_string()); // Compare with caller identity - LOG_INFO("Caller Identity: " + ctx.sender.to_string()); + LOG_INFO("Caller Identity: " + ctx.sender().to_string()); - // Verify that get_caller_identity returns the same as ctx.sender + // Verify that get_caller_identity returns the same as ctx.sender() auto caller_identity = auth.get_caller_identity(); - if (caller_identity == ctx.sender) { - LOG_INFO("get_caller_identity matches ctx.sender"); + if (caller_identity == ctx.sender()) { + LOG_INFO("get_caller_identity matches ctx.sender()"); } else { - LOG_ERROR("get_caller_identity does NOT match ctx.sender"); + LOG_ERROR("get_caller_identity does NOT match ctx.sender()"); } } else { LOG_INFO("No JWT present (anonymous or scheduled reducer)"); diff --git a/modules/sdk-test-connect-disconnect-cpp/src/lib.cpp b/modules/sdk-test-connect-disconnect-cpp/src/lib.cpp index a8e4f43cb47..4090ea8d05b 100644 --- a/modules/sdk-test-connect-disconnect-cpp/src/lib.cpp +++ b/modules/sdk-test-connect-disconnect-cpp/src/lib.cpp @@ -22,11 +22,11 @@ SPACETIMEDB_TABLE(Disconnected, disconnected, Public) // Reducers: client lifecycle callbacks SPACETIMEDB_CLIENT_CONNECTED(identity_connected, ReducerContext ctx) { - ctx.db[connected].insert(Connected{ ctx.sender }); + ctx.db[connected].insert(Connected{ ctx.sender() }); return Ok(); } SPACETIMEDB_CLIENT_DISCONNECTED(identity_disconnected, ReducerContext ctx) { - ctx.db[disconnected].insert(Disconnected{ ctx.sender }); + ctx.db[disconnected].insert(Disconnected{ ctx.sender() }); return Ok(); } diff --git a/modules/sdk-test-cpp/src/lib.cpp b/modules/sdk-test-cpp/src/lib.cpp index 18a093ec6f7..6a238395537 100644 --- a/modules/sdk-test-cpp/src/lib.cpp +++ b/modules/sdk-test-cpp/src/lib.cpp @@ -1882,25 +1882,25 @@ SPACETIMEDB_REDUCER(insert_table_holds_table, ReducerContext ctx, OneU8 a, VecU8 SPACETIMEDB_REDUCER(insert_caller_one_identity, ReducerContext ctx) { - ctx.db[one_identity].insert(OneIdentity{ctx.sender}); + ctx.db[one_identity].insert(OneIdentity{ctx.sender()}); return Ok(); } SPACETIMEDB_REDUCER(insert_caller_vec_identity, ReducerContext ctx) { - ctx.db[vec_identity].insert(VecIdentity{{ctx.sender}}); + ctx.db[vec_identity].insert(VecIdentity{{ctx.sender()}}); return Ok(); } SPACETIMEDB_REDUCER(insert_caller_unique_identity, ReducerContext ctx, int32_t data) { - ctx.db[unique_identity].insert(UniqueIdentity{ctx.sender, data}); + ctx.db[unique_identity].insert(UniqueIdentity{ctx.sender(), data}); return Ok(); } SPACETIMEDB_REDUCER(insert_caller_pk_identity, ReducerContext ctx, int32_t data) { - ctx.db[pk_identity].insert(PkIdentity{ctx.sender, data}); + ctx.db[pk_identity].insert(PkIdentity{ctx.sender(), data}); return Ok(); } diff --git a/modules/sdk-test-view-cpp/src/lib.cpp b/modules/sdk-test-view-cpp/src/lib.cpp index 4594d6cd8bf..c12b63cce32 100644 --- a/modules/sdk-test-view-cpp/src/lib.cpp +++ b/modules/sdk-test-view-cpp/src/lib.cpp @@ -95,12 +95,12 @@ SPACETIMEDB_REDUCER(delete_player, ReducerContext ctx, Identity identity) SPACETIMEDB_REDUCER(move_player, ReducerContext ctx, int32_t dx, int32_t dy) { // Find or create player - auto my_player_opt = ctx.db[player_identity].find(ctx.sender); + auto my_player_opt = ctx.db[player_identity].find(ctx.sender()); Player my_player; if (!my_player_opt.has_value()) { // Create new player - my_player = ctx.db[player].insert(Player{0, ctx.sender}); + my_player = ctx.db[player].insert(Player{0, ctx.sender()}); } else { my_player = my_player_opt.value(); } @@ -133,14 +133,14 @@ SPACETIMEDB_REDUCER(move_player, ReducerContext ctx, int32_t dx, int32_t dy) // View: my_player - Returns the player for the caller SPACETIMEDB_VIEW(std::optional, my_player, Public, ViewContext ctx) { - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); return player_opt; } // View: my_player_and_level - Returns player with level joined SPACETIMEDB_VIEW(std::optional, my_player_and_level, Public, ViewContext ctx) { // Find the caller's player - auto player_opt = ctx.db[player_identity].find(ctx.sender); + auto player_opt = ctx.db[player_identity].find(ctx.sender()); if (!player_opt.has_value()) { return std::optional(); } @@ -183,7 +183,7 @@ SPACETIMEDB_VIEW(std::vector, nearby_players, Public, ViewContex std::vector results; // Find the caller's player - auto my_player_opt = ctx.db[player_identity].find(ctx.sender); + auto my_player_opt = ctx.db[player_identity].find(ctx.sender()); if (!my_player_opt.has_value()) { return results; // No player, return empty } diff --git a/sdks/unreal/DEVELOP.md b/sdks/unreal/DEVELOP.md index ceb414e35cf..8fd9925fafe 100644 --- a/sdks/unreal/DEVELOP.md +++ b/sdks/unreal/DEVELOP.md @@ -1,14 +1,52 @@ # Notes for maintainers -The directory `sdk-unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings` is generated from [the SpacetimeDB client-api-messages](https://github.com/clockworklabs/SpacetimeDB/tree/master/crates/client-api-messages). -This is not automated. -Whenever the `client-api-messages` crate changes, you'll have to manually re-generate the definitions. -See that crate's DEVELOP.md for how to do this. - -**⚠️ IMPORTANT:** The following files/folders needs to be deleted everytime we re-generate: -- `crates/sdk-unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/ModuleBindings` -- `crates/sdk-unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/ReducerBase.g.h` -- `crates/sdk-unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/SpacetimeDBClient.g.h` +The generated Unreal bindings under: + +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings` +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/ModuleBindings` + +come from SpacetimeDB codegen (`--lang unrealcpp`) and websocket schema definitions in `crates/client-api-messages`. + +This is not automated; regenerate manually whenever websocket message schemas or Unreal codegen behavior changes. + +## WS v2 websocket schema regeneration workflow + +Run from repo root: + +```powershell +# 1) Produce WS v2 schema JSON from canonical source +cargo run -p spacetimedb-client-api-messages --example get_ws_schema_v2 > crates/client-api-messages/ws_schema_v2.json + +# 2) Regenerate Unreal bindings from WS v2 schema +cargo run -p spacetimedb-cli -- generate --lang unrealcpp ` + --module-def crates/client-api-messages/ws_schema_v2.json ` + --uproject-dir sdks/unreal/src/SpacetimeDbSdk ` + --unreal-module-name SpacetimeDbSdk ` + --yes +``` + +## Cleanup before regeneration + +Delete these generated paths before rerunning generation when schema/model changes are significant: + +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/ModuleBindings` +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/ReducerBase.g.h` +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/SpacetimeDBClient.g.h` +- `sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/ModuleBindings/SpacetimeDBClient.g.cpp` + +This avoids UnrealHeaderTool duplicate symbol/header conflicts with the `sdks/unreal/tests/TestClient` generated module bindings. + +## Fast validation loop + +For rapid iteration, run a single Unreal harness test instead of the full suite: + +```powershell +cargo test -p sdk-unreal-test-harness --test test insert_primitive -- --nocapture +``` + +Prerequisite: + +- `UE_ROOT_PATH` must point to the Unreal Engine install root (for example `C:/Program Files/Epic Games/UE_5.6`). # How to use AdditionalPluginDirectories diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ChatClientActor.cpp b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ChatClientActor.cpp index d564d0d51bc..d57ea035022 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ChatClientActor.cpp +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ChatClientActor.cpp @@ -90,11 +90,9 @@ void AChatClientActor::RegisterCallbacks() // Conn->Db->Message->OnDelete.RemoveAll(this); // UNBIND_DELEGATE_SAFE(Conn->Db->Message->OnDelete, this, AChatClientActor, OnMessageDelete); - // Opt in to receive the reducer result and any table updates - Conn->SetReducerFlags->SendMessage(ECallReducerFlags::FullUpdate); + // Bind reducer callbacks. Conn->Reducers->OnSendMessage.AddDynamic(this, &AChatClientActor::OnReducerOnSendMessage); - Conn->SetReducerFlags->SetName(ECallReducerFlags::FullUpdate); Conn->Reducers->OnSetName.AddDynamic(this, &AChatClientActor::OnReducerOnSetName); // Hook error delegate for any reducers without explicit bindings diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ModuleBindings/SpacetimeDBClient.g.cpp b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ModuleBindings/SpacetimeDBClient.g.cpp index e5884473df4..c8cd8a18549 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ModuleBindings/SpacetimeDBClient.g.cpp +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Private/ModuleBindings/SpacetimeDBClient.g.cpp @@ -4,60 +4,29 @@ #include "ModuleBindings/SpacetimeDBClient.g.h" #include "DBCache/WithBsatn.h" #include "BSATN/UEBSATNHelpers.h" -#include "ModuleBindings/Tables/UserTable.g.h" #include "ModuleBindings/Tables/MessageTable.g.h" - -static FReducer DecodeReducer(const FReducerEvent& Event) -{ - const FString& ReducerName = Event.ReducerCall.ReducerName; - - if (ReducerName == TEXT("ClientConnected")) - { - FClientConnectedArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::ClientConnected(Args); - } - - if (ReducerName == TEXT("ClientDisconnected")) - { - FClientDisconnectedArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::ClientDisconnected(Args); - } - - if (ReducerName == TEXT("SendMessage")) - { - FSendMessageArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::SendMessage(Args); - } - - if (ReducerName == TEXT("SetName")) - { - FSetNameArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::SetName(Args); - } - - return FReducer(); -} +#include "ModuleBindings/Tables/UserTable.g.h" UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - SetReducerFlags = ObjectInitializer.CreateDefaultSubobject(this, TEXT("SetReducerFlags")); - Db = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteTables")); Db->Initialize(); Reducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteReducers")); - Reducers->SetCallReducerFlags = SetReducerFlags; Reducers->Conn = this; - RegisterTable(TEXT("user"), Db->User); + Procedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteProcedures")); + Procedures->Conn = this; + RegisterTable(TEXT("message"), Db->Message); + RegisterTable(TEXT("user"), Db->User); } FContextBase::FContextBase(UDbConnection* InConn) { Db = InConn->Db; Reducers = InConn->Reducers; - SetReducerFlags = InConn->SetReducerFlags; + Procedures = InConn->Procedures; Conn = InConn; } bool FContextBase::IsActive() const @@ -85,34 +54,17 @@ void URemoteTables::Initialize() { /** Creating tables */ - User = NewObject(this); Message = NewObject(this); + User = NewObject(this); /**/ /** Initialization */ - User->PostInitialize(); Message->PostInitialize(); + User->PostInitialize(); /**/ } -void USetReducerFlags::ClientConnected(ECallReducerFlags Flag) -{ - FlagMap.Add("ClientConnected", Flag); -} -void USetReducerFlags::ClientDisconnected(ECallReducerFlags Flag) -{ - FlagMap.Add("ClientDisconnected", Flag); -} -void USetReducerFlags::SendMessage(ECallReducerFlags Flag) -{ - FlagMap.Add("SendMessage", Flag); -} -void USetReducerFlags::SetName(ECallReducerFlags Flag) -{ - FlagMap.Add("SetName", Flag); -} - -void URemoteReducers::ClientConnected() +void URemoteReducers::SendMessage(const FString& Text) { if (!Conn) { @@ -120,57 +72,45 @@ void URemoteReducers::ClientConnected() return; } - Conn->CallReducerTyped(TEXT("ClientConnected"), FClientConnectedArgs(), SetCallReducerFlags); + FSendMessageArgs ReducerArgs(Text); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("send_message"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::SendMessage(ReducerArgs)); } } -bool URemoteReducers::InvokeClientConnected(const FReducerEventContext& Context, const UClientConnectedReducer* Args) +bool URemoteReducers::InvokeSendMessage(const FReducerEventContext& Context, const USendMessageReducer* Args) { - if (!OnClientConnected.IsBound()) + if (!OnSendMessage.IsBound()) { // Handle unhandled reducer error if (InternalOnUnhandledReducerError.IsBound()) { // TODO: Check Context.Event.Status for Failed/OutOfEnergy cases // For now, just broadcast any error - InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for ClientConnected")); + InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for SendMessage")); } return false; } - OnClientConnected.Broadcast(Context); + OnSendMessage.Broadcast(Context, Args->Text); return true; } -void URemoteReducers::ClientDisconnected() -{ - if (!Conn) - { - UE_LOG(LogTemp, Error, TEXT("SpacetimeDB connection is null")); - return; - } - - Conn->CallReducerTyped(TEXT("ClientDisconnected"), FClientDisconnectedArgs(), SetCallReducerFlags); -} - -bool URemoteReducers::InvokeClientDisconnected(const FReducerEventContext& Context, const UClientDisconnectedReducer* Args) +bool URemoteReducers::InvokeSendMessageWithArgs(const FReducerEventContext& Context, const FSendMessageArgs& Args) { - if (!OnClientDisconnected.IsBound()) + if (!OnSendMessage.IsBound()) { - // Handle unhandled reducer error if (InternalOnUnhandledReducerError.IsBound()) { - // TODO: Check Context.Event.Status for Failed/OutOfEnergy cases - // For now, just broadcast any error - InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for ClientDisconnected")); + InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for SendMessage")); } return false; } - OnClientDisconnected.Broadcast(Context); + OnSendMessage.Broadcast(Context, Args.Text); return true; } -void URemoteReducers::SendMessage(const FString& Text) +void URemoteReducers::SetName(const FString& Name) { if (!Conn) { @@ -178,53 +118,41 @@ void URemoteReducers::SendMessage(const FString& Text) return; } - Conn->CallReducerTyped(TEXT("SendMessage"), FSendMessageArgs(Text), SetCallReducerFlags); + FSetNameArgs ReducerArgs(Name); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("set_name"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::SetName(ReducerArgs)); } } -bool URemoteReducers::InvokeSendMessage(const FReducerEventContext& Context, const USendMessageReducer* Args) +bool URemoteReducers::InvokeSetName(const FReducerEventContext& Context, const USetNameReducer* Args) { - if (!OnSendMessage.IsBound()) + if (!OnSetName.IsBound()) { // Handle unhandled reducer error if (InternalOnUnhandledReducerError.IsBound()) { // TODO: Check Context.Event.Status for Failed/OutOfEnergy cases // For now, just broadcast any error - InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for SendMessage")); + InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for SetName")); } return false; } - OnSendMessage.Broadcast(Context, Args->Text); + OnSetName.Broadcast(Context, Args->Name); return true; } -void URemoteReducers::SetName(const FString& Name) -{ - if (!Conn) - { - UE_LOG(LogTemp, Error, TEXT("SpacetimeDB connection is null")); - return; - } - - Conn->CallReducerTyped(TEXT("SetName"), FSetNameArgs(Name), SetCallReducerFlags); -} - -bool URemoteReducers::InvokeSetName(const FReducerEventContext& Context, const USetNameReducer* Args) +bool URemoteReducers::InvokeSetNameWithArgs(const FReducerEventContext& Context, const FSetNameArgs& Args) { if (!OnSetName.IsBound()) { - // Handle unhandled reducer error if (InternalOnUnhandledReducerError.IsBound()) { - // TODO: Check Context.Event.Status for Failed/OutOfEnergy cases - // For now, just broadcast any error InternalOnUnhandledReducerError.Broadcast(Context, TEXT("No handler registered for SetName")); } return false; } - OnSetName.Broadcast(Context, Args->Name); + OnSetName.Broadcast(Context, Args.Name); return true; } @@ -237,6 +165,12 @@ void UDbConnection::PostInitProperties() { Reducers->InternalOnUnhandledReducerError.AddDynamic(this, &UDbConnection::OnUnhandledReducerErrorHandler); } + + // Connect OnUnhandledProcedureError to Procedures.InternalOnUnhandledProcedureError + if (Procedures) + { + Procedures->InternalOnUnhandledProcedureError.AddDynamic(this, &UDbConnection::OnUnhandledProcedureErrorHandler); + } } UFUNCTION() @@ -248,11 +182,53 @@ void UDbConnection::OnUnhandledReducerErrorHandler(const FReducerEventContext& C } } +UFUNCTION() +void UDbConnection::OnUnhandledProcedureErrorHandler(const FProcedureEventContext& Context, const FString& Error) +{ + if (OnUnhandledProcedureError.IsBound()) + { + OnUnhandledProcedureError.Broadcast(Context, Error); + } +} + +void UDbConnection::RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer) +{ + Reducer.RequestId = RequestId; + PendingTypedReducers.Add(RequestId, MoveTemp(Reducer)); +} + +bool UDbConnection::TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const +{ + if (const FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + return true; + } + return false; +} + +bool UDbConnection::TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer) +{ + if (FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + PendingTypedReducers.Remove(RequestId); + return true; + } + return false; +} + void UDbConnection::ReducerEvent(const FReducerEvent& Event) { if (!Reducers) { return; } - FReducer DecodedReducer = DecodeReducer(Event); + FReducer DecodedReducer; + if (!TryTakePendingTypedReducer(Event.RequestId, DecodedReducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), Event.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } FQuickstartChatReducerEvent ReducerEvent; ReducerEvent.CallerConnectionId = Event.CallerConnectionId; @@ -264,37 +240,19 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) FReducerEventContext Context(this, ReducerEvent); - // Use hardcoded string matching for reducer dispatching - const FString& ReducerName = Event.ReducerCall.ReducerName; + // Dispatch by typed reducer metadata + const FString& ReducerName = ReducerEvent.Reducer.ReducerName; - if (ReducerName == TEXT("ClientConnected")) - { - FClientConnectedArgs Args = ReducerEvent.Reducer.GetAsClientConnected(); - UClientConnectedReducer* Reducer = NewObject(); - Reducers->InvokeClientConnected(Context, Reducer); - return; - } - if (ReducerName == TEXT("ClientDisconnected")) - { - FClientDisconnectedArgs Args = ReducerEvent.Reducer.GetAsClientDisconnected(); - UClientDisconnectedReducer* Reducer = NewObject(); - Reducers->InvokeClientDisconnected(Context, Reducer); - return; - } - if (ReducerName == TEXT("SendMessage")) + if (ReducerName == TEXT("send_message")) { FSendMessageArgs Args = ReducerEvent.Reducer.GetAsSendMessage(); - USendMessageReducer* Reducer = NewObject(); - Reducer->Text = Args.Text; - Reducers->InvokeSendMessage(Context, Reducer); + Reducers->InvokeSendMessageWithArgs(Context, Args); return; } - if (ReducerName == TEXT("SetName")) + if (ReducerName == TEXT("set_name")) { FSetNameArgs Args = ReducerEvent.Reducer.GetAsSetName(); - USetNameReducer* Reducer = NewObject(); - Reducer->Name = Args.Name; - Reducers->InvokeSetName(Context, Reducer); + Reducers->InvokeSetNameWithArgs(Context, Args); return; } @@ -320,6 +278,22 @@ void UDbConnection::ReducerEventFailed(const FReducerEvent& Event, const FString } } +void UDbConnection::ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) +{ + if (!Procedures) { return; } + + FQuickstartChatProcedureEvent ProcedureEvent; + ProcedureEvent.Status = FSpacetimeDBProcedureStatus::FromStatus(Event.Status); + ProcedureEvent.Timestamp = Event.Timestamp; + + FProcedureEventContext Context(this, ProcedureEvent); + + if (Procedures->InternalOnUnhandledProcedureError.IsBound()) + { + Procedures->InternalOnUnhandledProcedureError.Broadcast(Context, ErrorMessage); + } +} + UDbConnectionBuilder* UDbConnection::Builder() { return NewObject(); @@ -456,6 +430,7 @@ void UDbConnection::ForwardOnConnect(UDbConnectionBase* BaseConnection, FSpaceti } void UDbConnection::ForwardOnDisconnect(UDbConnectionBase* BaseConnection, const FString& Error) { + PendingTypedReducers.Empty(); if (OnDisconnectDelegate.IsBound()) { OnDisconnectDelegate.Execute(this, Error); @@ -473,7 +448,13 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime case ESpacetimeDBEventTag::Reducer: { FReducerEvent ReducerEvent = Event.GetAsReducer(); - FReducer Reducer = DecodeReducer(ReducerEvent); + FReducer Reducer; + if (!TryGetPendingTypedReducer(ReducerEvent.RequestId, Reducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), ReducerEvent.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } BaseEvent = FQuickstartChatEvent::Reducer(Reducer); break; } @@ -490,6 +471,10 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime BaseEvent = FQuickstartChatEvent::Disconnected(Event.GetAsDisconnected()); break; + case ESpacetimeDBEventTag::Transaction: + BaseEvent = FQuickstartChatEvent::Transaction(Event.GetAsTransaction()); + break; + case ESpacetimeDBEventTag::SubscribeError: BaseEvent = FQuickstartChatEvent::SubscribeError(Event.GetAsSubscribeError()); break; diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Optionals/QuickstartChatOptionalString.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Optionals/QuickstartChatOptionalString.g.h index 3d9a1d9b368..b16ee691e59 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Optionals/QuickstartChatOptionalString.g.h +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Optionals/QuickstartChatOptionalString.g.h @@ -15,7 +15,7 @@ struct QUICKSTARTCHAT_API FQuickstartChatOptionalString bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FString Value; + FString Value = {}; FQuickstartChatOptionalString() = default; diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientConnected.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientConnected.g.h deleted file mode 100644 index bc97b8e7ee7..00000000000 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientConnected.g.h +++ /dev/null @@ -1,43 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/ReducerBase.g.h" -#include "ClientConnected.g.generated.h" - -// Reducer arguments struct for ClientConnected -USTRUCT(BlueprintType) -struct QUICKSTARTCHAT_API FClientConnectedArgs -{ - GENERATED_BODY() - - FClientConnectedArgs() = default; - - - FORCEINLINE bool operator==(const FClientConnectedArgs& Other) const - { - return true; - } - FORCEINLINE bool operator!=(const FClientConnectedArgs& Other) const - { - return !(*this == Other); - } -}; - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_STRUCT_EMPTY(FClientConnectedArgs); -} - -// Reducer class for internal dispatching -UCLASS(BlueprintType) -class QUICKSTARTCHAT_API UClientConnectedReducer : public UReducerBase -{ - GENERATED_BODY() - -public: -}; - - diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientDisconnected.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientDisconnected.g.h deleted file mode 100644 index 07687d50f03..00000000000 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Reducers/ClientDisconnected.g.h +++ /dev/null @@ -1,43 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/ReducerBase.g.h" -#include "ClientDisconnected.g.generated.h" - -// Reducer arguments struct for ClientDisconnected -USTRUCT(BlueprintType) -struct QUICKSTARTCHAT_API FClientDisconnectedArgs -{ - GENERATED_BODY() - - FClientDisconnectedArgs() = default; - - - FORCEINLINE bool operator==(const FClientDisconnectedArgs& Other) const - { - return true; - } - FORCEINLINE bool operator!=(const FClientDisconnectedArgs& Other) const - { - return !(*this == Other); - } -}; - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_STRUCT_EMPTY(FClientDisconnectedArgs); -} - -// Reducer class for internal dispatching -UCLASS(BlueprintType) -class QUICKSTARTCHAT_API UClientDisconnectedReducer : public UReducerBase -{ - GENERATED_BODY() - -public: -}; - - diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/SpacetimeDBClient.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/SpacetimeDBClient.g.h index fa1d8e3eb15..f7a94d243d6 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/SpacetimeDBClient.g.h +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/SpacetimeDBClient.g.h @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 1.4.0 (commit dc59211c1453848981aeb2efce2249c9a07947b2). +// This was generated using spacetimedb cli version 2.0.1 (commit 6f8639a69dac2047da00b1fc8550c94ea2505892). #pragma once #include "CoreMinimal.h" @@ -9,12 +9,9 @@ #include "Connection/Callback.h" #include "Connection/DbConnectionBase.h" #include "Connection/DbConnectionBuilder.h" -#include "Connection/SetReducerFlags.h" #include "Connection/Subscription.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "ModuleBindings/ReducerBase.g.h" -#include "ModuleBindings/Reducers/ClientConnected.g.h" -#include "ModuleBindings/Reducers/ClientDisconnected.g.h" #include "ModuleBindings/Reducers/SendMessage.g.h" #include "ModuleBindings/Reducers/SetName.g.h" #include "Types/Builtins.h" @@ -24,6 +21,7 @@ class UDbConnection; class URemoteTables; class URemoteReducers; +class URemoteProcedures; class USubscriptionBuilder; class USubscriptionHandle; @@ -54,7 +52,7 @@ struct QUICKSTARTCHAT_API FContextBase { GENERATED_BODY() - FContextBase() = default; + FContextBase() : Db(nullptr), Reducers(nullptr), Procedures(nullptr), Conn(nullptr) {}; FContextBase(UDbConnection* InConn); UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") @@ -64,7 +62,7 @@ struct QUICKSTARTCHAT_API FContextBase URemoteReducers* Reducers; UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - USetReducerFlags* SetReducerFlags; + URemoteProcedures* Procedures; bool IsActive() const; void Disconnect(); @@ -78,11 +76,27 @@ struct QUICKSTARTCHAT_API FContextBase }; +UCLASS() +class QUICKSTARTCHAT_API UContextBaseBpLib : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +private: + UFUNCTION(BlueprintPure, Category="SpacetimeDB") + static URemoteTables* GetDb(const FContextBase& Ctx) { return Ctx.Db; } + + UFUNCTION(BlueprintPure, Category="SpacetimeDB") + static URemoteReducers* GetReducers(const FContextBase& Ctx) { return Ctx.Reducers; } + + static URemoteProcedures* GetProcedures(const FContextBase& Ctx) { return Ctx.Procedures; } + + UFUNCTION(BlueprintPure, Category="SpacetimeDB") + static bool IsActive(const FContextBase& Ctx) { return Ctx.IsActive(); } +}; + UENUM(BlueprintType, Category = "SpacetimeDB") enum class EReducerTag : uint8 { - ClientConnected, - ClientDisconnected, SendMessage, SetName }; @@ -94,9 +108,9 @@ struct QUICKSTARTCHAT_API FReducer public: UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - EReducerTag Tag; + EReducerTag Tag = static_cast(0); - TVariant Data; + TVariant Data; // Optional metadata UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") @@ -104,44 +118,12 @@ struct QUICKSTARTCHAT_API FReducer uint32 ReducerId = 0; uint32 RequestId = 0; - static FReducer ClientConnected(const FClientConnectedArgs& Value) - { - FReducer Out; - Out.Tag = EReducerTag::ClientConnected; - Out.Data.Set(Value); - Out.ReducerName = TEXT("ClientConnected"); - return Out; - } - - FORCEINLINE bool IsClientConnected() const { return Tag == EReducerTag::ClientConnected; } - FORCEINLINE FClientConnectedArgs GetAsClientConnected() const - { - ensureMsgf(IsClientConnected(), TEXT("Reducer does not hold ClientConnected!")); - return Data.Get(); - } - - static FReducer ClientDisconnected(const FClientDisconnectedArgs& Value) - { - FReducer Out; - Out.Tag = EReducerTag::ClientDisconnected; - Out.Data.Set(Value); - Out.ReducerName = TEXT("ClientDisconnected"); - return Out; - } - - FORCEINLINE bool IsClientDisconnected() const { return Tag == EReducerTag::ClientDisconnected; } - FORCEINLINE FClientDisconnectedArgs GetAsClientDisconnected() const - { - ensureMsgf(IsClientDisconnected(), TEXT("Reducer does not hold ClientDisconnected!")); - return Data.Get(); - } - static FReducer SendMessage(const FSendMessageArgs& Value) { FReducer Out; Out.Tag = EReducerTag::SendMessage; Out.Data.Set(Value); - Out.ReducerName = TEXT("SendMessage"); + Out.ReducerName = TEXT("send_message"); return Out; } @@ -157,7 +139,7 @@ struct QUICKSTARTCHAT_API FReducer FReducer Out; Out.Tag = EReducerTag::SetName; Out.Data.Set(Value); - Out.ReducerName = TEXT("SetName"); + Out.ReducerName = TEXT("set_name"); return Out; } @@ -173,10 +155,6 @@ struct QUICKSTARTCHAT_API FReducer if (Tag != Other.Tag || ReducerId != Other.ReducerId || RequestId != Other.RequestId || ReducerName != Other.ReducerName) return false; switch (Tag) { - case EReducerTag::ClientConnected: - return GetAsClientConnected() == Other.GetAsClientConnected(); - case EReducerTag::ClientDisconnected: - return GetAsClientDisconnected() == Other.GetAsClientDisconnected(); case EReducerTag::SendMessage: return GetAsSendMessage() == Other.GetAsSendMessage(); case EReducerTag::SetName: @@ -194,32 +172,6 @@ class QUICKSTARTCHAT_API UReducerBpLib : public UBlueprintFunctionLibrary private: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|Reducer") - static FReducer ClientConnected(const FClientConnectedArgs& Value) { - return FReducer::ClientConnected(Value); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|Reducer") - static bool IsClientConnected(const FReducer& Reducer) { return Reducer.IsClientConnected(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|Reducer") - static FClientConnectedArgs GetAsClientConnected(const FReducer& Reducer) { - return Reducer.GetAsClientConnected(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|Reducer") - static FReducer ClientDisconnected(const FClientDisconnectedArgs& Value) { - return FReducer::ClientDisconnected(Value); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|Reducer") - static bool IsClientDisconnected(const FReducer& Reducer) { return Reducer.IsClientDisconnected(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|Reducer") - static FClientDisconnectedArgs GetAsClientDisconnected(const FReducer& Reducer) { - return Reducer.GetAsClientDisconnected(); - } - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|Reducer") static FReducer SendMessage(const FSendMessageArgs& Value) { return FReducer::SendMessage(Value); @@ -290,6 +242,44 @@ struct QUICKSTARTCHAT_API FQuickstartChatReducerEvent } }; +// No procedures defined in this module. +/** Metadata describing a procedure run. */ +USTRUCT(BlueprintType) +struct QUICKSTARTCHAT_API FQuickstartChatProcedureEvent +{ + GENERATED_BODY() + + /** Timestamp for when the procedure executed */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="SpacetimeDB") + FSpacetimeDBTimestamp Timestamp; + + /** Result status of the procedure */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="SpacetimeDB") + FSpacetimeDBProcedureStatus Status; + + /** Identity that initiated the call */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="SpacetimeDB") + FSpacetimeDBTimeDuration TotalHostExecutionDuration; + + FQuickstartChatProcedureEvent() { + } + FQuickstartChatProcedureEvent(FProcedureEvent Event) { + Timestamp = Event.Timestamp; + Status = FSpacetimeDBProcedureStatus::FromStatus(Event.Status); + TotalHostExecutionDuration = Event.TotalHostExecutionDuration; + } + FORCEINLINE bool operator==(const FQuickstartChatProcedureEvent& Other) const + { + return Status == Other.Status && Timestamp == Other.Timestamp && + TotalHostExecutionDuration == Other.TotalHostExecutionDuration; + } + + FORCEINLINE bool operator!=(const FQuickstartChatProcedureEvent& Other) const + { + return !(*this == Other); + } +}; + /** Represents event with variant message data. */ USTRUCT(BlueprintType) struct QUICKSTARTCHAT_API FQuickstartChatEvent @@ -336,6 +326,14 @@ struct QUICKSTARTCHAT_API FQuickstartChatEvent return Obj; } + static FQuickstartChatEvent Transaction(const FSpacetimeDBUnit& Value) + { + FQuickstartChatEvent Obj; + Obj.Tag = ESpacetimeDBEventTag::Transaction; + Obj.MessageData.Set(Value); + return Obj; + } + static FQuickstartChatEvent SubscribeError(const FString& Value) { FQuickstartChatEvent Obj; @@ -380,6 +378,13 @@ struct QUICKSTARTCHAT_API FQuickstartChatEvent return MessageData.Get(); } + FORCEINLINE bool IsTransaction() const { return Tag == ESpacetimeDBEventTag::Transaction; } + FORCEINLINE FSpacetimeDBUnit GetAsTransaction() const + { + ensureMsgf(IsTransaction(), TEXT("MessageData does not hold Transaction!")); + return MessageData.Get(); + } + FORCEINLINE bool IsSubscribeError() const { return Tag == ESpacetimeDBEventTag::SubscribeError; } FORCEINLINE FString GetAsSubscribeError() const { @@ -403,6 +408,7 @@ struct QUICKSTARTCHAT_API FQuickstartChatEvent case ESpacetimeDBEventTag::SubscribeApplied: return GetAsSubscribeApplied() == Other.GetAsSubscribeApplied(); case ESpacetimeDBEventTag::UnsubscribeApplied: return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected(); + case ESpacetimeDBEventTag::Transaction: return GetAsTransaction() == Other.GetAsTransaction(); case ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError(); case ESpacetimeDBEventTag::UnknownTransaction: return GetAsUnknownTransaction() == Other.GetAsUnknownTransaction(); default: return false; @@ -445,6 +451,12 @@ class QUICKSTARTCHAT_API UQuickstartChatEventBpLib : public UBlueprintFunctionLi return FQuickstartChatEvent::Disconnected(InValue); } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|QuickstartChatEvent") + static FQuickstartChatEvent Transaction(const FSpacetimeDBUnit& InValue) + { + return FQuickstartChatEvent::Transaction(InValue); + } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|QuickstartChatEvent") static FQuickstartChatEvent SubscribeError(const FString& InValue) { @@ -469,6 +481,9 @@ class QUICKSTARTCHAT_API UQuickstartChatEventBpLib : public UBlueprintFunctionLi UFUNCTION(BlueprintPure, Category = "SpacetimeDB|QuickstartChatEvent") static bool IsDisconnected(const FQuickstartChatEvent& Event) { return Event.IsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|QuickstartChatEvent") + static bool IsTransaction(const FQuickstartChatEvent& Event) { return Event.IsTransaction(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|QuickstartChatEvent") static bool IsSubscribeError(const FQuickstartChatEvent& Event) { return Event.IsSubscribeError(); } @@ -499,6 +514,12 @@ class QUICKSTARTCHAT_API UQuickstartChatEventBpLib : public UBlueprintFunctionLi return Event.GetAsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|QuickstartChatEvent") + static FSpacetimeDBUnit GetAsTransaction(const FQuickstartChatEvent& Event) + { + return Event.GetAsTransaction(); + } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|QuickstartChatEvent") static FString GetAsSubscribeError(const FQuickstartChatEvent& Event) { @@ -538,6 +559,18 @@ struct QUICKSTARTCHAT_API FReducerEventContext : public FContextBase FQuickstartChatReducerEvent Event; }; +USTRUCT(BlueprintType) +struct QUICKSTARTCHAT_API FProcedureEventContext : public FContextBase +{ + GENERATED_BODY() + + FProcedureEventContext() = default; + FProcedureEventContext(UDbConnection* InConn, FQuickstartChatProcedureEvent InEvent) : FContextBase(InConn), Event(InEvent) {} + + UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") + FQuickstartChatProcedureEvent Event; +}; + USTRUCT(BlueprintType) struct QUICKSTARTCHAT_API FErrorContext : public FContextBase { @@ -569,23 +602,6 @@ DECLARE_DYNAMIC_DELEGATE_OneParam( FOnSubscriptionError, FErrorContext, Context); -UCLASS(BlueprintType) -class QUICKSTARTCHAT_API USetReducerFlags : public USetReducerFlagsBase -{ - GENERATED_BODY() - -public: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void ClientConnected(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void ClientDisconnected(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void SendMessage(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void SetName(ECallReducerFlags Flag); - -}; - // RemoteTables class UCLASS(BlueprintType) class QUICKSTARTCHAT_API URemoteTables : public UObject @@ -596,10 +612,10 @@ class QUICKSTARTCHAT_API URemoteTables : public UObject void Initialize(); UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - UUserTable* User; + UMessageTable* Message; UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - UMessageTable* Message; + UUserTable* User; }; @@ -611,30 +627,6 @@ class QUICKSTARTCHAT_API URemoteReducers : public UObject public: - DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( - FClientConnectedHandler, - const FReducerEventContext&, Context - ); - UPROPERTY(BlueprintAssignable, Category="SpacetimeDB") - FClientConnectedHandler OnClientConnected; - - UFUNCTION(BlueprintCallable, Category="SpacetimeDB") - void ClientConnected(); - - bool InvokeClientConnected(const FReducerEventContext& Context, const UClientConnectedReducer* Args); - - DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( - FClientDisconnectedHandler, - const FReducerEventContext&, Context - ); - UPROPERTY(BlueprintAssignable, Category="SpacetimeDB") - FClientDisconnectedHandler OnClientDisconnected; - - UFUNCTION(BlueprintCallable, Category="SpacetimeDB") - void ClientDisconnected(); - - bool InvokeClientDisconnected(const FReducerEventContext& Context, const UClientDisconnectedReducer* Args); - DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( FSendMessageHandler, const FReducerEventContext&, Context, @@ -647,6 +639,7 @@ class QUICKSTARTCHAT_API URemoteReducers : public UObject void SendMessage(const FString& Text); bool InvokeSendMessage(const FReducerEventContext& Context, const USendMessageReducer* Args); + bool InvokeSendMessageWithArgs(const FReducerEventContext& Context, const FSendMessageArgs& Args); DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams( FSetNameHandler, @@ -660,6 +653,7 @@ class QUICKSTARTCHAT_API URemoteReducers : public UObject void SetName(const FString& Name); bool InvokeSetName(const FReducerEventContext& Context, const USetNameReducer* Args); + bool InvokeSetNameWithArgs(const FReducerEventContext& Context, const FSetNameArgs& Args); // Internal error handling DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FInternalOnUnhandledReducerError, const FReducerEventContext&, Context, const FString&, Error); @@ -671,9 +665,26 @@ class QUICKSTARTCHAT_API URemoteReducers : public UObject UPROPERTY() class UDbConnection* Conn; +}; + +// RemoteProcedures class +UCLASS(BlueprintType) +class QUICKSTARTCHAT_API URemoteProcedures : public UObject +{ + GENERATED_BODY() + +public: + + // Internal error handling + DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FInternalOnUnhandledProcedureError, const FProcedureEventContext&, Context, const FString&, Error); + FInternalOnUnhandledProcedureError InternalOnUnhandledProcedureError; + +private: + + friend UDbConnection; UPROPERTY() - USetReducerFlags* SetCallReducerFlags; + class UDbConnection* Conn; }; // SubscriptionBuilder class @@ -789,7 +800,7 @@ class QUICKSTARTCHAT_API UDbConnection : public UDbConnectionBase URemoteReducers* Reducers; UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - USetReducerFlags* SetReducerFlags; + URemoteProcedures* Procedures; // Delegates that allow users to bind with the concrete connection type. FOnConnectDelegate OnConnectDelegate; @@ -807,10 +818,15 @@ class QUICKSTARTCHAT_API UDbConnection : public UDbConnectionBase UPROPERTY(BlueprintAssignable, Category="SpacetimeDB") FOnUnhandledReducerError OnUnhandledReducerError; + // Error handling + DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnUnhandledProcedureError, const FProcedureEventContext&, Context, const FString&, Error); + UPROPERTY(BlueprintAssignable, Category="SpacetimeDB") + FOnUnhandledProcedureError OnUnhandledProcedureError; + protected: - // Hook up error handling to reducers + // Hook up error handling to reducers and procedures virtual void PostInitProperties() override; UFUNCTION() @@ -821,6 +837,9 @@ class QUICKSTARTCHAT_API UDbConnection : public UDbConnectionBase UFUNCTION() void OnUnhandledReducerErrorHandler(const FReducerEventContext& Context, const FString& Error); + UFUNCTION() + void OnUnhandledProcedureErrorHandler(const FProcedureEventContext& Context, const FString& Error); + // Override the DbConnectionBase methods to handle updates and events virtual void DbUpdate(const FDatabaseUpdateType& Update, const FSpacetimeDBEvent& Event) override; @@ -829,5 +848,17 @@ class QUICKSTARTCHAT_API UDbConnection : public UDbConnectionBase // Override the reducer event failed handler virtual void ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage) override; + // Override the procedure event failed handler + virtual void ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) override; + + friend class URemoteReducers; + + // Internal reducer correlation helpers (request_id -> typed reducer) + void RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer); + bool TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const; + bool TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer); + +private: + TMap PendingTypedReducers; }; diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Tables/UserTable.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Tables/UserTable.g.h index 7e567066cb9..41f03abb5d6 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Tables/UserTable.g.h +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Tables/UserTable.g.h @@ -25,7 +25,7 @@ class QUICKSTARTCHAT_API UUserIdentityUniqueIndex : public UObject public: UUserIdentityUniqueIndex() // Initialize the helper with the specific unique index name - : IdentityIndexHelper("Identity") { + : IdentityIndexHelper("identity") { } /** diff --git a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Types/UserType.g.h b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Types/UserType.g.h index 06890176da4..d5cfb423336 100644 --- a/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Types/UserType.g.h +++ b/sdks/unreal/examples/QuickstartChat/Source/QuickstartChat/Public/ModuleBindings/Types/UserType.g.h @@ -20,7 +20,7 @@ struct QUICKSTARTCHAT_API FUserType FQuickstartChatOptionalString Name; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - bool Online; + bool Online = false; FORCEINLINE bool operator==(const FUserType& Other) const { diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp index f66fd5d1d29..34d878e42cb 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp @@ -1,20 +1,69 @@ #include "Connection/DbConnectionBase.h" #include "Connection/DbConnectionBuilder.h" -#include "Connection/Credentials.h" -#include "Connection/LogCategory.h" -#include "ModuleBindings/Types/ClientMessageType.g.h" -#include "ModuleBindings/Types/SubscribeMultiType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiType.g.h" -#include "ModuleBindings/Types/SubscribeMultiAppliedType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h" -#include "ModuleBindings/Types/SubscriptionErrorType.g.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" -#include "Misc/Compression.h" -#include "Misc/ScopeLock.h" -#include "Async/Async.h" -#include "BSATN/UEBSATNHelpers.h" -#include "Connection/ProcedureFlags.h" +#include "Connection/Credentials.h" +#include "Connection/LogCategory.h" +#include "ModuleBindings/Types/ClientMessageType.g.h" +#include "ModuleBindings/Types/SubscriptionErrorType.g.h" +#include "Misc/Compression.h" +#include "Misc/ScopeLock.h" +#include "Async/Async.h" +#include "BSATN/UEBSATNHelpers.h" +#include "Connection/ProcedureFlags.h" + +namespace +{ +enum class EWsCompressionTag : uint8 +{ + Uncompressed = 0, + Brotli = 1, + Gzip = 2, +}; + +static FDatabaseUpdateType QueryRowsToDatabaseUpdate(const FQueryRowsType& Rows, bool bAsDeletes) +{ + FDatabaseUpdateType Update; + for (const FSingleTableRowsType& TableRows : Rows.Tables) + { + FTableUpdateType TableUpdate; + TableUpdate.TableName = TableRows.Table; + + FPersistentTableRowsType PersistentRows; + if (bAsDeletes) + { + PersistentRows.Deletes = TableRows.Rows; + } + else + { + PersistentRows.Inserts = TableRows.Rows; + } + TableUpdate.Rows.Add(FTableUpdateRowsType::PersistentTable(PersistentRows)); + Update.Tables.Add(TableUpdate); + } + return Update; +} + +static FDatabaseUpdateType TransactionUpdateToDatabaseUpdate(const FTransactionUpdateType& Update) +{ + FDatabaseUpdateType Out; + for (const FQuerySetUpdateType& QuerySet : Update.QuerySets) + { + for (const FTableUpdateType& TableUpdate : QuerySet.Tables) + { + Out.Tables.Add(TableUpdate); + } + } + return Out; +} + +static FString DecodeReducerErrorMessage(const TArray& ErrorBytes) +{ + if (ErrorBytes.Num() == 0) + { + return TEXT("Reducer returned empty error payload"); + } + return UE::SpacetimeDB::Deserialize(ErrorBytes); +} +} UDbConnectionBase::UDbConnectionBase(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) @@ -70,21 +119,48 @@ USubscriptionBuilderBase* UDbConnectionBase::SubscriptionBuilderBase() return NewObject(); } -void UDbConnectionBase::HandleWSError(const FString& Error) -{ - if (OnConnectErrorDelegate.IsBound()) - { - OnConnectErrorDelegate.Execute(Error); - } -} - -void UDbConnectionBase::HandleWSClosed(int32 /*StatusCode*/, const FString& Reason, bool /*bWasClean*/) -{ - if (OnDisconnectBaseDelegate.IsBound()) - { - OnDisconnectBaseDelegate.Execute(this, Reason); - } -} +void UDbConnectionBase::HandleWSError(const FString& Error) +{ + bProtocolViolationHandled = false; + ClearPendingOperations(Error); + if (OnConnectErrorDelegate.IsBound()) + { + OnConnectErrorDelegate.Execute(Error); + } +} + +void UDbConnectionBase::HandleWSClosed(int32 /*StatusCode*/, const FString& Reason, bool /*bWasClean*/) +{ + bProtocolViolationHandled = false; + ClearPendingOperations(Reason); + if (OnDisconnectBaseDelegate.IsBound()) + { + OnDisconnectBaseDelegate.Execute(this, Reason); + } +} + +void UDbConnectionBase::HandleProtocolViolation(const FString& ErrorMessage) +{ + if (bProtocolViolationHandled) + { + return; + } + bProtocolViolationHandled = true; + + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("%s"), *ErrorMessage); + TriggerError(ErrorMessage); + ClearPendingOperations(ErrorMessage); + + // Match Rust/C# behavior: parse/protocol violations are fatal for the connection. + if (WebSocket && WebSocket->IsConnected()) + { + WebSocket->Disconnect(); + } + else if (OnConnectErrorDelegate.IsBound()) + { + OnConnectErrorDelegate.Execute(ErrorMessage); + } +} void UDbConnectionBase::HandleWSBinaryMessage(const TArray& Message) { @@ -99,11 +175,24 @@ void UDbConnectionBase::HandleWSBinaryMessage(const TArray& Message) if (!WeakThis.IsValid()) { return; - } - UDbConnectionBase* This = WeakThis.Get(); - - //parse the message, decompress if needed - FServerMessageType Parsed = This->PreProcessMessage(Message); + } + UDbConnectionBase* This = WeakThis.Get(); + + //parse the message, decompress if needed + FServerMessageType Parsed; + if (!This->PreProcessMessage(Message, Parsed)) + { + AsyncTask(ENamedThreads::GameThread, [WeakThis]() + { + if (!WeakThis.IsValid()) + { + return; + } + UDbConnectionBase* Conn = WeakThis.Get(); + Conn->HandleProtocolViolation(TEXT("Failed to parse/decompress incoming WebSocket message")); + }); + return; + } //queue: re-order buffer TArray Ready; @@ -174,205 +263,207 @@ bool UDbConnectionBase::IsTickableInEditor() const } -void UDbConnectionBase::ProcessServerMessage(const FServerMessageType& Message) -{ - bool bIsValid = false; - switch (Message.Tag) - { - case EServerMessageTag::InitialSubscription: - { - //@Note: This is a legacy tag, used implemented in current server version - break; - } - case EServerMessageTag::TransactionUpdate: - { - // Process a transaction update message - const FTransactionUpdateType Payload = Message.GetAsTransactionUpdate(); - - // Create a status object based on the transaction status - FSpacetimeDBStatus StatusObj; - bool bSuccess = false; - FString ErrorMessage; - if (Payload.Status.IsCommitted()) - { - bSuccess = true; - StatusObj = FSpacetimeDBStatus::Committed(FSpacetimeDBUnit()); - } - else if (Payload.Status.IsFailed()) - { - ErrorMessage = Payload.Status.GetAsFailed(); - StatusObj = FSpacetimeDBStatus::Failed(ErrorMessage); - } - else if (Payload.Status.IsOutOfEnergy()) - { - Payload.Status.GetAsOutOfEnergy(); - StatusObj = FSpacetimeDBStatus::OutOfEnergy(FSpacetimeDBUnit()); - ErrorMessage = TEXT("Out of energy"); - } - - // Process the transaction update and create a reducer event - FReducerEvent RedEvent; - RedEvent.Timestamp = Payload.Timestamp; - RedEvent.Status = StatusObj; - RedEvent.CallerIdentity = Payload.CallerIdentity; - RedEvent.CallerConnectionId = Payload.CallerConnectionId; - RedEvent.EnergyConsumed = Payload.EnergyQuantaUsed; - RedEvent.ReducerCall = Payload.ReducerCall; - - // If the status is committed, we update the database - if (bSuccess) - { - DbUpdate(Payload.Status.GetAsCommitted(), FSpacetimeDBEvent::Reducer(RedEvent)); // Update table and trigger insert/update/delete - ReducerEvent(RedEvent); // Trigger the reducer event - } - else - { - ReducerEvent(RedEvent); // Trigger the reducer event - ReducerEventFailed(RedEvent, ErrorMessage); - } - break; - } - case EServerMessageTag::TransactionUpdateLight: - { - // Process a light transaction update message - const FTransactionUpdateLightType Payload = Message.GetAsTransactionUpdateLight(); - - //@TODO: Implement light update fully - DbUpdate(Payload.Update, FSpacetimeDBEvent::UnknownTransaction(FSpacetimeDBUnit())); - - break; - } - case EServerMessageTag::IdentityToken: - { - // Process an identity token message - const FIdentityTokenType Payload = Message.GetAsIdentityToken(); - - Token = Payload.Token; - UCredentials::SaveToken(Token); - Identity = Payload.Identity; - bIsIdentitySet = true; - UE_LOG(LogSpacetimeDb_Connection, Verbose, TEXT("IdentityToken: Identity set to: %s"), *Identity.ToHex()); - ConnectionId = Payload.ConnectionId; - if (OnConnectBaseDelegate.IsBound()) - { - OnConnectBaseDelegate.Execute(this, Identity, Token); - } - break; - } - case EServerMessageTag::OneOffQueryResponse: - { - //@Note: Not implemented in Rust version, skip for now here aswell - break; - } - case EServerMessageTag::SubscribeApplied: - { - //@Note: This is a legacy tag, not implemented in current server version - break; - } - case EServerMessageTag::UnsubscribeApplied: - { - //@Note: This is a legacy tag, not implemented in current server version - break; - } - case EServerMessageTag::SubscriptionError: - { - // Process a subscription error message - const FSubscriptionErrorType Payload = Message.GetAsSubscriptionError(); - if (TObjectPtr Handle = *ActiveSubscriptions.Find(Payload.QueryId.Value)) - { - if (!Handle) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("SubscriptionError: Null handle for QueryId %u. Error: %s"), - Payload.QueryId.Value, - *Payload.Error); - return; - } - FErrorContextBase Ctx; Ctx.Error = Payload.Error; - Handle->TriggerError(Ctx); - ActiveSubscriptions.Remove(Payload.QueryId.Value); - } - break; - } - case EServerMessageTag::SubscribeMultiApplied: - { - // Process a multi-subscription applied message - const FSubscribeMultiAppliedType Payload = Message.GetAsSubscribeMultiApplied(); - // Update the database with the subscription applied event - DbUpdate(Payload.Update, FSpacetimeDBEvent::SubscribeApplied(FSpacetimeDBUnit())); - - if (TObjectPtr Handle = *ActiveSubscriptions.Find(Payload.QueryId.Id)) - { - if (!Handle) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("SubscriptionError: Null handle for QueryId %u."), Payload.QueryId.Id); - return; - } - FSubscriptionEventContextBase Ctx; Ctx.Event = FSpacetimeDBEvent::SubscribeApplied(FSpacetimeDBUnit()); - Handle->TriggerApplied(Ctx); - } - - break; - } - case EServerMessageTag::UnsubscribeMultiApplied: - { - // Process a multi-unsubscription applied message - const FUnsubscribeMultiAppliedType Payload = Message.GetAsUnsubscribeMultiApplied(); - - // Update the database with the unsubscription applied event - DbUpdate(Payload.Update, FSpacetimeDBEvent::UnsubscribeApplied(FSpacetimeDBUnit())); - if (TObjectPtr Handle = *ActiveSubscriptions.Find(Payload.QueryId.Id)) - { - if (!Handle) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("UnsubscribeMultiApplied: Null handle for QueryId %u."), Payload.QueryId.Id); - return; - } - Handle->bEnded = true; - Handle->bActive = false; - Handle->bUnsubscribeCalled = true; - FSubscriptionEventContextBase Ctx; Ctx.Event = FSpacetimeDBEvent::UnsubscribeApplied(FSpacetimeDBUnit()); - if (Handle->EndDelegate.IsBound()) - { - Handle->EndDelegate.Execute(Ctx); - } - ActiveSubscriptions.Remove(Payload.QueryId.Id); - } - break; - } - case EServerMessageTag::ProcedureResult: - { - const FProcedureResultType Payload = Message.GetAsProcedureResult(); - FProcedureEvent ProcEvent; - ProcEvent.Status = Payload.Status; - ProcEvent.Timestamp = Payload.Timestamp; - ProcEvent.TotalHostExecutionDuration = Payload.TotalHostExecutionDuration; - ProcEvent.Success = ProcEvent.Status.IsReturned(); - TArray PayloadData; - FString ErrorMessage = ""; - if (ProcEvent.Success) - PayloadData = ProcEvent.Status.GetAsReturned(); - if (Payload.Status.IsOutOfEnergy()) - { - ErrorMessage = TEXT("Out of energy"); - } - else if (Payload.Status.IsInternalError()) - { - ErrorMessage = Payload.Status.GetAsInternalError(); - } - - ProcedureCallbacks->ResolveCallback(Payload.RequestId, FSpacetimeDBEvent::Procedure(ProcEvent), PayloadData, ProcEvent.Success); - if (!ProcEvent.Success) - { - ProcedureEventFailed(ProcEvent, ErrorMessage); - } - break; - } - default: - // Unknown tag - bail out - UE_LOG(LogSpacetimeDb_Connection, Warning, TEXT("Unknown server-message tag")); - break; - } -} +void UDbConnectionBase::ProcessServerMessage(const FServerMessageType& Message) +{ + switch (Message.Tag) + { + case EServerMessageTag::InitialConnection: + { + const FInitialConnectionType Payload = Message.GetAsInitialConnection(); + Token = Payload.Token; + UCredentials::SaveToken(Token); + Identity = Payload.Identity; + bIsIdentitySet = true; + ConnectionId = Payload.ConnectionId; + if (OnConnectBaseDelegate.IsBound()) + { + OnConnectBaseDelegate.Execute(this, Identity, Token); + } + break; + } + case EServerMessageTag::TransactionUpdate: + { + const FTransactionUpdateType Payload = Message.GetAsTransactionUpdate(); + const FDatabaseUpdateType Update = TransactionUpdateToDatabaseUpdate(Payload); + DbUpdate(Update, FSpacetimeDBEvent::Transaction(FSpacetimeDBUnit())); + break; + } + case EServerMessageTag::OneOffQueryResult: + { + // One-off query results are request/response only and do not mutate cache by default. + break; + } + case EServerMessageTag::SubscribeApplied: + { + const FSubscribeAppliedType Payload = Message.GetAsSubscribeApplied(); + const FDatabaseUpdateType Update = QueryRowsToDatabaseUpdate(Payload.Rows, false); + DbUpdate(Update, FSpacetimeDBEvent::SubscribeApplied(FSpacetimeDBUnit())); + + if (TObjectPtr* HandlePtr = ActiveSubscriptions.Find(Payload.QuerySetId.Id)) + { + TObjectPtr Handle = *HandlePtr; + if (!Handle) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("SubscribeApplied: Null handle for QuerySetId %u."), Payload.QuerySetId.Id); + return; + } + FSubscriptionEventContextBase Ctx; + Ctx.Event = FSpacetimeDBEvent::SubscribeApplied(FSpacetimeDBUnit()); + Handle->TriggerApplied(Ctx); + } + break; + } + case EServerMessageTag::UnsubscribeApplied: + { + const FUnsubscribeAppliedType Payload = Message.GetAsUnsubscribeApplied(); + if (Payload.Rows.IsSet()) + { + const FDatabaseUpdateType Update = QueryRowsToDatabaseUpdate(Payload.Rows.Value, true); + DbUpdate(Update, FSpacetimeDBEvent::UnsubscribeApplied(FSpacetimeDBUnit())); + } + + if (TObjectPtr* HandlePtr = ActiveSubscriptions.Find(Payload.QuerySetId.Id)) + { + TObjectPtr Handle = *HandlePtr; + if (!Handle) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("UnsubscribeApplied: Null handle for QuerySetId %u."), Payload.QuerySetId.Id); + return; + } + Handle->bEnded = true; + Handle->bActive = false; + Handle->bUnsubscribeCalled = true; + FSubscriptionEventContextBase Ctx; + Ctx.Event = FSpacetimeDBEvent::UnsubscribeApplied(FSpacetimeDBUnit()); + if (Handle->EndDelegate.IsBound()) + { + Handle->EndDelegate.Execute(Ctx); + } + ActiveSubscriptions.Remove(Payload.QuerySetId.Id); + } + break; + } + case EServerMessageTag::SubscriptionError: + { + const FSubscriptionErrorType Payload = Message.GetAsSubscriptionError(); + UE_LOG(LogSpacetimeDb_Connection, Warning, TEXT("SubscriptionError received for QuerySetId=%u Error=%s"), + Payload.QuerySetId.Id, + *Payload.Error); + if (TObjectPtr* HandlePtr = ActiveSubscriptions.Find(Payload.QuerySetId.Id)) + { + TObjectPtr Handle = *HandlePtr; + if (!Handle) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("SubscriptionError: Null handle for QuerySetId %u. Error: %s"), + Payload.QuerySetId.Id, + *Payload.Error); + return; + } + FErrorContextBase Ctx; Ctx.Error = Payload.Error; + Handle->TriggerError(Ctx); + ActiveSubscriptions.Remove(Payload.QuerySetId.Id); + } + break; + } + case EServerMessageTag::ReducerResult: + { + const FReducerResultType Payload = Message.GetAsReducerResult(); + const FReducerCallInfoType* FoundReducerCall = PendingReducerCalls.Find(Payload.RequestId); + if (!FoundReducerCall) + { + const FString ErrorMessage = FString::Printf( + TEXT("Reducer result for unknown request_id %u"), + Payload.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } + + const FReducerCallInfoType ReducerCall = *FoundReducerCall; + PendingReducerCalls.Remove(Payload.RequestId); + + FReducerEvent RedEvent; + RedEvent.RequestId = Payload.RequestId; + RedEvent.Timestamp = Payload.Timestamp; + RedEvent.CallerIdentity = Identity; + RedEvent.CallerConnectionId = ConnectionId; + RedEvent.ReducerCall = ReducerCall; + + if (Payload.Result.IsOk()) + { + RedEvent.Status = FSpacetimeDBStatus::Committed(FSpacetimeDBUnit()); + const FReducerOkType Ok = Payload.Result.GetAsOk(); + const FDatabaseUpdateType Update = TransactionUpdateToDatabaseUpdate(Ok.TransactionUpdate); + DbUpdate(Update, FSpacetimeDBEvent::Reducer(RedEvent)); + ReducerEvent(RedEvent); + } + else if (Payload.Result.IsOkEmpty()) + { + RedEvent.Status = FSpacetimeDBStatus::Committed(FSpacetimeDBUnit()); + ReducerEvent(RedEvent); + } + else + { + FString ErrorMessage; + if (Payload.Result.IsErr()) + { + ErrorMessage = DecodeReducerErrorMessage(Payload.Result.GetAsErr()); + } + else + { + ErrorMessage = Payload.Result.GetAsInternalError(); + } + RedEvent.Status = FSpacetimeDBStatus::Failed(ErrorMessage); + ReducerEvent(RedEvent); + ReducerEventFailed(RedEvent, ErrorMessage); + } + break; + } + case EServerMessageTag::ProcedureResult: + { + const FProcedureResultType Payload = Message.GetAsProcedureResult(); + FProcedureEvent ProcEvent; + ProcEvent.Status = Payload.Status; + ProcEvent.Timestamp = Payload.Timestamp; + ProcEvent.TotalHostExecutionDuration = Payload.TotalHostExecutionDuration; + ProcEvent.Success = ProcEvent.Status.IsReturned(); + + TArray PayloadData; + FString ErrorMessage; + if (ProcEvent.Success) + { + PayloadData = ProcEvent.Status.GetAsReturned(); + } + else if (Payload.Status.IsInternalError()) + { + ErrorMessage = Payload.Status.GetAsInternalError(); + } + + const bool bResolved = ProcedureCallbacks->ResolveCallback( + Payload.RequestId, + FSpacetimeDBEvent::Procedure(ProcEvent), + PayloadData, + ProcEvent.Success + ); + if (!bResolved) + { + UE_LOG( + LogSpacetimeDb_Connection, + Warning, + TEXT("Received ProcedureResult for unknown request ID: %u"), + Payload.RequestId + ); + } + if (!ProcEvent.Success) + { + ProcedureEventFailed(ProcEvent, ErrorMessage); + } + break; + } + default: + UE_LOG(LogSpacetimeDb_Connection, Warning, TEXT("Unknown server-message tag")); + break; + } +} bool UDbConnectionBase::DecompressBrotli(const TArray& InData, TArray& OutData) { @@ -405,71 +496,44 @@ bool UDbConnectionBase::DecompressGzip(const TArray& InData, TArray& In, TArray& Out) -{ - switch (Variant) - { - case ECompressableQueryUpdateTag::Uncompressed: - // No compression, just copy the data - Out = In; - return true; - case ECompressableQueryUpdateTag::Brotli: - return DecompressBrotli(In, Out); - case ECompressableQueryUpdateTag::Gzip: - return DecompressGzip(In, Out); - default: - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Unknown compression variant")); - return false; - } -} - -void UDbConnectionBase::PreProcessDatabaseUpdate(const FDatabaseUpdateType& Update) -{ - for (const FTableUpdateType& TableUpdate : Update.Tables) - { - TArray UncompressedCQUs; - for (const FCompressableQueryUpdateType& CQU : TableUpdate.Updates) - { - - // Uncompress the CQU based on its tag - FQueryUpdateType UncompressedUpdate; - switch (CQU.Tag) - { - case ECompressableQueryUpdateTag::Uncompressed: - UncompressedUpdate = CQU.GetAsUncompressed(); - break; - case ECompressableQueryUpdateTag::Brotli: - { - TArray Data = CQU.GetAsBrotli(); - TArray Dec; - if (DecompressBrotli(Data, Dec)) - { - //@Note: This will never trigger until Brotli decompression is implemented - UncompressedUpdate = UE::SpacetimeDB::Deserialize(Dec); - } - break; - } - case ECompressableQueryUpdateTag::Gzip: - { - TArray Data = CQU.GetAsGzip(); - TArray Dec; - if (DecompressGzip(Data, Dec)) - { - UncompressedUpdate = UE::SpacetimeDB::Deserialize(Dec); - } - break; - } - default: - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Unknown compression variant in CQU")); - break; - } - UncompressedCQUs.Add(FCompressableQueryUpdateType::Uncompressed(UncompressedUpdate)); - UE_LOG(LogSpacetimeDb_Connection, Verbose, TEXT("Table %s Inserts:%d Deletes:%d"), *TableUpdate.TableName, UncompressedUpdate.Inserts.RowsData.Num(), UncompressedUpdate.Deletes.RowsData.Num()); - } - - // After ensuring all updates are uncompressed, attempt to deserialize rows - TSharedPtr Deserializer; - { +bool UDbConnectionBase::DecompressPayload(uint8 Variant, const TArray& In, TArray& Out) +{ + switch (static_cast(Variant)) + { + case EWsCompressionTag::Uncompressed: + // No compression, just copy the data + Out = In; + return true; + case EWsCompressionTag::Brotli: + return DecompressBrotli(In, Out); + case EWsCompressionTag::Gzip: + return DecompressGzip(In, Out); + default: + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Unknown compression variant")); + return false; + } +} + +void UDbConnectionBase::ClearPendingOperations(const FString& Reason) +{ + PendingReducerCalls.Empty(); + if (ProcedureCallbacks) + { + ProcedureCallbacks->ClearAllCallbacks(); + } + if (!Reason.IsEmpty()) + { + UE_LOG(LogSpacetimeDb_Connection, Warning, TEXT("Cleared pending operations due to connection issue: %s"), *Reason); + } +} + +void UDbConnectionBase::PreProcessDatabaseUpdate(const FDatabaseUpdateType& Update) +{ + for (const FTableUpdateType& TableUpdate : Update.Tables) + { + // Attempt to deserialize rows after payload decode. + TSharedPtr Deserializer; + { // Find the deserializer for this table FScopeLock Lock(&TableDeserializersMutex); if (TSharedPtr* Found = TableDeserializers.Find(TableUpdate.TableName)) @@ -481,19 +545,17 @@ void UDbConnectionBase::PreProcessDatabaseUpdate(const FDatabaseUpdateType& Upda { UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("No deserializer found for table %s"), *TableUpdate.TableName); } - } - if (Deserializer) - { - // Preprocess the table data using the deserializer - TSharedPtr Data = Deserializer->PreProcess(UncompressedCQUs, TableUpdate.TableName); - if (Data.IsValid()) - { - // Store the preprocessed data in the mutex-protected map - FScopeLock Lock(&PreprocessedDataMutex); - FPreprocessedTableKey Key(TableUpdate.TableId, TableUpdate.TableName); - TArray>& Queue = PreprocessedTableData.FindOrAdd(Key); - Queue.Add(Data); - } + } + if (Deserializer) + { + TSharedPtr Data = Deserializer->PreProcess(TableUpdate.Rows, TableUpdate.TableName); + if (Data.IsValid()) + { + FScopeLock Lock(&PreprocessedDataMutex); + FPreprocessedTableKey Key(TableUpdate.TableName); + TArray>& Queue = PreprocessedTableData.FindOrAdd(Key); + Queue.Add(Data); + } } else { @@ -502,89 +564,80 @@ void UDbConnectionBase::PreProcessDatabaseUpdate(const FDatabaseUpdateType& Upda } } -FServerMessageType UDbConnectionBase::PreProcessMessage(const TArray& Message) -{ - if (Message.Num() == 0) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Empty message recived from server, ignored")); - return FServerMessageType{}; - } - // Check if the first byte is a valid compression tag - ECompressableQueryUpdateTag Compression = static_cast(Message[0]); - TArray CompressedPayload; - CompressedPayload.Append(Message.GetData() + 1, Message.Num() - 1); +bool UDbConnectionBase::PreProcessMessage(const TArray& Message, FServerMessageType& OutMessage) +{ + if (Message.Num() == 0) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Empty message recived from server, ignored")); + return false; + } + // The first byte indicates compression format for the payload. + const uint8 Compression = Message[0]; + TArray CompressedPayload; + CompressedPayload.Append(Message.GetData() + 1, Message.Num() - 1); // Decompress the payload based on the compression tag TArray Decompressed; - if (!DecompressPayload(Compression, CompressedPayload, Decompressed)) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Failed to decompress incoming message")); - return FServerMessageType{}; - } - - // Deserialize the decompressed data into a UServerMessageType object - FServerMessageType Parsed = UE::SpacetimeDB::Deserialize(Decompressed); - - // Process it based on its tag. Messages containing rows will be deserialized into rows based on registered type and table name. - bool bValid = false; - switch (Parsed.Tag) - { - case EServerMessageTag::InitialSubscription: - { - const FInitialSubscriptionType Payload = Parsed.GetAsInitialSubscription(); - // PreProcess the initial subscription payload - PreProcessDatabaseUpdate(Payload.DatabaseUpdate); - break; - } - case EServerMessageTag::TransactionUpdate: - { - - const FTransactionUpdateType Payload = Parsed.GetAsTransactionUpdate(); - if (Payload.Status.IsCommitted()) - { - // PreProcess the database update with the committed status - PreProcessDatabaseUpdate(Payload.Status.GetAsCommitted()); - } - break; - } - case EServerMessageTag::TransactionUpdateLight: - { - //@Note: Light tag in not implemented as an option in connection builder, this will never trigger but we keep this for future compatibility - const FTransactionUpdateLightType Payload = Parsed.GetAsTransactionUpdateLight(); - // PreProcess the light transaction update - PreProcessDatabaseUpdate(Payload.Update); - break; - } - case EServerMessageTag::SubscribeMultiApplied: - { - const FSubscribeMultiAppliedType Payload = Parsed.GetAsSubscribeMultiApplied(); - PreProcessDatabaseUpdate(Payload.Update); - break; - } - case EServerMessageTag::UnsubscribeMultiApplied: - { - const FUnsubscribeMultiAppliedType Payload = Parsed.GetAsUnsubscribeMultiApplied(); - PreProcessDatabaseUpdate(Payload.Update); - break; - } - default: - break; - } - return Parsed; -} - - -int32 UDbConnectionBase::GetNextRequestId() -{ - return NextRequestId++; -} - -int32 UDbConnectionBase::GetNextSubscriptionId() -{ - return NextSubscriptionId++; -} - -void UDbConnectionBase::StartSubscription(USubscriptionHandleBase* Handle) + if (!DecompressPayload(Compression, CompressedPayload, Decompressed)) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Failed to decompress incoming message")); + return false; + } + + // Deserialize the decompressed data into a UServerMessageType object + OutMessage = UE::SpacetimeDB::Deserialize(Decompressed); + + // Preprocess row-bearing payloads for table deserializers. + switch (OutMessage.Tag) + { + case EServerMessageTag::SubscribeApplied: + { + const FSubscribeAppliedType Payload = OutMessage.GetAsSubscribeApplied(); + PreProcessDatabaseUpdate(QueryRowsToDatabaseUpdate(Payload.Rows, false)); + break; + } + case EServerMessageTag::UnsubscribeApplied: + { + const FUnsubscribeAppliedType Payload = OutMessage.GetAsUnsubscribeApplied(); + if (Payload.Rows.IsSet()) + { + PreProcessDatabaseUpdate(QueryRowsToDatabaseUpdate(Payload.Rows.Value, true)); + } + break; + } + case EServerMessageTag::TransactionUpdate: + { + const FTransactionUpdateType Payload = OutMessage.GetAsTransactionUpdate(); + PreProcessDatabaseUpdate(TransactionUpdateToDatabaseUpdate(Payload)); + break; + } + case EServerMessageTag::ReducerResult: + { + const FReducerResultType Payload = OutMessage.GetAsReducerResult(); + if (Payload.Result.IsOk()) + { + PreProcessDatabaseUpdate(TransactionUpdateToDatabaseUpdate(Payload.Result.GetAsOk().TransactionUpdate)); + } + break; + } + default: + break; + } + return true; +} + + +uint32 UDbConnectionBase::GetNextRequestId() +{ + return NextRequestId++; +} + +uint32 UDbConnectionBase::GetNextSubscriptionId() +{ + return NextSubscriptionId++; +} + +void UDbConnectionBase::StartSubscription(USubscriptionHandleBase* Handle) { if (!Handle) { @@ -598,20 +651,20 @@ void UDbConnectionBase::StartSubscription(USubscriptionHandleBase* Handle) return; } - const int32 QueryId = GetNextSubscriptionId(); - Handle->QueryId = QueryId; - Handle->ConnInternal = this; - ActiveSubscriptions.Add(QueryId, Handle); - - FSubscribeMultiType SubMsg; - SubMsg.QueryStrings = Handle->QuerySqls; - SubMsg.RequestId = GetNextRequestId(); - SubMsg.QueryId.Id = QueryId; - - FClientMessageType Msg = FClientMessageType::SubscribeMulti(SubMsg); - TArray Data = UE::SpacetimeDB::Serialize(Msg); - SendRawMessage(Data); -} + const uint32 QuerySetId = GetNextSubscriptionId(); + Handle->QuerySetId = QuerySetId; + Handle->ConnInternal = this; + ActiveSubscriptions.Add(QuerySetId, Handle); + + FSubscribeType SubMsg; + SubMsg.RequestId = GetNextRequestId(); + SubMsg.QuerySetId.Id = QuerySetId; + SubMsg.QueryStrings = Handle->QuerySqls; + + FClientMessageType Msg = FClientMessageType::Subscribe(SubMsg); + TArray Data = UE::SpacetimeDB::Serialize(Msg); + SendRawMessage(Data); +} void UDbConnectionBase::UnsubscribeInternal(USubscriptionHandleBase* Handle) { @@ -620,42 +673,41 @@ void UDbConnectionBase::UnsubscribeInternal(USubscriptionHandleBase* Handle) return; } - const int32 QueryId = Handle->QueryId; - FUnsubscribeMultiType MsgData; - MsgData.RequestId = GetNextRequestId(); - MsgData.QueryId.Id = QueryId; - - FClientMessageType Msg = FClientMessageType::UnsubscribeMulti(MsgData); - TArray Data = UE::SpacetimeDB::Serialize(Msg); - SendRawMessage(Data); -} - -void UDbConnectionBase::InternalCallReducer(const FString& Reducer, TArray Args, USetReducerFlagsBase* Flags) -{ - if (!WebSocket || !WebSocket->IsConnected()) - { - UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Cannot call reducer, not connected to server!")); - return; - } - - uint8 FlagToUse = 0; // Default to FullUpdate - if (Flags && Flags->FlagMap.Contains(Reducer)) - { - //Select flag if set by user - ECallReducerFlags FlagFound = *Flags->FlagMap.Find(Reducer); - FlagToUse = static_cast(FlagFound); - } - - FCallReducerType MsgData; - MsgData.Reducer = Reducer; - MsgData.Args = Args; - MsgData.RequestId = GetNextRequestId(); - MsgData.Flags = FlagToUse; - - FClientMessageType Msg = FClientMessageType::CallReducer(MsgData); - TArray Data = UE::SpacetimeDB::Serialize(Msg); - SendRawMessage(Data); -} + const uint32 QuerySetId = Handle->QuerySetId; + FUnsubscribeType MsgData; + MsgData.RequestId = GetNextRequestId(); + MsgData.QuerySetId.Id = QuerySetId; + MsgData.Flags = EUnsubscribeFlagsType::SendDroppedRows; + + FClientMessageType Msg = FClientMessageType::Unsubscribe(MsgData); + TArray Data = UE::SpacetimeDB::Serialize(Msg); + SendRawMessage(Data); +} + +uint32 UDbConnectionBase::InternalCallReducer(const FString& Reducer, TArray Args) +{ + if (!WebSocket || !WebSocket->IsConnected()) + { + UE_LOG(LogSpacetimeDb_Connection, Error, TEXT("Cannot call reducer, not connected to server!")); + return 0; + } + + FCallReducerType MsgData; + MsgData.Reducer = Reducer; + MsgData.Args = Args; + MsgData.RequestId = GetNextRequestId(); + // v2 parity with Rust/C#: reducer flags are always default. + MsgData.Flags = 0; + FReducerCallInfoType CallInfo; + CallInfo.ReducerName = Reducer; + CallInfo.Args = Args; + PendingReducerCalls.Add(MsgData.RequestId, CallInfo); + + FClientMessageType Msg = FClientMessageType::CallReducer(MsgData); + TArray Data = UE::SpacetimeDB::Serialize(Msg); + SendRawMessage(Data); + return MsgData.RequestId; +} void UDbConnectionBase::InternalCallProcedure(const FString& ProcedureName, TArray Args, const FOnProcedureCompleteDelegate& Callback) { @@ -703,4 +755,4 @@ void UDbConnectionBase::ApplyRegisteredTableUpdates(const FDatabaseUpdateType& U // Broadcast the diff for each handler Handler->BroadcastDiff(this, Context); } -} \ No newline at end of file +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/Websocket.cpp b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/Websocket.cpp index 9c1f4525f67..7b4bbe53f40 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/Websocket.cpp +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/Websocket.cpp @@ -1,30 +1,14 @@ -#include "Connection/Websocket.h" -#include "WebSocketsModule.h" // Required for FWebSocketsModule -#include "SpacetimeDbSdk/Public/BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/ServerMessageType.g.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" -#include "Misc/Compression.h" +#include "Connection/Websocket.h" +#include "WebSocketsModule.h" // Required for FWebSocketsModule +#include "SpacetimeDbSdk/Public/BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/ServerMessageType.g.h" #include "Dom/JsonObject.h" #include "Serialization/JsonWriter.h" #include "Serialization/JsonSerializer.h" -static void LogIdentityTokenHex(const FIdentityTokenType& InToken, const TCHAR* TagName) -{ - // Logs the identity token in a structured format for debugging purposes. - TSharedRef Obj = MakeShared(); - Obj->SetStringField(TEXT("__identity__"), InToken.Identity.ToHex()); - Obj->SetStringField(TEXT("token"), InToken.Token); - Obj->SetStringField(TEXT("__connection_id__"), InToken.ConnectionId.ToHex()); - - FString Json; - TSharedRef> Writer = TJsonWriterFactory<>::Create(&Json); - FJsonSerializer::Serialize(Obj, Writer); - UE_LOG(LogSpacetimeDb_Connection, Log, TEXT("[%s] %s"), TagName, *Json); -} - -UWebsocketManager::UWebsocketManager() +UWebsocketManager::UWebsocketManager() { // Ensure the WebSockets module is loaded. FModuleManager::LoadModuleChecked(TEXT("WebSockets")); @@ -64,8 +48,8 @@ void UWebsocketManager::Connect(const FString& ServerUrl) UpgradeHeaders.Add("Authorization", HeaderToken); } - // using the v1.bsatn.spacetimedb protocol for WebSocket connections - const FString Protocol = "v1.bsatn.spacetimedb"; // @TODO: Implement JSON alternative, v1.json.spacetimedb + // Use websocket protocol v2 + const FString Protocol = "v2.bsatn.spacetimedb"; // Create the WebSocket connection WebSocket = FWebSocketsModule::Get().CreateWebSocket(ServerUrl, Protocol, UpgradeHeaders); @@ -212,4 +196,4 @@ void UWebsocketManager::HandleClosed(int32 StatusCode, const FString& Reason, bo OnClosed.Broadcast(StatusCode, Reason, bWasClean); // Reset on close to allow reconnection attempts WebSocket.Reset(); -} \ No newline at end of file +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Tests/SpacetimeDBBSATNTestOrg.cpp b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Tests/SpacetimeDBBSATNTestOrg.cpp index e64359717f5..20583c7b92a 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Tests/SpacetimeDBBSATNTestOrg.cpp +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Tests/SpacetimeDBBSATNTestOrg.cpp @@ -7,36 +7,36 @@ #include "Types/LargeIntegers.h" #include "Types/Builtins.h" #include "ModuleBindings/Types/BsatnRowListType.g.h" +#include "ModuleBindings/Types/CallProcedureType.g.h" #include "ModuleBindings/Types/CallReducerType.g.h" #include "ModuleBindings/Types/ClientMessageType.g.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "ModuleBindings/Types/EnergyQuantaType.g.h" -#include "ModuleBindings/Types/IdentityTokenType.g.h" -#include "ModuleBindings/Types/InitialSubscriptionType.g.h" -#include "ModuleBindings/Types/OneOffQueryResponseType.g.h" +#include "ModuleBindings/Types/EventTableRowsType.g.h" +#include "ModuleBindings/Types/InitialConnectionType.g.h" #include "ModuleBindings/Types/OneOffQueryType.g.h" -#include "ModuleBindings/Types/OneOffTableType.g.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "ModuleBindings/Types/QueryUpdateType.g.h" -#include "ModuleBindings/Types/ReducerCallInfoType.g.h" +#include "ModuleBindings/Types/OneOffQueryResultType.g.h" +#include "ModuleBindings/Types/PersistentTableRowsType.g.h" +#include "ModuleBindings/Types/ProcedureResultType.g.h" +#include "ModuleBindings/Types/ProcedureStatusType.g.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" +#include "ModuleBindings/Types/QuerySetUpdateType.g.h" +#include "ModuleBindings/Types/ReducerOkType.g.h" +#include "ModuleBindings/Types/ReducerOutcomeType.g.h" +#include "ModuleBindings/Types/ReducerResultType.g.h" +#include "ModuleBindings/Results/SpacetimeDbSdkResultQueryRowsString.g.h" #include "ModuleBindings/Types/RowSizeHintType.g.h" #include "ModuleBindings/Types/ServerMessageType.g.h" +#include "ModuleBindings/Types/SingleTableRowsType.g.h" #include "ModuleBindings/Types/SubscribeAppliedType.g.h" -#include "ModuleBindings/Types/SubscribeMultiAppliedType.g.h" -#include "ModuleBindings/Types/SubscribeMultiType.g.h" -#include "ModuleBindings/Types/SubscribeRowsType.g.h" -#include "ModuleBindings/Types/SubscribeSingleType.g.h" #include "ModuleBindings/Types/SubscribeType.g.h" #include "ModuleBindings/Types/SubscriptionErrorType.g.h" #include "ModuleBindings/Types/TableUpdateType.g.h" -#include "ModuleBindings/Types/TransactionUpdateLightType.g.h" +#include "ModuleBindings/Types/TableUpdateRowsType.g.h" #include "ModuleBindings/Types/TransactionUpdateType.g.h" #include "ModuleBindings/Types/UnsubscribeAppliedType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiType.g.h" +#include "ModuleBindings/Types/UnsubscribeFlagsType.g.h" #include "ModuleBindings/Types/UnsubscribeType.g.h" -#include "ModuleBindings/Types/UpdateStatusType.g.h" +#include "ModuleBindings/Optionals/SpacetimeDbSdkOptionalQueryRows.g.h" // ────────────────────────────────────────────────────────────────────────────── @@ -172,279 +172,191 @@ IMPLEMENT_SIMPLE_AUTOMATION_TEST( ChartactarThingOrg.Type = OrgNpcChar; TEST_ROUNDTRIP(FCharacterThing, ChartactarThingOrg, "FCharacterThing struct with Tagged Enum"); - //Cliant API - LOG_Category("Cliant API"); - //QueryIdType - FQueryIdType QueryId; - QueryId.Id = 100; - TEST_ROUNDTRIP(FQueryIdType, QueryId, "FQueryId"); - - // SubscribeMultiType - FSubscribeMultiType SubscribeMulti; - SubscribeMulti.QueryStrings.Add("SELECT * FROM players"); - SubscribeMulti.QueryStrings.Add("SELECT * FROM guilds WHERE region = 'EU'"); - SubscribeMulti.RequestId = 500; - SubscribeMulti.QueryId = QueryId; - TEST_ROUNDTRIP(FSubscribeMultiType, SubscribeMulti, "FSubscribeMultiType"); - - // RowSizeHintType + // Client API (WS v2) + LOG_Category("Client API WS v2"); + + FQuerySetIdType QuerySetId; + QuerySetId.Id = 100; + TEST_ROUNDTRIP(FQuerySetIdType, QuerySetId, "FQuerySetIdType"); + FRowSizeHintType FixedSizeHint = FRowSizeHintType::FixedSize(static_cast(128)); TEST_ROUNDTRIP(FRowSizeHintType, FixedSizeHint, "FRowSizeHintType::FixedSize Variant"); - TArray RowOffsetsArray; // keep empty like before (or add offsets if you want) + TArray RowOffsetsArray; FRowSizeHintType RowOffsetsHint = FRowSizeHintType::RowOffsets(RowOffsetsArray); TEST_ROUNDTRIP(FRowSizeHintType, RowOffsetsHint, "FRowSizeHintType::RowOffsets Variant"); - // BsatnRowListType - FBsatnRowListType BsatnRowList; - BsatnRowList.SizeHint = FixedSizeHint; - BsatnRowList.RowsData.Init(0xAB, 10); - TEST_ROUNDTRIP(FBsatnRowListType, BsatnRowList, "FBsatnRowListType with FixedSize hint"); + FBsatnRowListType BsatnRowsFixed; + BsatnRowsFixed.SizeHint = FixedSizeHint; + BsatnRowsFixed.RowsData.Init(0xAB, 10); + TEST_ROUNDTRIP(FBsatnRowListType, BsatnRowsFixed, "FBsatnRowListType fixed"); + + FBsatnRowListType BsatnRowsOffsets; + BsatnRowsOffsets.SizeHint = RowOffsetsHint; + BsatnRowsOffsets.RowsData.Init(0xCD, 12); + TEST_ROUNDTRIP(FBsatnRowListType, BsatnRowsOffsets, "FBsatnRowListType offsets"); + + FSingleTableRowsType SingleTableRows; + SingleTableRows.Table = "PlayerStats"; + SingleTableRows.Rows = BsatnRowsFixed; + TEST_ROUNDTRIP(FSingleTableRowsType, SingleTableRows, "FSingleTableRowsType"); + + FQueryRowsType QueryRows; + QueryRows.Tables.Add(SingleTableRows); + TEST_ROUNDTRIP(FQueryRowsType, QueryRows, "FQueryRowsType"); - // CallReducerType FCallReducerType CallReducer; + CallReducer.RequestId = 200; + CallReducer.Flags = 0; CallReducer.Reducer = "MyGameReducer"; CallReducer.Args.Init(0xDE, 20); - CallReducer.RequestId = 200; - CallReducer.Flags = 0; TEST_ROUNDTRIP(FCallReducerType, CallReducer, "FCallReducerType"); - // SubscribeType + FCallProcedureType CallProcedure; + CallProcedure.RequestId = 201; + CallProcedure.Flags = 0; + CallProcedure.Procedure = "MyGameProcedure"; + CallProcedure.Args.Init(0xEF, 10); + TEST_ROUNDTRIP(FCallProcedureType, CallProcedure, "FCallProcedureType"); + FSubscribeType Subscribe; + Subscribe.RequestId = 300; + Subscribe.QuerySetId = QuerySetId; Subscribe.QueryStrings.Add("SELECT * FROM users WHERE status = 'online'"); Subscribe.QueryStrings.Add("SELECT item_name FROM inventory WHERE owner_id = 32"); - Subscribe.RequestId = 300; TEST_ROUNDTRIP(FSubscribeType, Subscribe, "FSubscribeType"); - // OneOffQueryType FOneOffQueryType OneOffQuery; - OneOffQuery.MessageId.Init(0xCC, 16); + OneOffQuery.RequestId = 301; OneOffQuery.QueryString = "SELECT * FROM game_settings"; TEST_ROUNDTRIP(FOneOffQueryType, OneOffQuery, "FOneOffQueryType"); - // SubscribeSingleType - FSubscribeSingleType SubscribeSingle; - SubscribeSingle.Query = "SELECT * FROM player_data WHERE player_id = 33"; - SubscribeSingle.RequestId = 400; - SubscribeSingle.QueryId = QueryId; - TEST_ROUNDTRIP(FSubscribeSingleType, SubscribeSingle, "FSubscribeSingleType"); - - // UnsubscribeType FUnsubscribeType Unsubscribe; Unsubscribe.RequestId = 600; - Unsubscribe.QueryId = QueryId; + Unsubscribe.QuerySetId = QuerySetId; + Unsubscribe.Flags = EUnsubscribeFlagsType::SendDroppedRows; TEST_ROUNDTRIP(FUnsubscribeType, Unsubscribe, "FUnsubscribeType"); - // UnsubscribeMultiType - FUnsubscribeMultiType UnsubscribeMulti; - UnsubscribeMulti.RequestId = 700; - UnsubscribeMulti.QueryId = QueryId; - TEST_ROUNDTRIP(FUnsubscribeMultiType, UnsubscribeMulti, "FUnsubscribeMultiType"); - - // CallReducer variant FClientMessageType ClientMessageCallReducer = FClientMessageType::CallReducer(CallReducer); TEST_ROUNDTRIP(FClientMessageType, ClientMessageCallReducer, "FClientMessageType::CallReducer Variant"); + FClientMessageType ClientMessageCallProcedure = FClientMessageType::CallProcedure(CallProcedure); + TEST_ROUNDTRIP(FClientMessageType, ClientMessageCallProcedure, "FClientMessageType::CallProcedure Variant"); FClientMessageType ClientMessageSubscribe = FClientMessageType::Subscribe(Subscribe); TEST_ROUNDTRIP(FClientMessageType, ClientMessageSubscribe, "FClientMessageType::Subscribe Variant"); FClientMessageType ClientMessageOneOffQuery = FClientMessageType::OneOffQuery(OneOffQuery); TEST_ROUNDTRIP(FClientMessageType, ClientMessageOneOffQuery, "FClientMessageType::OneOffQuery Variant"); - FClientMessageType ClientMessageSubscribeSingle = FClientMessageType::SubscribeSingle(SubscribeSingle); - TEST_ROUNDTRIP(FClientMessageType, ClientMessageSubscribeSingle, "FClientMessageType::SubscribeSingle Variant"); - FClientMessageType ClientMessageSubscribeMulti = FClientMessageType::SubscribeMulti(SubscribeMulti); - TEST_ROUNDTRIP(FClientMessageType, ClientMessageSubscribeMulti, "FClientMessageType::SubscribeMulti Variant"); FClientMessageType ClientMessageUnsubscribe = FClientMessageType::Unsubscribe(Unsubscribe); TEST_ROUNDTRIP(FClientMessageType, ClientMessageUnsubscribe, "FClientMessageType::Unsubscribe Variant"); - FClientMessageType ClientMessageUnsubscribeMulti = FClientMessageType::UnsubscribeMulti(UnsubscribeMulti); - TEST_ROUNDTRIP(FClientMessageType, ClientMessageUnsubscribeMulti, "FClientMessageType::UnsubscribeMulti Variant"); - - - // BsatnRowListType - FBsatnRowListType BsatnRowList1; - BsatnRowList1.SizeHint = FixedSizeHint; - BsatnRowList1.RowsData.Init(0xAB, 10); - TEST_ROUNDTRIP(FBsatnRowListType, BsatnRowList1, "FBsatnRowListType with FixedSize hint"); - FBsatnRowListType BsatnRowList2; - BsatnRowList2.SizeHint = RowOffsetsHint; - BsatnRowList2.RowsData.Init(0xAB, 10); - TEST_ROUNDTRIP(FBsatnRowListType, BsatnRowList2, "FBsatnRowListType with RowOffsets hint"); - - // QueryUpdateType - FQueryUpdateType QueryUpdate; - QueryUpdate.Deletes = BsatnRowList1; - QueryUpdate.Inserts = BsatnRowList2; - TEST_ROUNDTRIP(FQueryUpdateType, QueryUpdate, "FQueryUpdateType"); - - // CompressableQueryUpdateType - FCompressableQueryUpdateType UncompressedUpdate =FCompressableQueryUpdateType::Uncompressed(QueryUpdate); - TEST_ROUNDTRIP(FCompressableQueryUpdateType, UncompressedUpdate, "FCompressableQueryUpdateType::Uncompressed Variant"); - TArray BrotliData; - BrotliData.Add(0x11); - BrotliData.Add(0x22); - FCompressableQueryUpdateType BrotliUpdate =FCompressableQueryUpdateType::Brotli(BrotliData); - TEST_ROUNDTRIP(FCompressableQueryUpdateType, BrotliUpdate, "FCompressableQueryUpdateType::Brotli Variant"); - TArray GzipData; - GzipData.Add(0xA1); - GzipData.Add(0xB2); - FCompressableQueryUpdateType GzipUpdate = FCompressableQueryUpdateType::Gzip(GzipData); - TEST_ROUNDTRIP(FCompressableQueryUpdateType, GzipUpdate, "FCompressableQueryUpdateType::Gzip Variant"); - - // TableUpdateType + + FPersistentTableRowsType PersistentRows; + PersistentRows.Inserts = BsatnRowsFixed; + PersistentRows.Deletes = BsatnRowsOffsets; + TEST_ROUNDTRIP(FPersistentTableRowsType, PersistentRows, "FPersistentTableRowsType"); + + FEventTableRowsType EventRows; + EventRows.Events = BsatnRowsFixed; + TEST_ROUNDTRIP(FEventTableRowsType, EventRows, "FEventTableRowsType"); + + FTableUpdateRowsType PersistentTableUpdateRows = FTableUpdateRowsType::PersistentTable(PersistentRows); + TEST_ROUNDTRIP(FTableUpdateRowsType, PersistentTableUpdateRows, "FTableUpdateRowsType::PersistentTable"); + FTableUpdateRowsType EventTableUpdateRows = FTableUpdateRowsType::EventTable(EventRows); + TEST_ROUNDTRIP(FTableUpdateRowsType, EventTableUpdateRows, "FTableUpdateRowsType::EventTable"); + FTableUpdateType TableUpdate; - TableUpdate.TableId = 1; TableUpdate.TableName = "PlayerStats"; - TableUpdate.NumRows = 100; - TableUpdate.Updates.Add(UncompressedUpdate); - TableUpdate.Updates.Add(BrotliUpdate); - TableUpdate.Updates.Add(GzipUpdate); + TableUpdate.Rows.Add(PersistentTableUpdateRows); + TableUpdate.Rows.Add(EventTableUpdateRows); TEST_ROUNDTRIP(FTableUpdateType, TableUpdate, "FTableUpdateType"); - // DatabaseUpdateType - FDatabaseUpdateType DatabaseUpdate; - DatabaseUpdate.Tables.Add(TableUpdate); - TEST_ROUNDTRIP(FDatabaseUpdateType, DatabaseUpdate, "FDatabaseUpdateType"); - - // EnergyQuantaType - FEnergyQuantaType EnergyQuanta; - EnergyQuanta.Quanta = FSpacetimeDBUInt128(1000, 500); - TEST_ROUNDTRIP(FEnergyQuantaType, EnergyQuanta, "FEnergyQuantaType"); - - // IdentityTokenType - FIdentityTokenType IdentityToken; - IdentityToken.Identity = FSpacetimeDBIdentity(FSpacetimeDBUInt256(FSpacetimeDBUInt128(10, 9), FSpacetimeDBUInt128(8, 7))); - IdentityToken.Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; - IdentityToken.ConnectionId = FSpacetimeDBConnectionId(FSpacetimeDBUInt128(12345, 67890)); - TEST_ROUNDTRIP(FIdentityTokenType, IdentityToken, "FIdentityTokenType"); - - // InitialSubscriptionType - FInitialSubscriptionType InitialSubscription; - InitialSubscription.DatabaseUpdate = DatabaseUpdate; - InitialSubscription.RequestId = 101; - InitialSubscription.TotalHostExecutionDuration = FSpacetimeDBTimeDuration(500000); - TEST_ROUNDTRIP(FInitialSubscriptionType, InitialSubscription, "FInitialSubscriptionType"); - - - // OneOffTableType - FOneOffTableType OneOffTable; - OneOffTable.TableName = "GameScores"; - OneOffTable.Rows = BsatnRowList1; - TEST_ROUNDTRIP(FOneOffTableType, OneOffTable, "FOneOffTableType"); - - - // OneOffQueryResponseType - FOneOffQueryResponseType OneOffQueryResponse; - OneOffQueryResponse.MessageId.Init(0xDD, 16); - FSpacetimeDbSdkOptionalString SdkOptionalStringError; - SdkOptionalStringError.bHasValue = true; - SdkOptionalStringError.Value = "Error text"; - OneOffQueryResponse.Tables.Add(OneOffTable); - OneOffQueryResponse.TotalHostExecutionDuration = FSpacetimeDBTimeDuration(123456); - TEST_ROUNDTRIP(FOneOffQueryResponseType, OneOffQueryResponse, "FOneOffQueryResponseType"); - - // ReducerCallInfoType - FReducerCallInfoType ReducerCallInfo; - ReducerCallInfo.ReducerName = "UpdatePlayerScore"; - ReducerCallInfo.ReducerId = 123; - ReducerCallInfo.Args.Init(0xAB, 10); - ReducerCallInfo.RequestId = 789; - TEST_ROUNDTRIP(FReducerCallInfoType, ReducerCallInfo, "FReducerCallInfoType"); - - // UpdateStatusType - FUpdateStatusType StatusCommitted = FUpdateStatusType::Committed(DatabaseUpdate); - TEST_ROUNDTRIP(FUpdateStatusType, StatusCommitted, "FUpdateStatusType::Committed Variant"); - FString FailedMsg = TEXT("Reducer execution failed due to invalid input."); - FUpdateStatusType StatusFailed = FUpdateStatusType::Failed(FailedMsg); - TEST_ROUNDTRIP(FUpdateStatusType, StatusFailed, "FUpdateStatusType::Failed Variant"); - FSpacetimeDBUnit UnitValue{}; - FUpdateStatusType StatusOutOfEnergy = FUpdateStatusType::OutOfEnergy(UnitValue); - TEST_ROUNDTRIP(FUpdateStatusType, StatusOutOfEnergy, "FUpdateStatusType::OutOfEnergy Variant"); - - // TransactionUpdateType + FQuerySetUpdateType QuerySetUpdate; + QuerySetUpdate.QuerySetId = QuerySetId; + QuerySetUpdate.Tables.Add(TableUpdate); + TEST_ROUNDTRIP(FQuerySetUpdateType, QuerySetUpdate, "FQuerySetUpdateType"); + FTransactionUpdateType TransactionUpdate; - TransactionUpdate.Status = StatusCommitted; - TransactionUpdate.Timestamp = FSpacetimeDBTimestamp::FromFDateTime(FDateTime(2025, 6, 25, 9, 33, 0)); - TransactionUpdate.CallerIdentity = FSpacetimeDBIdentity(FSpacetimeDBUInt256(FSpacetimeDBUInt128(1, 2), FSpacetimeDBUInt128(3, 4))); - TransactionUpdate.CallerConnectionId = FSpacetimeDBConnectionId(FSpacetimeDBUInt128(98765, 43210)); - TransactionUpdate.ReducerCall = ReducerCallInfo; - TransactionUpdate.EnergyQuantaUsed = EnergyQuanta; - TransactionUpdate.TotalHostExecutionDuration = FSpacetimeDBTimeDuration(75000); + TransactionUpdate.QuerySets.Add(QuerySetUpdate); TEST_ROUNDTRIP(FTransactionUpdateType, TransactionUpdate, "FTransactionUpdateType"); - // SubscribeRowsType - FSubscribeRowsType SubscribeRows; - SubscribeRows.TableId = 10; - SubscribeRows.TableName = "ConfigData"; - SubscribeRows.TableRows = TableUpdate; - TEST_ROUNDTRIP(FSubscribeRowsType, SubscribeRows, "FSubscribeRowsType"); - - // SubscribeAppliedType FSubscribeAppliedType SubscribeApplied; SubscribeApplied.RequestId = 12345; - SubscribeApplied.TotalHostExecutionDurationMicros = 250000; - SubscribeApplied.QueryId = QueryId; - SubscribeApplied.Rows = SubscribeRows; + SubscribeApplied.QuerySetId = QuerySetId; + SubscribeApplied.Rows = QueryRows; TEST_ROUNDTRIP(FSubscribeAppliedType, SubscribeApplied, "FSubscribeAppliedType"); - // SubscribeMultiAppliedType - FSubscribeMultiAppliedType SubscribeMultiApplied; - SubscribeMultiApplied.RequestId = 54321; - SubscribeMultiApplied.TotalHostExecutionDurationMicros = 300000; - SubscribeMultiApplied.QueryId = QueryId; - SubscribeMultiApplied.Update = DatabaseUpdate; - TEST_ROUNDTRIP(FSubscribeMultiAppliedType, SubscribeMultiApplied, "FSubscribeMultiAppliedType"); + FUnsubscribeAppliedType UnsubscribeApplied; + UnsubscribeApplied.RequestId = 3000; + UnsubscribeApplied.QuerySetId = QuerySetId; + UnsubscribeApplied.Rows = FSpacetimeDbSdkOptionalQueryRows(QueryRows); + TEST_ROUNDTRIP(FUnsubscribeAppliedType, UnsubscribeApplied, "FUnsubscribeAppliedType"); - // SubscriptionErrorType FSubscriptionErrorType SubscriptionError; - SubscriptionError.TotalHostExecutionDurationMicros = 50000; SubscriptionError.RequestId = FSpacetimeDbSdkOptionalUInt32(1001); - SubscriptionError.QueryId = FSpacetimeDbSdkOptionalUInt32(201); - SubscriptionError.TableId = FSpacetimeDbSdkOptionalUInt32(301); + SubscriptionError.QuerySetId = QuerySetId; SubscriptionError.Error = "SQL syntax error in subscription query."; TEST_ROUNDTRIP(FSubscriptionErrorType, SubscriptionError, "FSubscriptionErrorType"); - // TransactionUpdateLightType - FTransactionUpdateLightType TransactionUpdateLight; - TransactionUpdateLight.RequestId = 2000; - TransactionUpdateLight.Update = DatabaseUpdate; - TEST_ROUNDTRIP(FTransactionUpdateLightType, TransactionUpdateLight, "FTransactionUpdateLightType"); - - - // UnsubscribeAppliedType - FUnsubscribeAppliedType UnsubscribeApplied; - UnsubscribeApplied.RequestId = 3000; - UnsubscribeApplied.TotalHostExecutionDurationMicros = 80000; - UnsubscribeApplied.QueryId = QueryId; - UnsubscribeApplied.Rows = SubscribeRows; - TEST_ROUNDTRIP(FUnsubscribeAppliedType, UnsubscribeApplied, "FUnsubscribeAppliedType"); - - // UnsubscribeMultiAppliedType - FUnsubscribeMultiAppliedType UnsubscribeMultiApplied; - UnsubscribeMultiApplied.RequestId = 4000; - UnsubscribeMultiApplied.TotalHostExecutionDurationMicros = 100000; - UnsubscribeMultiApplied.QueryId = QueryId; - UnsubscribeMultiApplied.Update = DatabaseUpdate; - TEST_ROUNDTRIP(FUnsubscribeMultiAppliedType, UnsubscribeMultiApplied, "FUnsubscribeMultiAppliedType"); - - - // UServerMessageType - FServerMessageType MessageInitialSubscription = FServerMessageType::InitialSubscription(InitialSubscription); - TEST_ROUNDTRIP(FServerMessageType, MessageInitialSubscription, "FServerMessageType::InitialSubscription Variant"); + FInitialConnectionType InitialConnection; + InitialConnection.Identity = FSpacetimeDBIdentity(FSpacetimeDBUInt256(FSpacetimeDBUInt128(10, 9), FSpacetimeDBUInt128(8, 7))); + InitialConnection.Token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"; + InitialConnection.ConnectionId = FSpacetimeDBConnectionId(FSpacetimeDBUInt128(12345, 67890)); + TEST_ROUNDTRIP(FInitialConnectionType, InitialConnection, "FInitialConnectionType"); + + FSpacetimeDbSdkResultQueryRowsString OneOffResult = FSpacetimeDbSdkResultQueryRowsString::Ok(QueryRows); + TEST_ROUNDTRIP(FSpacetimeDbSdkResultQueryRowsString, OneOffResult, "FSpacetimeDbSdkResultQueryRowsString::Ok"); + + FOneOffQueryResultType OneOffQueryResult; + OneOffQueryResult.RequestId = 901; + OneOffQueryResult.Result = OneOffResult; + TEST_ROUNDTRIP(FOneOffQueryResultType, OneOffQueryResult, "FOneOffQueryResultType"); + + FReducerOkType ReducerOk; + ReducerOk.RetValue.Init(0xAA, 8); + ReducerOk.TransactionUpdate = TransactionUpdate; + TEST_ROUNDTRIP(FReducerOkType, ReducerOk, "FReducerOkType"); + + FReducerOutcomeType ReducerOutcomeOk = FReducerOutcomeType::Ok(ReducerOk); + TEST_ROUNDTRIP(FReducerOutcomeType, ReducerOutcomeOk, "FReducerOutcomeType::Ok"); + TArray ReducerErrBytes; + ReducerErrBytes.Add(0x11); + ReducerErrBytes.Add(0x22); + FReducerOutcomeType ReducerOutcomeErr = FReducerOutcomeType::Err(ReducerErrBytes); + TEST_ROUNDTRIP(FReducerOutcomeType, ReducerOutcomeErr, "FReducerOutcomeType::Err"); + FReducerOutcomeType ReducerOutcomeInternal = FReducerOutcomeType::InternalError("Reducer crashed"); + TEST_ROUNDTRIP(FReducerOutcomeType, ReducerOutcomeInternal, "FReducerOutcomeType::InternalError"); + + FReducerResultType ReducerResult; + ReducerResult.RequestId = 777; + ReducerResult.Timestamp = FSpacetimeDBTimestamp::FromFDateTime(FDateTime(2025, 6, 25, 9, 33, 0)); + ReducerResult.Result = ReducerOutcomeOk; + TEST_ROUNDTRIP(FReducerResultType, ReducerResult, "FReducerResultType"); + + FProcedureStatusType ProcedureStatusReturned = FProcedureStatusType::Returned(TArray{0x10, 0x20}); + TEST_ROUNDTRIP(FProcedureStatusType, ProcedureStatusReturned, "FProcedureStatusType::Returned"); + FProcedureStatusType ProcedureStatusInternal = FProcedureStatusType::InternalError("Procedure crashed"); + TEST_ROUNDTRIP(FProcedureStatusType, ProcedureStatusInternal, "FProcedureStatusType::InternalError"); + + FProcedureResultType ProcedureResult; + ProcedureResult.Status = ProcedureStatusReturned; + ProcedureResult.Timestamp = FSpacetimeDBTimestamp::FromFDateTime(FDateTime(2025, 6, 25, 9, 35, 0)); + ProcedureResult.TotalHostExecutionDuration = FSpacetimeDBTimeDuration(75000); + ProcedureResult.RequestId = 888; + TEST_ROUNDTRIP(FProcedureResultType, ProcedureResult, "FProcedureResultType"); + + FServerMessageType MessageInitialConnection = FServerMessageType::InitialConnection(InitialConnection); + TEST_ROUNDTRIP(FServerMessageType, MessageInitialConnection, "FServerMessageType::InitialConnection Variant"); FServerMessageType MessageTransactionUpdate = FServerMessageType::TransactionUpdate(TransactionUpdate); TEST_ROUNDTRIP(FServerMessageType, MessageTransactionUpdate, "FServerMessageType::TransactionUpdate Variant"); - FServerMessageType MessageTransactionUpdateLight = FServerMessageType::TransactionUpdateLight(TransactionUpdateLight); - TEST_ROUNDTRIP(FServerMessageType, MessageTransactionUpdateLight, "FServerMessageType::TransactionUpdateLight Variant"); - FServerMessageType MessageIdentityToken = FServerMessageType::IdentityToken(IdentityToken); - TEST_ROUNDTRIP(FServerMessageType, MessageIdentityToken, "FServerMessageType::IdentityToken Variant"); - FServerMessageType MessageOneOffQueryResponse = FServerMessageType::OneOffQueryResponse(OneOffQueryResponse); - TEST_ROUNDTRIP(FServerMessageType, MessageOneOffQueryResponse, "FServerMessageType::OneOffQueryResponse Variant"); + FServerMessageType MessageOneOffQueryResult = FServerMessageType::OneOffQueryResult(OneOffQueryResult); + TEST_ROUNDTRIP(FServerMessageType, MessageOneOffQueryResult, "FServerMessageType::OneOffQueryResult Variant"); FServerMessageType MessageSubscribeApplied = FServerMessageType::SubscribeApplied(SubscribeApplied); TEST_ROUNDTRIP(FServerMessageType, MessageSubscribeApplied, "FServerMessageType::SubscribeApplied Variant"); FServerMessageType MessageUnsubscribeApplied = FServerMessageType::UnsubscribeApplied(UnsubscribeApplied); TEST_ROUNDTRIP(FServerMessageType, MessageUnsubscribeApplied, "FServerMessageType::UnsubscribeApplied Variant"); FServerMessageType MessageSubscriptionError = FServerMessageType::SubscriptionError(SubscriptionError); TEST_ROUNDTRIP(FServerMessageType, MessageSubscriptionError, "FServerMessageType::SubscriptionError Variant"); - FServerMessageType MessageSubscribeMultiApplied = FServerMessageType::SubscribeMultiApplied(SubscribeMultiApplied); - TEST_ROUNDTRIP(FServerMessageType, MessageSubscribeMultiApplied, "FServerMessageType::SubscribeMultiApplied Variant"); - FServerMessageType MessageUnsubscribeMultiApplied = FServerMessageType::UnsubscribeMultiApplied(UnsubscribeMultiApplied); - TEST_ROUNDTRIP(FServerMessageType, MessageUnsubscribeMultiApplied, "FServerMessageType::UnsubscribeMultiApplied Variant"); + FServerMessageType MessageReducerResult = FServerMessageType::ReducerResult(ReducerResult); + TEST_ROUNDTRIP(FServerMessageType, MessageReducerResult, "FServerMessageType::ReducerResult Variant"); + FServerMessageType MessageProcedureResult = FServerMessageType::ProcedureResult(ProcedureResult); + TEST_ROUNDTRIP(FServerMessageType, MessageProcedureResult, "FServerMessageType::ProcedureResult Variant"); return true; } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/BSATN/UEBSATNHelpers.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/BSATN/UEBSATNHelpers.h index b31efce382e..7d44d69c24f 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/BSATN/UEBSATNHelpers.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/BSATN/UEBSATNHelpers.h @@ -2,8 +2,7 @@ #include "CoreMinimal.h" #include "ModuleBindings/Types/TableUpdateType.g.h" -#include "ModuleBindings/Types/QueryUpdateType.g.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" +#include "ModuleBindings/Types/TableUpdateRowsType.g.h" #include "DBCache/WithBsatn.h" /** Helper utilities for working with BSATN encoded row data in Unreal. */ @@ -69,18 +68,6 @@ namespace UE::SpacetimeDB } } - /** Parse a query update into row arrays */ - template - static void ParseQueryUpdateWithBsatn( - const FQueryUpdateType& Query, - TArray>& OutInserts, - TArray>& OutDeletes) - { - // Parse inserts and deletes from the query update, retaining BSATN bytes - ParseRowListWithBsatn(Query.Inserts, OutInserts); - ParseRowListWithBsatn(Query.Deletes, OutDeletes); - } - /** Apply a table update keeping BSATN bytes */ template void ProcessTableUpdateWithBsatn( @@ -88,20 +75,24 @@ namespace UE::SpacetimeDB TArray>& Inserts, TArray>& Deletes) { - for (FCompressableQueryUpdateType CQU : TableUpdate.Updates) + for (const FTableUpdateRowsType& RowSet : TableUpdate.Rows) { - FQueryUpdateType QueryUpdate; - //Should be uncompressed at this point - if (CQU.IsUncompressed()) + if (RowSet.IsPersistentTable()) + { + const FPersistentTableRowsType Persistent = RowSet.GetAsPersistentTable(); + ParseRowListWithBsatn(Persistent.Inserts, Inserts); + ParseRowListWithBsatn(Persistent.Deletes, Deletes); + } + // Event-table rows are callback-only inserts and should not create delete paths. + else if (RowSet.IsEventTable()) { - QueryUpdate = CQU.GetAsUncompressed(); + const FEventTableRowsType EventRows = RowSet.GetAsEventTable(); + ParseRowListWithBsatn(EventRows.Events, Inserts); } else { - UE_LOG(LogTemp, Error, TEXT("Compresstion state for row in table %s not uncompressed at parsing step"), *TableUpdate.TableName); - continue; + UE_LOG(LogTemp, Warning, TEXT("Unknown row-set tag for table %s"), *TableUpdate.TableName); } - ParseQueryUpdateWithBsatn(QueryUpdate, Inserts, Deletes); } } @@ -126,7 +117,7 @@ namespace UE::SpacetimeDB public: virtual ~ITableRowDeserializer() {} /** Preprocess the table update and return a shared pointer to preprocessed data. */ - virtual TSharedPtr PreProcess(const TArray& Updates, const FString TableName) const = 0; + virtual TSharedPtr PreProcess(const TArray& RowSets, const FString TableName) const = 0; }; /** Specialization of ITableRowDeserializer for a specific row type not defined in SDK. Used to deserialize rows of a specific type from a database update. */ @@ -134,24 +125,31 @@ namespace UE::SpacetimeDB class TTableRowDeserializer : public ITableRowDeserializer { public: - virtual TSharedPtr PreProcess(const TArray& Updates, const FString TableName) const override + virtual TSharedPtr PreProcess(const TArray& RowSets, const FString TableName) const override { // Create a new preprocessed table data object for the specific row type TSharedPtr> Result = MakeShared>(); - // Process each compressable query update in the table update - for (const FCompressableQueryUpdateType& CQU : Updates) + // Process each row-set update in the table update + for (const FTableUpdateRowsType& RowSet : RowSets) { - if (!CQU.IsUncompressed()) - { - UE_LOG(LogTemp, Error, TEXT("Compresstion state for row in table %s not uncompressed at parsing step"), *TableName); - continue; + if (RowSet.IsPersistentTable()) + { + const FPersistentTableRowsType Persistent = RowSet.GetAsPersistentTable(); + ParseRowListWithBsatn(Persistent.Inserts, Result->Inserts); + ParseRowListWithBsatn(Persistent.Deletes, Result->Deletes); + } + else if (RowSet.IsEventTable()) + { + // Event rows are insert-style callback payloads only. + const FEventTableRowsType Events = RowSet.GetAsEventTable(); + ParseRowListWithBsatn(Events.Events, Result->Inserts); + } + else + { + UE_LOG(LogTemp, Warning, TEXT("Unknown row-set tag for table %s"), *TableName); } - // Get the uncompressed query update from the compressable query update - FQueryUpdateType Query = CQU.GetAsUncompressed(); - // Parse the query update into inserts and deletes, retaining BSATN bytes - ParseQueryUpdateWithBsatn(Query, Result->Inserts, Result->Deletes); } return Result; } }; -} \ No newline at end of file +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h index 3fdcba2979b..c0fa384db4f 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Callback.h @@ -1,11 +1,7 @@ #pragma once #include "CoreMinimal.h" -#include "ModuleBindings/Types/ServerMessageType.g.h" -#include "ModuleBindings/Types/TransactionUpdateType.g.h" -#include "ModuleBindings/Types/ReducerCallInfoType.g.h" -#include "ModuleBindings/Types/UpdateStatusType.g.h" -#include "ModuleBindings/Types/EnergyQuantaType.g.h" +#include "ModuleBindings/Types/ProcedureStatusType.g.h" #include "Types/Builtins.h" #include "Types/UnitType.h" #include @@ -19,6 +15,61 @@ //Forward declare class UDbConnectionBase; +/** Local reducer call metadata correlated by request_id for generated client dispatch. */ +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FReducerCallInfoType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FString ReducerName; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Args; + + FORCEINLINE bool operator==(const FReducerCallInfoType& Other) const + { + return ReducerName == Other.ReducerName && Args == Other.Args; + } + + FORCEINLINE bool operator!=(const FReducerCallInfoType& Other) const + { + return !(*this == Other); + } +}; + +FORCEINLINE uint32 GetTypeHash(const FReducerCallInfoType& ReducerCallInfo) +{ + uint32 Hash = GetTypeHash(ReducerCallInfo.ReducerName); + Hash = HashCombine(Hash, GetTypeHash(ReducerCallInfo.Args)); + return Hash; +} + +/** Local energy field used by generated reducer-event wrappers. */ +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FEnergyQuantaType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + int64 Value = 0; + + FORCEINLINE bool operator==(const FEnergyQuantaType& Other) const + { + return Value == Other.Value; + } + + FORCEINLINE bool operator!=(const FEnergyQuantaType& Other) const + { + return !(*this == Other); + } +}; + +FORCEINLINE uint32 GetTypeHash(const FEnergyQuantaType& EnergyQuanta) +{ + return GetTypeHash(EnergyQuanta.Value); +} + /** Termination status for a reducer event. */ UENUM(BlueprintType) @@ -194,6 +245,9 @@ struct SPACETIMEDBSDK_API FReducerEvent { GENERATED_BODY() + /** Request id correlated to the originating reducer call (not Blueprint-exposed). */ + uint32 RequestId = 0; + /** Timestamp for when the reducer executed */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") FSpacetimeDBTimestamp Timestamp; @@ -220,7 +274,7 @@ struct SPACETIMEDBSDK_API FReducerEvent FORCEINLINE bool operator==(const FReducerEvent& Other) const { - return Status == Other.Status && Timestamp == Other.Timestamp && CallerIdentity == Other.CallerIdentity && + return RequestId == Other.RequestId && Status == Other.Status && Timestamp == Other.Timestamp && CallerIdentity == Other.CallerIdentity && CallerConnectionId == Other.CallerConnectionId && EnergyConsumed == Other.EnergyConsumed && ReducerCall == Other.ReducerCall; } @@ -232,7 +286,8 @@ struct SPACETIMEDBSDK_API FReducerEvent FORCEINLINE uint32 GetTypeHash(const FReducerEvent& ReducerEvent) { - uint32 Hash = GetTypeHash(ReducerEvent.Status); + uint32 Hash = GetTypeHash(ReducerEvent.RequestId); + Hash = HashCombine(Hash, GetTypeHash(ReducerEvent.Status)); Hash = HashCombine(Hash, GetTypeHash(ReducerEvent.Timestamp)); Hash = HashCombine(Hash, GetTypeHash(ReducerEvent.CallerIdentity)); Hash = HashCombine(Hash, GetTypeHash(ReducerEvent.CallerConnectionId)); @@ -289,6 +344,8 @@ enum class ESpacetimeDBEventTag : uint8 UnsubscribeApplied, /** Connection lost */ Disconnected, + /** Non-reducer transaction update */ + Transaction, /** Subscription error */ SubscribeError, /** Unknown transaction type */ @@ -348,6 +405,14 @@ struct SPACETIMEDBSDK_API FSpacetimeDBEvent return Obj; } + static FSpacetimeDBEvent Transaction(const FSpacetimeDBUnit& Value) + { + FSpacetimeDBEvent Obj; + Obj.Tag = ESpacetimeDBEventTag::Transaction; + Obj.MessageData.Set(Value); + return Obj; + } + static FSpacetimeDBEvent SubscribeError(const FString& InError) { FSpacetimeDBEvent Obj; @@ -402,6 +467,13 @@ struct SPACETIMEDBSDK_API FSpacetimeDBEvent return MessageData.Get(); } + FORCEINLINE bool IsTransaction() const { return Tag == ESpacetimeDBEventTag::Transaction; } + FORCEINLINE FSpacetimeDBUnit GetAsTransaction() const + { + ensureMsgf(IsTransaction(), TEXT("MessageData does not hold Transaction!")); + return MessageData.Get(); + } + FORCEINLINE bool IsSubscribeError() const { return Tag == ESpacetimeDBEventTag::SubscribeError; } FORCEINLINE FString GetAsSubscribeError() const { @@ -437,6 +509,8 @@ struct SPACETIMEDBSDK_API FSpacetimeDBEvent return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected(); + case ESpacetimeDBEventTag::Transaction: + return GetAsTransaction() == Other.GetAsTransaction(); case ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError(); case ESpacetimeDBEventTag::UnknownTransaction: @@ -464,6 +538,7 @@ FORCEINLINE uint32 GetTypeHash(const FSpacetimeDBEvent& Event) case ESpacetimeDBEventTag::SubscribeApplied: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsSubscribeApplied())); case ESpacetimeDBEventTag::UnsubscribeApplied: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsUnsubscribeApplied())); case ESpacetimeDBEventTag::Disconnected: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsDisconnected())); + case ESpacetimeDBEventTag::Transaction: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsTransaction())); case ESpacetimeDBEventTag::SubscribeError: return HashCombine(TagHash, GetTypeHash(Event.GetAsSubscribeError())); case ESpacetimeDBEventTag::UnknownTransaction: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsUnknownTransaction())); case ESpacetimeDBEventTag::Procedure: return HashCombine(TagHash, ::GetTypeHash(Event.GetAsProcedure())); @@ -558,10 +633,8 @@ struct SPACETIMEDBSDK_API FSpacetimeDBProcedureStatus public: FSpacetimeDBProcedureStatus() = default; - // NOTE: order matches ESpacetimeDBStatusTag: Committed, Failed, OutOfEnergy // Payloads: // Returned -> FSpacetimeDBUnit - // OutOfEnergy -> FSpacetimeDBUnit // InternalError -> FString TVariant MessageData; @@ -585,22 +658,12 @@ struct SPACETIMEDBSDK_API FSpacetimeDBProcedureStatus return Obj; } - static FSpacetimeDBProcedureStatus OutOfEnergy(const FSpacetimeDBUnit& Value) - { - FSpacetimeDBProcedureStatus Obj; - Obj.Tag = EProcedureStatusTag::OutOfEnergy; - Obj.MessageData.Set(Value); - return Obj; - } - static FSpacetimeDBProcedureStatus FromStatus(const FProcedureStatusType& Value) { switch (Value.Tag) { case EProcedureStatusTag::Returned: return Returned(FSpacetimeDBUnit()); - case EProcedureStatusTag::OutOfEnergy: - return OutOfEnergy(Value.GetAsOutOfEnergy()); case EProcedureStatusTag::InternalError: return InternalError(Value.GetAsInternalError()); default: @@ -609,7 +672,6 @@ struct SPACETIMEDBSDK_API FSpacetimeDBProcedureStatus } // -- Query helpers ---------------------- FORCEINLINE bool IsReturned() const { return Tag == EProcedureStatusTag::Returned; } - FORCEINLINE bool IsOutOfEnergy() const { return Tag == EProcedureStatusTag::OutOfEnergy; } FORCEINLINE bool IsInternalError() const { return Tag == EProcedureStatusTag::InternalError; } FORCEINLINE FSpacetimeDBUnit GetAsReturned() const @@ -618,12 +680,6 @@ struct SPACETIMEDBSDK_API FSpacetimeDBProcedureStatus return MessageData.Get(); } - FORCEINLINE FSpacetimeDBUnit GetAsOutOfEnergy() const - { - ensureMsgf(IsOutOfEnergy(), TEXT("MessageData does not hold OutOfEnergy!")); - return MessageData.Get(); - } - FORCEINLINE FString GetAsInternalError() const { ensureMsgf(IsInternalError(), TEXT("MessageData does not hold InternalError!")); @@ -639,8 +695,6 @@ struct SPACETIMEDBSDK_API FSpacetimeDBProcedureStatus { case EProcedureStatusTag::Returned: return GetAsReturned() == Other.GetAsReturned(); - case EProcedureStatusTag::OutOfEnergy: - return GetAsOutOfEnergy() == Other.GetAsOutOfEnergy(); case EProcedureStatusTag::InternalError: return GetAsInternalError() == Other.GetAsInternalError(); default: @@ -658,8 +712,6 @@ FORCEINLINE uint32 GetTypeHash(const FSpacetimeDBProcedureStatus& Status) { case EProcedureStatusTag::Returned: return HashCombine(TagHash, ::GetTypeHash(Status.GetAsReturned())); - case EProcedureStatusTag::OutOfEnergy: - return HashCombine(TagHash, ::GetTypeHash(Status.GetAsOutOfEnergy())); case EProcedureStatusTag::InternalError: return HashCombine(TagHash, GetTypeHash(Status.GetAsInternalError())); default: @@ -684,21 +736,6 @@ class SPACETIMEDBSDK_API USpacetimeDBProcedureStatusBpLib : public UBlueprintFun // We don't allow the raw value to be exported as GetAsReturned() from the ProcedureEventContext. - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") - static FSpacetimeDBProcedureStatus OutOfEnergy(const FSpacetimeDBUnit& InValue) - { - return FSpacetimeDBProcedureStatus::OutOfEnergy(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static bool IsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue) { return InValue.IsOutOfEnergy(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") - static FSpacetimeDBUnit GetAsOutOfEnergy(const FSpacetimeDBProcedureStatus& InValue) - { - return InValue.GetAsOutOfEnergy(); - } - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") static FSpacetimeDBProcedureStatus InternalError(const FString& InValue) { diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h index 62caa10efa4..e8c26b3a988 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h @@ -9,11 +9,11 @@ #include "DBCache/TableAppliedDiff.h" #include "HAL/CriticalSection.h" #include "Containers/Queue.h" -#include "HAL/ThreadSafeBool.h" -#include "BSATN/UEBSATNHelpers.h" -#include "Connection/SetReducerFlags.h" -#include "Connection/Callback.h" -#include "LogCategory.h" +#include "HAL/ThreadSafeBool.h" +#include "BSATN/UEBSATNHelpers.h" +#include "Connection/Callback.h" +#include "LogCategory.h" +#include #include "DbConnectionBase.generated.h" @@ -29,7 +29,7 @@ class UProcedureCallbacks; #define UNBIND_DELEGATE_SAFE(DelegateVar, Object, ClassType, FunctionName) \ DelegateVar.Remove(Object, GET_FUNCTION_NAME_CHECKED(ClassType, FunctionName)) -/** Delegate called when the connection attempt fails. */ +/** Delegate called when the connection attempt fails. */ DECLARE_DYNAMIC_DELEGATE_OneParam( FOnConnectErrorDelegate, const FString&, ErrorMessage); @@ -42,33 +42,77 @@ DECLARE_DYNAMIC_DELEGATE_ThreeParams( const FString&, Token); /** Called when a connection closes. */ -DECLARE_DYNAMIC_DELEGATE_TwoParams( - FOnDisconnectBaseDelegate, - UDbConnectionBase*, Connection, - const FString&, Error); - - -/** Key used to index preprocessed table data without relying on row addresses */ -struct FPreprocessedTableKey -{ - uint32 TableId; - FString TableName; - - FPreprocessedTableKey() : TableId(0) {} - FPreprocessedTableKey(uint32 InId, const FString& InName) - : TableId(InId), TableName(InName) { - } - - friend bool operator==(const FPreprocessedTableKey& A, const FPreprocessedTableKey& B) - { - return A.TableId == B.TableId && A.TableName == B.TableName; - } -}; - -FORCEINLINE uint32 GetTypeHash(const FPreprocessedTableKey& Key) -{ - return HashCombine(GetTypeHash(Key.TableId), GetTypeHash(Key.TableName)); -} +DECLARE_DYNAMIC_DELEGATE_TwoParams( + FOnDisconnectBaseDelegate, + UDbConnectionBase*, Connection, + const FString&, Error); + +/** Runtime-compatible database update wrapper used by table-update pipeline. */ +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FDatabaseUpdateType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Tables; + + FORCEINLINE bool operator==(const FDatabaseUpdateType& Other) const + { + return Tables == Other.Tables; + } + + FORCEINLINE bool operator!=(const FDatabaseUpdateType& Other) const + { + return !(*this == Other); + } +}; + +FORCEINLINE uint32 GetTypeHash(const FDatabaseUpdateType& DatabaseUpdate) +{ + return GetTypeHash(DatabaseUpdate.Tables); +} + + +/** Key used to index preprocessed table data without relying on row addresses */ +struct FPreprocessedTableKey +{ + FString TableName; + + FPreprocessedTableKey() = default; + explicit FPreprocessedTableKey(const FString& InName) + : TableName(InName) { + } + + friend bool operator==(const FPreprocessedTableKey& A, const FPreprocessedTableKey& B) + { + return A.TableName == B.TableName; + } +}; + +FORCEINLINE uint32 GetTypeHash(const FPreprocessedTableKey& Key) +{ + return GetTypeHash(Key.TableName); +} + +template +struct THasOnDeleteDelegate : std::false_type +{ +}; + +template +struct THasOnDeleteDelegate> : std::true_type +{ +}; + +template +struct THasOnUpdateDelegate : std::false_type +{ +}; + +template +struct THasOnUpdateDelegate> : std::true_type +{ +}; UCLASS() class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGameObject @@ -112,12 +156,12 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam FSpacetimeDBConnectionId GetConnectionId() const; // Typed reducer call helper: hides BSATN bytes from callers. - template - void CallReducerTyped(const FString& Reducer, const ArgsStruct& Args, USetReducerFlagsBase* Flags) - { - TArray Bytes = UE::SpacetimeDB::Serialize(Args); - InternalCallReducer(Reducer, MoveTemp(Bytes), Flags); - } + template + uint32 CallReducerTyped(const FString& Reducer, const ArgsStruct& Args) + { + TArray Bytes = UE::SpacetimeDB::Serialize(Args); + return InternalCallReducer(Reducer, MoveTemp(Bytes)); + } template void CallProcedureTyped(const FString& ProcedureName, const ArgsStruct& Args, const FOnProcedureCompleteDelegate& Callback) @@ -192,12 +236,12 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam } //** Take preprocessed table row data. */ template - bool TakePreprocessedTableData(const FTableUpdateType& Update, TSharedPtr>& OutData) - { - FScopeLock Lock(&PreprocessedDataMutex); - FPreprocessedTableKey Key(Update.TableId, Update.TableName); - if (TArray>* Found = PreprocessedTableData.Find(Key)) - { + bool TakePreprocessedTableData(const FTableUpdateType& Update, TSharedPtr>& OutData) + { + FScopeLock Lock(&PreprocessedDataMutex); + FPreprocessedTableKey Key(Update.TableName); + if (TArray>* Found = PreprocessedTableData.Find(Key)) + { if (Found->Num() > 0) { OutData = StaticCastSharedPtr>((*Found)[0]); @@ -240,14 +284,16 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam virtual bool IsTickableInEditor() const override; - /** Internal handler that processes a single server message. */ - void ProcessServerMessage(const FServerMessageType& Message); - void PreProcessDatabaseUpdate(const FDatabaseUpdateType& Update); - /** Decompress and parse a raw message. */ - FServerMessageType PreProcessMessage(const TArray& Message); - bool DecompressPayload(ECompressableQueryUpdateTag Variant, const TArray& In, TArray& Out); - bool DecompressGzip(const TArray& InData, TArray& OutData); - bool DecompressBrotli(const TArray& InData, TArray& OutData); + /** Internal handler that processes a single server message. */ + void ProcessServerMessage(const FServerMessageType& Message); + void PreProcessDatabaseUpdate(const FDatabaseUpdateType& Update); + /** Decompress and parse a raw message. */ + bool PreProcessMessage(const TArray& Message, FServerMessageType& OutMessage); + bool DecompressPayload(uint8 Variant, const TArray& In, TArray& Out); + bool DecompressGzip(const TArray& InData, TArray& OutData); + bool DecompressBrotli(const TArray& InData, TArray& OutData); + void ClearPendingOperations(const FString& Reason); + void HandleProtocolViolation(const FString& ErrorMessage); /** Pending messages awaiting processing on the game thread. */ TArray PendingMessages; @@ -286,7 +332,7 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam void UnsubscribeInternal(USubscriptionHandleBase* Handle); /** Call a reducer on the connected SpacetimeDB instance. */ - void InternalCallReducer(const FString& Reducer, TArray Args, USetReducerFlagsBase* Flags); + uint32 InternalCallReducer(const FString& Reducer, TArray Args); /** Call a reducer on the connected SpacetimeDB instance. */ void InternalCallProcedure(const FString& ProcedureName, TArray Args, const FOnProcedureCompleteDelegate& Callback); @@ -316,20 +362,24 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam /** Apply updates for all registered tables using the provided context pointer */ void ApplyRegisteredTableUpdates(const FDatabaseUpdateType& Update, void* Context); - /** Called when a subscription is updated. */ - UPROPERTY() - TMap> ActiveSubscriptions; + /** Called when a subscription is updated. */ + UPROPERTY() + TMap> ActiveSubscriptions; + + /** Pending reducer call metadata keyed by request id for ReducerResult correlation. */ + UPROPERTY() + TMap PendingReducerCalls; UPROPERTY() TObjectPtr ProcedureCallbacks; - /** Get the next request id for a message. This is used to track requests and responses. */ - int32 NextRequestId; - /** Get the next subscription id for a subscription. This is used to track subscriptions and their responses. */ - int32 NextSubscriptionId; - /** Get the next request id for a message. This is used to track requests and responses. */ - int32 GetNextRequestId(); - /** Get the next subscription id for a subscription. This is used to track subscriptions and their responses. */ - int32 GetNextSubscriptionId(); + /** Get the next request id for a message. This is used to track requests and responses. */ + uint32 NextRequestId; + /** Get the next subscription id for a subscription. This is used to track subscriptions and their responses. */ + uint32 NextSubscriptionId; + /** Get the next request id for a message. This is used to track requests and responses. */ + uint32 GetNextRequestId(); + /** Get the next subscription id for a subscription. This is used to track subscriptions and their responses. */ + uint32 GetNextSubscriptionId(); /** The WebSocket manager used to connect to the server. */ UPROPERTY() @@ -355,8 +405,10 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam UPROPERTY() FSpacetimeDBConnectionId ConnectionId; - UPROPERTY() - bool bIsAutoTicking = false; + UPROPERTY() + bool bIsAutoTicking = false; + /** Guard to avoid repeatedly handling the same fatal protocol error. */ + FThreadSafeBool bProtocolViolationHandled = false; UPROPERTY() FOnConnectErrorDelegate OnConnectErrorDelegate; @@ -380,25 +432,30 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam } } - // If the table has a delete delegate, broadcast deletes - if (Table->OnDelete.IsBound()) - { - for (const TPair, RowType>& Pair : Diff.Deletes) - { - Table->OnDelete.Broadcast(Context, Pair.Value); - } - } - - // If the table has an update delegate, broadcast updates - if (Table->OnUpdate.IsBound()) - { - int32 Count = FMath::Min(Diff.UpdateDeletes.Num(), Diff.UpdateInserts.Num()); - for (int32 Index = 0; Index < Count; ++Index) - { - const RowType& OldRow = Diff.UpdateDeletes[Index]; - const RowType& NewRow = Diff.UpdateInserts[Index]; - Table->OnUpdate.Broadcast(Context, OldRow, NewRow); - } - } - } -}; + // Event tables intentionally omit delete/update delegates. + if constexpr (THasOnDeleteDelegate::value) + { + if (Table->OnDelete.IsBound()) + { + for (const TPair, RowType>& Pair : Diff.Deletes) + { + Table->OnDelete.Broadcast(Context, Pair.Value); + } + } + } + + if constexpr (THasOnUpdateDelegate::value) + { + if (Table->OnUpdate.IsBound()) + { + int32 Count = FMath::Min(Diff.UpdateDeletes.Num(), Diff.UpdateInserts.Num()); + for (int32 Index = 0; Index < Count; ++Index) + { + const RowType& OldRow = Diff.UpdateDeletes[Index]; + const RowType& NewRow = Diff.UpdateInserts[Index]; + Table->OnUpdate.Broadcast(Context, OldRow, NewRow); + } + } + } + } +}; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBuilder.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBuilder.h index 37b6c3ae76a..a828570bae1 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBuilder.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBuilder.h @@ -3,7 +3,6 @@ #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "Connection/DbConnectionBase.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" #include "DbConnectionBuilder.generated.h" UCLASS(BlueprintType) diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/README.md b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/README.md index 806c02675fa..85258bc9c36 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/README.md +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/README.md @@ -4,10 +4,9 @@ This folder contains the classes used to open and manage a connection to a Space ## Files -- `Callback.h` Defines `UStatus` and related enums used to report reducer results and statuses to the user. -- `Credentials.h` Static helper functions for persisting authentication tokens via Unreal's config system. -- `DbConnectionBase.h` Core connection object. Handles websocket events, table caches and reducer calls. Used as a base class for generated `DbConnection` class. -- `DbConnectionBuilder.h` Fluent builder used to configure a connection instance and bind event delegates. Used as a base class for generated `DbConnectionBuilder` class. -- `SetReducerFlags.h` Container for flags controlling reducer call behaviour (e.g. disabling/enabling success notifications). -- `Subscription.h` Classes for constructing and managing query subscriptions. -- `Websocket.h` Wrapper around UE's `IWebSocket` that sends/receives messages. \ No newline at end of file +- `Callback.h` � Defines `UStatus` and related enums used to report reducer results and statuses to the user. +- `Credentials.h` � Static helper functions for persisting authentication tokens via Unreal's config system. +- `DbConnectionBase.h` � Core connection object. Handles websocket events, table caches and reducer calls. Used as a base class for generated `DbConnection` class. +- `DbConnectionBuilder.h` � Fluent builder used to configure a connection instance and bind event delegates. Used as a base class for generated `DbConnectionBuilder` class. +- `Subscription.h` � Classes for constructing and managing query subscriptions. +- `Websocket.h` � Wrapper around UE's `IWebSocket` that sends/receives messages. diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/SetReducerFlags.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/SetReducerFlags.h deleted file mode 100644 index 27b8e26a93f..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/SetReducerFlags.h +++ /dev/null @@ -1,31 +0,0 @@ - -#pragma once - -#include "CoreMinimal.h" -#include "SetReducerFlags.generated.h" - - -/** Flags controlling reducer call behavior */ -UENUM(BlueprintType) -enum class ECallReducerFlags : uint8 -{ - /** Default behavior - server will send full update and success notification */ - FullUpdate UMETA(DisplayName = "FullUpdate"), - - /** Do not send success notification after reducer completes */ - NoSuccessNotify UMETA(DisplayName = "NoSuccessNotify"), -}; - -/** Container for per-reducer call flags */ -UCLASS(BlueprintType) -class SPACETIMEDBSDK_API USetReducerFlagsBase : public UObject -{ - GENERATED_BODY() - -protected: - - friend class UDbConnectionBase; - - UPROPERTY() - TMap FlagMap; -}; \ No newline at end of file diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Subscription.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Subscription.h index ba9096a22ee..18985312953 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Subscription.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Subscription.h @@ -70,7 +70,7 @@ class SPACETIMEDBSDK_API USubscriptionHandleBase : public UObject FSubscriptionEventDelegate EndDelegate; /** Identifier for this subscription */ - int32 QueryId = -1; + uint32 QuerySetId = 0; friend class USubscriptionBuilderBase; friend class UDbConnectionBase; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Websocket.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Websocket.h index 8ac2b396416..b9e6f91378d 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Websocket.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/Websocket.h @@ -1,10 +1,9 @@ #pragma once -#include "CoreMinimal.h" -#include "IWebSocket.h" -#include "ModuleBindings/Types/ServerMessageType.g.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" -#include "JsonObjectConverter.h" // for JSON debugging helpers +#include "CoreMinimal.h" +#include "IWebSocket.h" +#include "ModuleBindings/Types/ServerMessageType.g.h" +#include "JsonObjectConverter.h" // for JSON debugging helpers #include "Async/Async.h" #include "HAL/CriticalSection.h" #include "Misc/ScopeLock.h" @@ -111,13 +110,6 @@ class SPACETIMEDBSDK_API UWebsocketManager : public UObject /** Handler for socket close */ void HandleClosed(int32 StatusCode, const FString& Reason, bool bWasClean); - /** Decompresses a payload based on compression variant */ - bool DecompressPayload(ECompressableQueryUpdateTag Variant, const TArray& In, TArray& Out); - /** GZip decompression helper */ - bool DecompressGzip(const TArray& InData, TArray& OutData); - /** Brotli decompression helper */ - bool DecompressBrotli(const TArray& InData, TArray& OutData); - FString InitToken; /** Buffer used to accumulate binary fragments until a complete message @@ -172,4 +164,4 @@ static void LogAsJson(const StructType& InStruct, const TCHAR* TagName) UE_LOG(LogSpacetimeDb_Connection, Warning, TEXT("[%s] Failed to serialize object: %s"), TagName, *ObjectName); } } -} \ No newline at end of file +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalString.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalQueryRows.g.h similarity index 56% rename from sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalString.g.h rename to sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalQueryRows.g.h index 8f152dad9c3..7a26f02d506 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalString.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Optionals/SpacetimeDbSdkOptionalQueryRows.g.h @@ -4,10 +4,11 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "SpacetimeDbSdkOptionalString.g.generated.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "SpacetimeDbSdkOptionalQueryRows.g.generated.h" USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FSpacetimeDbSdkOptionalString +struct SPACETIMEDBSDK_API FSpacetimeDbSdkOptionalQueryRows { GENERATED_BODY() @@ -15,35 +16,35 @@ struct SPACETIMEDBSDK_API FSpacetimeDbSdkOptionalString bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FString Value; + FQueryRowsType Value; - FSpacetimeDbSdkOptionalString() = default; + FSpacetimeDbSdkOptionalQueryRows() = default; - explicit FSpacetimeDbSdkOptionalString(const FString& InValue) + explicit FSpacetimeDbSdkOptionalQueryRows(const FQueryRowsType& InValue) : bHasValue(true), Value(InValue) {} bool IsSet() const { return bHasValue; } void Reset() { bHasValue = false; } - FORCEINLINE bool operator==(const FSpacetimeDbSdkOptionalString& Other) const + FORCEINLINE bool operator==(const FSpacetimeDbSdkOptionalQueryRows& Other) const { if (bHasValue != Other.bHasValue) return false; return !bHasValue || Value == Other.Value; } - FORCEINLINE bool operator!=(const FSpacetimeDbSdkOptionalString& Other) const + FORCEINLINE bool operator!=(const FSpacetimeDbSdkOptionalQueryRows& Other) const { return !(*this == Other); } }; /** - * Custom hash function for FSpacetimeDbSdkOptionalString. + * Custom hash function for FSpacetimeDbSdkOptionalQueryRows. * Hashes the HasValue flag and the Value if present. - * @param Optional The FSpacetimeDbSdkOptionalString instance to hash. + * @param Optional The FSpacetimeDbSdkOptionalQueryRows instance to hash. * @return The combined hash value. */ -FORCEINLINE uint32 GetTypeHash(const FSpacetimeDbSdkOptionalString& Optional) +FORCEINLINE uint32 GetTypeHash(const FSpacetimeDbSdkOptionalQueryRows& Optional) { uint32 Hash = GetTypeHash(Optional.bHasValue); if (Optional.bHasValue) @@ -55,7 +56,7 @@ FORCEINLINE uint32 GetTypeHash(const FSpacetimeDbSdkOptionalString& Optional) namespace UE::SpacetimeDB { - UE_SPACETIMEDB_ENABLE_TARRAY(FSpacetimeDbSdkOptionalString); + UE_SPACETIMEDB_ENABLE_TARRAY(FSpacetimeDbSdkOptionalQueryRows); - UE_SPACETIMEDB_OPTIONAL(FSpacetimeDbSdkOptionalString, bHasValue, Value); + UE_SPACETIMEDB_OPTIONAL(FSpacetimeDbSdkOptionalQueryRows, bHasValue, Value); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Results/SpacetimeDbSdkResultQueryRowsString.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Results/SpacetimeDbSdkResultQueryRowsString.g.h new file mode 100644 index 00000000000..2f3d2ecb459 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Results/SpacetimeDbSdkResultQueryRowsString.g.h @@ -0,0 +1,101 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "SpacetimeDbSdkResultQueryRowsString.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FSpacetimeDbSdkResultQueryRowsString +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + bool bIsOk = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) + FQueryRowsType OkValue; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) + FString ErrValue; + + FSpacetimeDbSdkResultQueryRowsString() = default; + + static FSpacetimeDbSdkResultQueryRowsString Ok(const FQueryRowsType& InValue) + { + FSpacetimeDbSdkResultQueryRowsString Result; + Result.bIsOk = true; + Result.OkValue = InValue; + return Result; + } + + static FSpacetimeDbSdkResultQueryRowsString Err(const FString& InValue) + { + FSpacetimeDbSdkResultQueryRowsString Result; + Result.bIsOk = false; + Result.ErrValue = InValue; + return Result; + } + + bool IsOk() const { return bIsOk; } + bool IsErr() const { return !bIsOk; } + + const FQueryRowsType& GetOk() const + { + check(bIsOk); + return OkValue; + } + + const FString& GetErr() const + { + check(!bIsOk); + return ErrValue; + } + + FORCEINLINE bool operator==(const FSpacetimeDbSdkResultQueryRowsString& Other) const + { + if (bIsOk != Other.bIsOk) return false; + if (bIsOk) + { + return OkValue == Other.OkValue; + } + else + { + return ErrValue == Other.ErrValue; + } + } + + FORCEINLINE bool operator!=(const FSpacetimeDbSdkResultQueryRowsString& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FSpacetimeDbSdkResultQueryRowsString. + * Hashes the bIsOk flag and the appropriate value. + * @param Result The FSpacetimeDbSdkResultQueryRowsString instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FSpacetimeDbSdkResultQueryRowsString& Result) +{ + uint32 Hash = GetTypeHash(Result.bIsOk); + if (Result.bIsOk) + { + Hash = HashCombine(Hash, GetTypeHash(Result.OkValue)); + } + else + { + Hash = HashCombine(Hash, GetTypeHash(Result.ErrValue)); + } + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FSpacetimeDbSdkResultQueryRowsString); + + UE_SPACETIMEDB_RESULT(FSpacetimeDbSdkResultQueryRowsString, bIsOk, OkValue, ErrValue); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallProcedureType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallProcedureType.g.h index 10e8a529ba0..5584492e69f 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallProcedureType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallProcedureType.g.h @@ -11,21 +11,21 @@ struct SPACETIMEDBSDK_API FCallProcedureType { GENERATED_BODY() - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString Procedure; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Args; - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 RequestId = 0; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") uint8 Flags = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FString Procedure; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Args; + FORCEINLINE bool operator==(const FCallProcedureType& Other) const { - return Procedure == Other.Procedure && Args == Other.Args && RequestId == Other.RequestId && Flags == Other.Flags; + return RequestId == Other.RequestId && Flags == Other.Flags && Procedure == Other.Procedure && Args == Other.Args; } FORCEINLINE bool operator!=(const FCallProcedureType& Other) const @@ -42,10 +42,10 @@ struct SPACETIMEDBSDK_API FCallProcedureType */ FORCEINLINE uint32 GetTypeHash(const FCallProcedureType& CallProcedureType) { - uint32 Hash = GetTypeHash(CallProcedureType.Procedure); - Hash = HashCombine(Hash, GetTypeHash(CallProcedureType.Args)); - Hash = HashCombine(Hash, GetTypeHash(CallProcedureType.RequestId)); + uint32 Hash = GetTypeHash(CallProcedureType.RequestId); Hash = HashCombine(Hash, GetTypeHash(CallProcedureType.Flags)); + Hash = HashCombine(Hash, GetTypeHash(CallProcedureType.Procedure)); + Hash = HashCombine(Hash, GetTypeHash(CallProcedureType.Args)); return Hash; } @@ -53,5 +53,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FCallProcedureType); - UE_SPACETIMEDB_STRUCT(FCallProcedureType, Procedure, Args, RequestId, Flags); + UE_SPACETIMEDB_STRUCT(FCallProcedureType, RequestId, Flags, Procedure, Args); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallReducerType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallReducerType.g.h index c8221f41d65..da1431282d6 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallReducerType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CallReducerType.g.h @@ -11,21 +11,21 @@ struct SPACETIMEDBSDK_API FCallReducerType { GENERATED_BODY() - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString Reducer; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Args; - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 RequestId = 0; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") uint8 Flags = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FString Reducer; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Args; + FORCEINLINE bool operator==(const FCallReducerType& Other) const { - return Reducer == Other.Reducer && Args == Other.Args && RequestId == Other.RequestId && Flags == Other.Flags; + return RequestId == Other.RequestId && Flags == Other.Flags && Reducer == Other.Reducer && Args == Other.Args; } FORCEINLINE bool operator!=(const FCallReducerType& Other) const @@ -42,10 +42,10 @@ struct SPACETIMEDBSDK_API FCallReducerType */ FORCEINLINE uint32 GetTypeHash(const FCallReducerType& CallReducerType) { - uint32 Hash = GetTypeHash(CallReducerType.Reducer); - Hash = HashCombine(Hash, GetTypeHash(CallReducerType.Args)); - Hash = HashCombine(Hash, GetTypeHash(CallReducerType.RequestId)); + uint32 Hash = GetTypeHash(CallReducerType.RequestId); Hash = HashCombine(Hash, GetTypeHash(CallReducerType.Flags)); + Hash = HashCombine(Hash, GetTypeHash(CallReducerType.Reducer)); + Hash = HashCombine(Hash, GetTypeHash(CallReducerType.Args)); return Hash; } @@ -53,5 +53,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FCallReducerType); - UE_SPACETIMEDB_STRUCT(FCallReducerType, Reducer, Args, RequestId, Flags); + UE_SPACETIMEDB_STRUCT(FCallReducerType, RequestId, Flags, Reducer, Args); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ClientMessageType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ClientMessageType.g.h index bc2d3a23330..08315cfcf36 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ClientMessageType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ClientMessageType.g.h @@ -4,27 +4,21 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/SubscribeMultiType.g.h" +#include "ModuleBindings/Types/UnsubscribeType.g.h" #include "ModuleBindings/Types/CallReducerType.g.h" -#include "ModuleBindings/Types/OneOffQueryType.g.h" #include "ModuleBindings/Types/CallProcedureType.g.h" -#include "ModuleBindings/Types/UnsubscribeType.g.h" #include "ModuleBindings/Types/SubscribeType.g.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "ModuleBindings/Types/SubscribeSingleType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiType.g.h" +#include "ModuleBindings/Types/OneOffQueryType.g.h" #include "ClientMessageType.g.generated.h" UENUM(BlueprintType) enum class EClientMessageTag : uint8 { - CallReducer, Subscribe, - OneOffQuery, - SubscribeSingle, - SubscribeMulti, Unsubscribe, - UnsubscribeMulti, + OneOffQuery, + CallReducer, CallProcedure }; @@ -36,19 +30,11 @@ struct SPACETIMEDBSDK_API FClientMessageType public: FClientMessageType() = default; - TVariant MessageData; + TVariant MessageData; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") + UPROPERTY(BlueprintReadOnly) EClientMessageTag Tag = static_cast(0); - static FClientMessageType CallReducer(const FCallReducerType& Value) - { - FClientMessageType Obj; - Obj.Tag = EClientMessageTag::CallReducer; - Obj.MessageData.Set(Value); - return Obj; - } - static FClientMessageType Subscribe(const FSubscribeType& Value) { FClientMessageType Obj; @@ -57,43 +43,27 @@ struct SPACETIMEDBSDK_API FClientMessageType return Obj; } - static FClientMessageType OneOffQuery(const FOneOffQueryType& Value) - { - FClientMessageType Obj; - Obj.Tag = EClientMessageTag::OneOffQuery; - Obj.MessageData.Set(Value); - return Obj; - } - - static FClientMessageType SubscribeSingle(const FSubscribeSingleType& Value) - { - FClientMessageType Obj; - Obj.Tag = EClientMessageTag::SubscribeSingle; - Obj.MessageData.Set(Value); - return Obj; - } - - static FClientMessageType SubscribeMulti(const FSubscribeMultiType& Value) + static FClientMessageType Unsubscribe(const FUnsubscribeType& Value) { FClientMessageType Obj; - Obj.Tag = EClientMessageTag::SubscribeMulti; - Obj.MessageData.Set(Value); + Obj.Tag = EClientMessageTag::Unsubscribe; + Obj.MessageData.Set(Value); return Obj; } - static FClientMessageType Unsubscribe(const FUnsubscribeType& Value) + static FClientMessageType OneOffQuery(const FOneOffQueryType& Value) { FClientMessageType Obj; - Obj.Tag = EClientMessageTag::Unsubscribe; - Obj.MessageData.Set(Value); + Obj.Tag = EClientMessageTag::OneOffQuery; + Obj.MessageData.Set(Value); return Obj; } - static FClientMessageType UnsubscribeMulti(const FUnsubscribeMultiType& Value) + static FClientMessageType CallReducer(const FCallReducerType& Value) { FClientMessageType Obj; - Obj.Tag = EClientMessageTag::UnsubscribeMulti; - Obj.MessageData.Set(Value); + Obj.Tag = EClientMessageTag::CallReducer; + Obj.MessageData.Set(Value); return Obj; } @@ -105,14 +75,6 @@ struct SPACETIMEDBSDK_API FClientMessageType return Obj; } - FORCEINLINE bool IsCallReducer() const { return Tag == EClientMessageTag::CallReducer; } - - FORCEINLINE FCallReducerType GetAsCallReducer() const - { - ensureMsgf(IsCallReducer(), TEXT("MessageData does not hold CallReducer!")); - return MessageData.Get(); - } - FORCEINLINE bool IsSubscribe() const { return Tag == EClientMessageTag::Subscribe; } FORCEINLINE FSubscribeType GetAsSubscribe() const @@ -121,30 +83,6 @@ struct SPACETIMEDBSDK_API FClientMessageType return MessageData.Get(); } - FORCEINLINE bool IsOneOffQuery() const { return Tag == EClientMessageTag::OneOffQuery; } - - FORCEINLINE FOneOffQueryType GetAsOneOffQuery() const - { - ensureMsgf(IsOneOffQuery(), TEXT("MessageData does not hold OneOffQuery!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsSubscribeSingle() const { return Tag == EClientMessageTag::SubscribeSingle; } - - FORCEINLINE FSubscribeSingleType GetAsSubscribeSingle() const - { - ensureMsgf(IsSubscribeSingle(), TEXT("MessageData does not hold SubscribeSingle!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsSubscribeMulti() const { return Tag == EClientMessageTag::SubscribeMulti; } - - FORCEINLINE FSubscribeMultiType GetAsSubscribeMulti() const - { - ensureMsgf(IsSubscribeMulti(), TEXT("MessageData does not hold SubscribeMulti!")); - return MessageData.Get(); - } - FORCEINLINE bool IsUnsubscribe() const { return Tag == EClientMessageTag::Unsubscribe; } FORCEINLINE FUnsubscribeType GetAsUnsubscribe() const @@ -153,12 +91,20 @@ struct SPACETIMEDBSDK_API FClientMessageType return MessageData.Get(); } - FORCEINLINE bool IsUnsubscribeMulti() const { return Tag == EClientMessageTag::UnsubscribeMulti; } + FORCEINLINE bool IsOneOffQuery() const { return Tag == EClientMessageTag::OneOffQuery; } - FORCEINLINE FUnsubscribeMultiType GetAsUnsubscribeMulti() const + FORCEINLINE FOneOffQueryType GetAsOneOffQuery() const { - ensureMsgf(IsUnsubscribeMulti(), TEXT("MessageData does not hold UnsubscribeMulti!")); - return MessageData.Get(); + ensureMsgf(IsOneOffQuery(), TEXT("MessageData does not hold OneOffQuery!")); + return MessageData.Get(); + } + + FORCEINLINE bool IsCallReducer() const { return Tag == EClientMessageTag::CallReducer; } + + FORCEINLINE FCallReducerType GetAsCallReducer() const + { + ensureMsgf(IsCallReducer(), TEXT("MessageData does not hold CallReducer!")); + return MessageData.Get(); } FORCEINLINE bool IsCallProcedure() const { return Tag == EClientMessageTag::CallProcedure; } @@ -176,20 +122,14 @@ struct SPACETIMEDBSDK_API FClientMessageType switch (Tag) { - case EClientMessageTag::CallReducer: - return GetAsCallReducer() == Other.GetAsCallReducer(); case EClientMessageTag::Subscribe: return GetAsSubscribe() == Other.GetAsSubscribe(); - case EClientMessageTag::OneOffQuery: - return GetAsOneOffQuery() == Other.GetAsOneOffQuery(); - case EClientMessageTag::SubscribeSingle: - return GetAsSubscribeSingle() == Other.GetAsSubscribeSingle(); - case EClientMessageTag::SubscribeMulti: - return GetAsSubscribeMulti() == Other.GetAsSubscribeMulti(); case EClientMessageTag::Unsubscribe: return GetAsUnsubscribe() == Other.GetAsUnsubscribe(); - case EClientMessageTag::UnsubscribeMulti: - return GetAsUnsubscribeMulti() == Other.GetAsUnsubscribeMulti(); + case EClientMessageTag::OneOffQuery: + return GetAsOneOffQuery() == Other.GetAsOneOffQuery(); + case EClientMessageTag::CallReducer: + return GetAsCallReducer() == Other.GetAsCallReducer(); case EClientMessageTag::CallProcedure: return GetAsCallProcedure() == Other.GetAsCallProcedure(); default: @@ -214,13 +154,10 @@ FORCEINLINE uint32 GetTypeHash(const FClientMessageType& ClientMessage) const uint32 TagHash = GetTypeHash(static_cast(ClientMessage.Tag)); switch (ClientMessage.Tag) { - case EClientMessageTag::CallReducer: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsCallReducer())); case EClientMessageTag::Subscribe: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsSubscribe())); - case EClientMessageTag::OneOffQuery: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsOneOffQuery())); - case EClientMessageTag::SubscribeSingle: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsSubscribeSingle())); - case EClientMessageTag::SubscribeMulti: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsSubscribeMulti())); case EClientMessageTag::Unsubscribe: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsUnsubscribe())); - case EClientMessageTag::UnsubscribeMulti: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsUnsubscribeMulti())); + case EClientMessageTag::OneOffQuery: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsOneOffQuery())); + case EClientMessageTag::CallReducer: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsCallReducer())); case EClientMessageTag::CallProcedure: return HashCombine(TagHash, ::GetTypeHash(ClientMessage.GetAsCallProcedure())); default: return TagHash; } @@ -234,13 +171,10 @@ namespace UE::SpacetimeDB FClientMessageType, EClientMessageTag, MessageData, - CallReducer, FCallReducerType, Subscribe, FSubscribeType, - OneOffQuery, FOneOffQueryType, - SubscribeSingle, FSubscribeSingleType, - SubscribeMulti, FSubscribeMultiType, Unsubscribe, FUnsubscribeType, - UnsubscribeMulti, FUnsubscribeMultiType, + OneOffQuery, FOneOffQueryType, + CallReducer, FCallReducerType, CallProcedure, FCallProcedureType ); } @@ -251,21 +185,6 @@ class SPACETIMEDBSDK_API UClientMessageBpLib : public UBlueprintFunctionLibrary GENERATED_BODY() private: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType CallReducer(const FCallReducerType& InValue) - { - return FClientMessageType::CallReducer(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsCallReducer(const FClientMessageType& InValue) { return InValue.IsCallReducer(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FCallReducerType GetAsCallReducer(const FClientMessageType& InValue) - { - return InValue.GetAsCallReducer(); - } - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") static FClientMessageType Subscribe(const FSubscribeType& InValue) { @@ -282,78 +201,48 @@ class SPACETIMEDBSDK_API UClientMessageBpLib : public UBlueprintFunctionLibrary } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType OneOffQuery(const FOneOffQueryType& InValue) - { - return FClientMessageType::OneOffQuery(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsOneOffQuery(const FClientMessageType& InValue) { return InValue.IsOneOffQuery(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FOneOffQueryType GetAsOneOffQuery(const FClientMessageType& InValue) - { - return InValue.GetAsOneOffQuery(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType SubscribeSingle(const FSubscribeSingleType& InValue) - { - return FClientMessageType::SubscribeSingle(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsSubscribeSingle(const FClientMessageType& InValue) { return InValue.IsSubscribeSingle(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FSubscribeSingleType GetAsSubscribeSingle(const FClientMessageType& InValue) - { - return InValue.GetAsSubscribeSingle(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType SubscribeMulti(const FSubscribeMultiType& InValue) + static FClientMessageType Unsubscribe(const FUnsubscribeType& InValue) { - return FClientMessageType::SubscribeMulti(InValue); + return FClientMessageType::Unsubscribe(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsSubscribeMulti(const FClientMessageType& InValue) { return InValue.IsSubscribeMulti(); } + static bool IsUnsubscribe(const FClientMessageType& InValue) { return InValue.IsUnsubscribe(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FSubscribeMultiType GetAsSubscribeMulti(const FClientMessageType& InValue) + static FUnsubscribeType GetAsUnsubscribe(const FClientMessageType& InValue) { - return InValue.GetAsSubscribeMulti(); + return InValue.GetAsUnsubscribe(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType Unsubscribe(const FUnsubscribeType& InValue) + static FClientMessageType OneOffQuery(const FOneOffQueryType& InValue) { - return FClientMessageType::Unsubscribe(InValue); + return FClientMessageType::OneOffQuery(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsUnsubscribe(const FClientMessageType& InValue) { return InValue.IsUnsubscribe(); } + static bool IsOneOffQuery(const FClientMessageType& InValue) { return InValue.IsOneOffQuery(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FUnsubscribeType GetAsUnsubscribe(const FClientMessageType& InValue) + static FOneOffQueryType GetAsOneOffQuery(const FClientMessageType& InValue) { - return InValue.GetAsUnsubscribe(); + return InValue.GetAsOneOffQuery(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") - static FClientMessageType UnsubscribeMulti(const FUnsubscribeMultiType& InValue) + static FClientMessageType CallReducer(const FCallReducerType& InValue) { - return FClientMessageType::UnsubscribeMulti(InValue); + return FClientMessageType::CallReducer(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static bool IsUnsubscribeMulti(const FClientMessageType& InValue) { return InValue.IsUnsubscribeMulti(); } + static bool IsCallReducer(const FClientMessageType& InValue) { return InValue.IsCallReducer(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ClientMessage") - static FUnsubscribeMultiType GetAsUnsubscribeMulti(const FClientMessageType& InValue) + static FCallReducerType GetAsCallReducer(const FClientMessageType& InValue) { - return InValue.GetAsUnsubscribeMulti(); + return InValue.GetAsCallReducer(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ClientMessage") diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CompressableQueryUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CompressableQueryUpdateType.g.h deleted file mode 100644 index 7ffeefbd0a3..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/CompressableQueryUpdateType.g.h +++ /dev/null @@ -1,187 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryUpdateType.g.h" -#include "Kismet/BlueprintFunctionLibrary.h" -#include "CompressableQueryUpdateType.g.generated.h" - -UENUM(BlueprintType) -enum class ECompressableQueryUpdateTag : uint8 -{ - Uncompressed, - Brotli, - Gzip -}; - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FCompressableQueryUpdateType -{ - GENERATED_BODY() - -public: - FCompressableQueryUpdateType() = default; - - TVariant> MessageData; - - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - ECompressableQueryUpdateTag Tag = static_cast(0); - - static FCompressableQueryUpdateType Uncompressed(const FQueryUpdateType& Value) - { - FCompressableQueryUpdateType Obj; - Obj.Tag = ECompressableQueryUpdateTag::Uncompressed; - Obj.MessageData.Set(Value); - return Obj; - } - - static FCompressableQueryUpdateType Brotli(const TArray& Value) - { - FCompressableQueryUpdateType Obj; - Obj.Tag = ECompressableQueryUpdateTag::Brotli; - Obj.MessageData.Set>(Value); - return Obj; - } - - static FCompressableQueryUpdateType Gzip(const TArray& Value) - { - FCompressableQueryUpdateType Obj; - Obj.Tag = ECompressableQueryUpdateTag::Gzip; - Obj.MessageData.Set>(Value); - return Obj; - } - - FORCEINLINE bool IsUncompressed() const { return Tag == ECompressableQueryUpdateTag::Uncompressed; } - - FORCEINLINE FQueryUpdateType GetAsUncompressed() const - { - ensureMsgf(IsUncompressed(), TEXT("MessageData does not hold Uncompressed!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsBrotli() const { return Tag == ECompressableQueryUpdateTag::Brotli; } - - FORCEINLINE TArray GetAsBrotli() const - { - ensureMsgf(IsBrotli(), TEXT("MessageData does not hold Brotli!")); - return MessageData.Get>(); - } - - FORCEINLINE bool IsGzip() const { return Tag == ECompressableQueryUpdateTag::Gzip; } - - FORCEINLINE TArray GetAsGzip() const - { - ensureMsgf(IsGzip(), TEXT("MessageData does not hold Gzip!")); - return MessageData.Get>(); - } - - // Inline equality operators - FORCEINLINE bool operator==(const FCompressableQueryUpdateType& Other) const - { - if (Tag != Other.Tag) return false; - - switch (Tag) - { - case ECompressableQueryUpdateTag::Uncompressed: - return GetAsUncompressed() == Other.GetAsUncompressed(); - case ECompressableQueryUpdateTag::Brotli: - return GetAsBrotli() == Other.GetAsBrotli(); - case ECompressableQueryUpdateTag::Gzip: - return GetAsGzip() == Other.GetAsGzip(); - default: - return false; - } - } - - FORCEINLINE bool operator!=(const FCompressableQueryUpdateType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FCompressableQueryUpdateType. - * Combines the hashes of all fields that are compared in operator==. - * @param CompressableQueryUpdateType The FCompressableQueryUpdateType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FCompressableQueryUpdateType& CompressableQueryUpdate) -{ - const uint32 TagHash = GetTypeHash(static_cast(CompressableQueryUpdate.Tag)); - switch (CompressableQueryUpdate.Tag) - { - case ECompressableQueryUpdateTag::Uncompressed: return HashCombine(TagHash, ::GetTypeHash(CompressableQueryUpdate.GetAsUncompressed())); - case ECompressableQueryUpdateTag::Brotli: return HashCombine(TagHash, ::GetTypeHash(CompressableQueryUpdate.GetAsBrotli())); - case ECompressableQueryUpdateTag::Gzip: return HashCombine(TagHash, ::GetTypeHash(CompressableQueryUpdate.GetAsGzip())); - default: return TagHash; - } -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FCompressableQueryUpdateType); - - UE_SPACETIMEDB_TAGGED_ENUM( - FCompressableQueryUpdateType, - ECompressableQueryUpdateTag, - MessageData, - Uncompressed, FQueryUpdateType, - Brotli, TArray, - Gzip, TArray - ); -} - -UCLASS() -class SPACETIMEDBSDK_API UCompressableQueryUpdateBpLib : public UBlueprintFunctionLibrary -{ - GENERATED_BODY() - -private: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|CompressableQueryUpdate") - static FCompressableQueryUpdateType Uncompressed(const FQueryUpdateType& InValue) - { - return FCompressableQueryUpdateType::Uncompressed(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static bool IsUncompressed(const FCompressableQueryUpdateType& InValue) { return InValue.IsUncompressed(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static FQueryUpdateType GetAsUncompressed(const FCompressableQueryUpdateType& InValue) - { - return InValue.GetAsUncompressed(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|CompressableQueryUpdate") - static FCompressableQueryUpdateType Brotli(const TArray& InValue) - { - return FCompressableQueryUpdateType::Brotli(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static bool IsBrotli(const FCompressableQueryUpdateType& InValue) { return InValue.IsBrotli(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static TArray GetAsBrotli(const FCompressableQueryUpdateType& InValue) - { - return InValue.GetAsBrotli(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|CompressableQueryUpdate") - static FCompressableQueryUpdateType Gzip(const TArray& InValue) - { - return FCompressableQueryUpdateType::Gzip(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static bool IsGzip(const FCompressableQueryUpdateType& InValue) { return InValue.IsGzip(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|CompressableQueryUpdate") - static TArray GetAsGzip(const FCompressableQueryUpdateType& InValue) - { - return InValue.GetAsGzip(); - } - -}; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/DatabaseUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/DatabaseUpdateType.g.h deleted file mode 100644 index 4342fde61d0..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/DatabaseUpdateType.g.h +++ /dev/null @@ -1,46 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/TableUpdateType.g.h" -#include "DatabaseUpdateType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FDatabaseUpdateType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Tables; - - FORCEINLINE bool operator==(const FDatabaseUpdateType& Other) const - { - return Tables == Other.Tables; - } - - FORCEINLINE bool operator!=(const FDatabaseUpdateType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FDatabaseUpdateType. - * Combines the hashes of all fields that are compared in operator==. - * @param DatabaseUpdateType The FDatabaseUpdateType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FDatabaseUpdateType& DatabaseUpdateType) -{ - uint32 Hash = GetTypeHash(DatabaseUpdateType.Tables); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FDatabaseUpdateType); - - UE_SPACETIMEDB_STRUCT(FDatabaseUpdateType, Tables); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EnergyQuantaType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EnergyQuantaType.g.h deleted file mode 100644 index 3183608322f..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EnergyQuantaType.g.h +++ /dev/null @@ -1,46 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "Types/Builtins.h" -#include "EnergyQuantaType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FEnergyQuantaType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBUInt128 Quanta; - - FORCEINLINE bool operator==(const FEnergyQuantaType& Other) const - { - return Quanta == Other.Quanta; - } - - FORCEINLINE bool operator!=(const FEnergyQuantaType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FEnergyQuantaType. - * Combines the hashes of all fields that are compared in operator==. - * @param EnergyQuantaType The FEnergyQuantaType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FEnergyQuantaType& EnergyQuantaType) -{ - uint32 Hash = GetTypeHash(EnergyQuantaType.Quanta); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FEnergyQuantaType); - - UE_SPACETIMEDB_STRUCT(FEnergyQuantaType, Quanta); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EventTableRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EventTableRowsType.g.h new file mode 100644 index 00000000000..b333d4d17ff --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/EventTableRowsType.g.h @@ -0,0 +1,46 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/BsatnRowListType.g.h" +#include "EventTableRowsType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FEventTableRowsType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FBsatnRowListType Events; + + FORCEINLINE bool operator==(const FEventTableRowsType& Other) const + { + return Events == Other.Events; + } + + FORCEINLINE bool operator!=(const FEventTableRowsType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FEventTableRowsType. + * Combines the hashes of all fields that are compared in operator==. + * @param EventTableRowsType The FEventTableRowsType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FEventTableRowsType& EventTableRowsType) +{ + uint32 Hash = GetTypeHash(EventTableRowsType.Events); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FEventTableRowsType); + + UE_SPACETIMEDB_STRUCT(FEventTableRowsType, Events); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/IdentityTokenType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/IdentityTokenType.g.h deleted file mode 100644 index bc1aeac671f..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/IdentityTokenType.g.h +++ /dev/null @@ -1,54 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "Types/Builtins.h" -#include "IdentityTokenType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FIdentityTokenType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBIdentity Identity; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString Token; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBConnectionId ConnectionId; - - FORCEINLINE bool operator==(const FIdentityTokenType& Other) const - { - return Identity == Other.Identity && Token == Other.Token && ConnectionId == Other.ConnectionId; - } - - FORCEINLINE bool operator!=(const FIdentityTokenType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FIdentityTokenType. - * Combines the hashes of all fields that are compared in operator==. - * @param IdentityTokenType The FIdentityTokenType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FIdentityTokenType& IdentityTokenType) -{ - uint32 Hash = GetTypeHash(IdentityTokenType.Identity); - Hash = HashCombine(Hash, GetTypeHash(IdentityTokenType.Token)); - Hash = HashCombine(Hash, GetTypeHash(IdentityTokenType.ConnectionId)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FIdentityTokenType); - - UE_SPACETIMEDB_STRUCT(FIdentityTokenType, Identity, Token, ConnectionId); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialConnectionType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialConnectionType.g.h new file mode 100644 index 00000000000..0aaa1c010f9 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialConnectionType.g.h @@ -0,0 +1,54 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "Types/Builtins.h" +#include "InitialConnectionType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FInitialConnectionType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FSpacetimeDBIdentity Identity; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FSpacetimeDBConnectionId ConnectionId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FString Token; + + FORCEINLINE bool operator==(const FInitialConnectionType& Other) const + { + return Identity == Other.Identity && ConnectionId == Other.ConnectionId && Token == Other.Token; + } + + FORCEINLINE bool operator!=(const FInitialConnectionType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FInitialConnectionType. + * Combines the hashes of all fields that are compared in operator==. + * @param InitialConnectionType The FInitialConnectionType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FInitialConnectionType& InitialConnectionType) +{ + uint32 Hash = GetTypeHash(InitialConnectionType.Identity); + Hash = HashCombine(Hash, GetTypeHash(InitialConnectionType.ConnectionId)); + Hash = HashCombine(Hash, GetTypeHash(InitialConnectionType.Token)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FInitialConnectionType); + + UE_SPACETIMEDB_STRUCT(FInitialConnectionType, Identity, ConnectionId, Token); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialSubscriptionType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialSubscriptionType.g.h deleted file mode 100644 index 6222c3aea2c..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/InitialSubscriptionType.g.h +++ /dev/null @@ -1,55 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "Types/Builtins.h" -#include "InitialSubscriptionType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FInitialSubscriptionType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FDatabaseUpdateType DatabaseUpdate; - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBTimeDuration TotalHostExecutionDuration; - - FORCEINLINE bool operator==(const FInitialSubscriptionType& Other) const - { - return DatabaseUpdate == Other.DatabaseUpdate && RequestId == Other.RequestId && TotalHostExecutionDuration == Other.TotalHostExecutionDuration; - } - - FORCEINLINE bool operator!=(const FInitialSubscriptionType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FInitialSubscriptionType. - * Combines the hashes of all fields that are compared in operator==. - * @param InitialSubscriptionType The FInitialSubscriptionType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FInitialSubscriptionType& InitialSubscriptionType) -{ - uint32 Hash = GetTypeHash(InitialSubscriptionType.DatabaseUpdate); - Hash = HashCombine(Hash, GetTypeHash(InitialSubscriptionType.RequestId)); - Hash = HashCombine(Hash, GetTypeHash(InitialSubscriptionType.TotalHostExecutionDuration)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FInitialSubscriptionType); - - UE_SPACETIMEDB_STRUCT(FInitialSubscriptionType, DatabaseUpdate, RequestId, TotalHostExecutionDuration); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResponseType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResponseType.g.h deleted file mode 100644 index 52cf4140c6d..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResponseType.g.h +++ /dev/null @@ -1,60 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Optionals/SpacetimeDbSdkOptionalString.g.h" -#include "ModuleBindings/Types/OneOffTableType.g.h" -#include "Types/Builtins.h" -#include "OneOffQueryResponseType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FOneOffQueryResponseType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray MessageId; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDbSdkOptionalString Error; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Tables; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBTimeDuration TotalHostExecutionDuration; - - FORCEINLINE bool operator==(const FOneOffQueryResponseType& Other) const - { - return MessageId == Other.MessageId && Error == Other.Error && Tables == Other.Tables && TotalHostExecutionDuration == Other.TotalHostExecutionDuration; - } - - FORCEINLINE bool operator!=(const FOneOffQueryResponseType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FOneOffQueryResponseType. - * Combines the hashes of all fields that are compared in operator==. - * @param OneOffQueryResponseType The FOneOffQueryResponseType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FOneOffQueryResponseType& OneOffQueryResponseType) -{ - uint32 Hash = GetTypeHash(OneOffQueryResponseType.MessageId); - Hash = HashCombine(Hash, GetTypeHash(OneOffQueryResponseType.Error)); - Hash = HashCombine(Hash, GetTypeHash(OneOffQueryResponseType.Tables)); - Hash = HashCombine(Hash, GetTypeHash(OneOffQueryResponseType.TotalHostExecutionDuration)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FOneOffQueryResponseType); - - UE_SPACETIMEDB_STRUCT(FOneOffQueryResponseType, MessageId, Error, Tables, TotalHostExecutionDuration); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResultType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResultType.g.h new file mode 100644 index 00000000000..5dd4abc07cb --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryResultType.g.h @@ -0,0 +1,51 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Results/SpacetimeDbSdkResultQueryRowsString.g.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "OneOffQueryResultType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FOneOffQueryResultType +{ + GENERATED_BODY() + + // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements + uint32 RequestId = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FSpacetimeDbSdkResultQueryRowsString Result; + + FORCEINLINE bool operator==(const FOneOffQueryResultType& Other) const + { + return RequestId == Other.RequestId && Result == Other.Result; + } + + FORCEINLINE bool operator!=(const FOneOffQueryResultType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FOneOffQueryResultType. + * Combines the hashes of all fields that are compared in operator==. + * @param OneOffQueryResultType The FOneOffQueryResultType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FOneOffQueryResultType& OneOffQueryResultType) +{ + uint32 Hash = GetTypeHash(OneOffQueryResultType.RequestId); + Hash = HashCombine(Hash, GetTypeHash(OneOffQueryResultType.Result)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FOneOffQueryResultType); + + UE_SPACETIMEDB_STRUCT(FOneOffQueryResultType, RequestId, Result); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryType.g.h index f32539e1fa0..242346cefb6 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffQueryType.g.h @@ -11,15 +11,15 @@ struct SPACETIMEDBSDK_API FOneOffQueryType { GENERATED_BODY() - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray MessageId; + // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements + uint32 RequestId = 0; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") FString QueryString; FORCEINLINE bool operator==(const FOneOffQueryType& Other) const { - return MessageId == Other.MessageId && QueryString == Other.QueryString; + return RequestId == Other.RequestId && QueryString == Other.QueryString; } FORCEINLINE bool operator!=(const FOneOffQueryType& Other) const @@ -36,7 +36,7 @@ struct SPACETIMEDBSDK_API FOneOffQueryType */ FORCEINLINE uint32 GetTypeHash(const FOneOffQueryType& OneOffQueryType) { - uint32 Hash = GetTypeHash(OneOffQueryType.MessageId); + uint32 Hash = GetTypeHash(OneOffQueryType.RequestId); Hash = HashCombine(Hash, GetTypeHash(OneOffQueryType.QueryString)); return Hash; } @@ -45,5 +45,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FOneOffQueryType); - UE_SPACETIMEDB_STRUCT(FOneOffQueryType, MessageId, QueryString); + UE_SPACETIMEDB_STRUCT(FOneOffQueryType, RequestId, QueryString); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffTableType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffTableType.g.h deleted file mode 100644 index 5f4f93a2672..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/OneOffTableType.g.h +++ /dev/null @@ -1,50 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/BsatnRowListType.g.h" -#include "OneOffTableType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FOneOffTableType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString TableName; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FBsatnRowListType Rows; - - FORCEINLINE bool operator==(const FOneOffTableType& Other) const - { - return TableName == Other.TableName && Rows == Other.Rows; - } - - FORCEINLINE bool operator!=(const FOneOffTableType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FOneOffTableType. - * Combines the hashes of all fields that are compared in operator==. - * @param OneOffTableType The FOneOffTableType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FOneOffTableType& OneOffTableType) -{ - uint32 Hash = GetTypeHash(OneOffTableType.TableName); - Hash = HashCombine(Hash, GetTypeHash(OneOffTableType.Rows)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FOneOffTableType); - - UE_SPACETIMEDB_STRUCT(FOneOffTableType, TableName, Rows); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/PersistentTableRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/PersistentTableRowsType.g.h new file mode 100644 index 00000000000..062402e47ad --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/PersistentTableRowsType.g.h @@ -0,0 +1,50 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/BsatnRowListType.g.h" +#include "PersistentTableRowsType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FPersistentTableRowsType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FBsatnRowListType Inserts; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FBsatnRowListType Deletes; + + FORCEINLINE bool operator==(const FPersistentTableRowsType& Other) const + { + return Inserts == Other.Inserts && Deletes == Other.Deletes; + } + + FORCEINLINE bool operator!=(const FPersistentTableRowsType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FPersistentTableRowsType. + * Combines the hashes of all fields that are compared in operator==. + * @param PersistentTableRowsType The FPersistentTableRowsType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FPersistentTableRowsType& PersistentTableRowsType) +{ + uint32 Hash = GetTypeHash(PersistentTableRowsType.Inserts); + Hash = HashCombine(Hash, GetTypeHash(PersistentTableRowsType.Deletes)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FPersistentTableRowsType); + + UE_SPACETIMEDB_STRUCT(FPersistentTableRowsType, Inserts, Deletes); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ProcedureStatusType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ProcedureStatusType.g.h index 76ff482d388..3f3936204bc 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ProcedureStatusType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ProcedureStatusType.g.h @@ -5,14 +5,12 @@ #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" #include "Kismet/BlueprintFunctionLibrary.h" -#include "Types/UnitType.h" #include "ProcedureStatusType.g.generated.h" UENUM(BlueprintType) enum class EProcedureStatusTag : uint8 { Returned, - OutOfEnergy, InternalError }; @@ -24,9 +22,9 @@ struct SPACETIMEDBSDK_API FProcedureStatusType public: FProcedureStatusType() = default; - TVariant> MessageData; + TVariant> MessageData; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") + UPROPERTY(BlueprintReadOnly) EProcedureStatusTag Tag = static_cast(0); static FProcedureStatusType Returned(const TArray& Value) @@ -37,14 +35,6 @@ struct SPACETIMEDBSDK_API FProcedureStatusType return Obj; } - static FProcedureStatusType OutOfEnergy(const FSpacetimeDBUnit& Value) - { - FProcedureStatusType Obj; - Obj.Tag = EProcedureStatusTag::OutOfEnergy; - Obj.MessageData.Set(Value); - return Obj; - } - static FProcedureStatusType InternalError(const FString& Value) { FProcedureStatusType Obj; @@ -61,14 +51,6 @@ struct SPACETIMEDBSDK_API FProcedureStatusType return MessageData.Get>(); } - FORCEINLINE bool IsOutOfEnergy() const { return Tag == EProcedureStatusTag::OutOfEnergy; } - - FORCEINLINE FSpacetimeDBUnit GetAsOutOfEnergy() const - { - ensureMsgf(IsOutOfEnergy(), TEXT("MessageData does not hold OutOfEnergy!")); - return MessageData.Get(); - } - FORCEINLINE bool IsInternalError() const { return Tag == EProcedureStatusTag::InternalError; } FORCEINLINE FString GetAsInternalError() const @@ -86,8 +68,6 @@ struct SPACETIMEDBSDK_API FProcedureStatusType { case EProcedureStatusTag::Returned: return GetAsReturned() == Other.GetAsReturned(); - case EProcedureStatusTag::OutOfEnergy: - return GetAsOutOfEnergy() == Other.GetAsOutOfEnergy(); case EProcedureStatusTag::InternalError: return GetAsInternalError() == Other.GetAsInternalError(); default: @@ -113,7 +93,6 @@ FORCEINLINE uint32 GetTypeHash(const FProcedureStatusType& ProcedureStatus) switch (ProcedureStatus.Tag) { case EProcedureStatusTag::Returned: return HashCombine(TagHash, ::GetTypeHash(ProcedureStatus.GetAsReturned())); - case EProcedureStatusTag::OutOfEnergy: return HashCombine(TagHash, ::GetTypeHash(ProcedureStatus.GetAsOutOfEnergy())); case EProcedureStatusTag::InternalError: return HashCombine(TagHash, GetTypeHash(ProcedureStatus.GetAsInternalError())); default: return TagHash; } @@ -128,8 +107,44 @@ namespace UE::SpacetimeDB EProcedureStatusTag, MessageData, Returned, TArray, - OutOfEnergy, FSpacetimeDBUnit, InternalError, FString ); } +UCLASS() +class SPACETIMEDBSDK_API UProcedureStatusBpLib : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +private: + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") + static FProcedureStatusType Returned(const TArray& InValue) + { + return FProcedureStatusType::Returned(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") + static bool IsReturned(const FProcedureStatusType& InValue) { return InValue.IsReturned(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") + static TArray GetAsReturned(const FProcedureStatusType& InValue) + { + return InValue.GetAsReturned(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ProcedureStatus") + static FProcedureStatusType InternalError(const FString& InValue) + { + return FProcedureStatusType::InternalError(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") + static bool IsInternalError(const FProcedureStatusType& InValue) { return InValue.IsInternalError(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ProcedureStatus") + static FString GetAsInternalError(const FProcedureStatusType& InValue) + { + return InValue.GetAsInternalError(); + } + +}; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryRowsType.g.h new file mode 100644 index 00000000000..c90e50c70d0 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryRowsType.g.h @@ -0,0 +1,46 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/SingleTableRowsType.g.h" +#include "QueryRowsType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FQueryRowsType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Tables; + + FORCEINLINE bool operator==(const FQueryRowsType& Other) const + { + return Tables == Other.Tables; + } + + FORCEINLINE bool operator!=(const FQueryRowsType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FQueryRowsType. + * Combines the hashes of all fields that are compared in operator==. + * @param QueryRowsType The FQueryRowsType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FQueryRowsType& QueryRowsType) +{ + uint32 Hash = GetTypeHash(QueryRowsType.Tables); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FQueryRowsType); + + UE_SPACETIMEDB_STRUCT(FQueryRowsType, Tables); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryIdType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetIdType.g.h similarity index 53% rename from sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryIdType.g.h rename to sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetIdType.g.h index 2c5db9fbc1a..b0890f46132 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryIdType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetIdType.g.h @@ -4,42 +4,42 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "QueryIdType.g.generated.h" +#include "QuerySetIdType.g.generated.h" USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FQueryIdType +struct SPACETIMEDBSDK_API FQuerySetIdType { GENERATED_BODY() // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 Id = 0; - FORCEINLINE bool operator==(const FQueryIdType& Other) const + FORCEINLINE bool operator==(const FQuerySetIdType& Other) const { return Id == Other.Id; } - FORCEINLINE bool operator!=(const FQueryIdType& Other) const + FORCEINLINE bool operator!=(const FQuerySetIdType& Other) const { return !(*this == Other); } }; /** - * Custom hash function for FQueryIdType. + * Custom hash function for FQuerySetIdType. * Combines the hashes of all fields that are compared in operator==. - * @param QueryIdType The FQueryIdType instance to hash. + * @param QuerySetIdType The FQuerySetIdType instance to hash. * @return The combined hash value. */ -FORCEINLINE uint32 GetTypeHash(const FQueryIdType& QueryIdType) +FORCEINLINE uint32 GetTypeHash(const FQuerySetIdType& QuerySetIdType) { - uint32 Hash = GetTypeHash(QueryIdType.Id); + uint32 Hash = GetTypeHash(QuerySetIdType.Id); return Hash; } namespace UE::SpacetimeDB { - UE_SPACETIMEDB_ENABLE_TARRAY(FQueryIdType); + UE_SPACETIMEDB_ENABLE_TARRAY(FQuerySetIdType); - UE_SPACETIMEDB_STRUCT(FQueryIdType, Id); + UE_SPACETIMEDB_STRUCT(FQuerySetIdType, Id); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetUpdateType.g.h new file mode 100644 index 00000000000..6c3573697a0 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QuerySetUpdateType.g.h @@ -0,0 +1,51 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" +#include "ModuleBindings/Types/TableUpdateType.g.h" +#include "QuerySetUpdateType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FQuerySetUpdateType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FQuerySetIdType QuerySetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray Tables; + + FORCEINLINE bool operator==(const FQuerySetUpdateType& Other) const + { + return QuerySetId == Other.QuerySetId && Tables == Other.Tables; + } + + FORCEINLINE bool operator!=(const FQuerySetUpdateType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FQuerySetUpdateType. + * Combines the hashes of all fields that are compared in operator==. + * @param QuerySetUpdateType The FQuerySetUpdateType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FQuerySetUpdateType& QuerySetUpdateType) +{ + uint32 Hash = GetTypeHash(QuerySetUpdateType.QuerySetId); + Hash = HashCombine(Hash, GetTypeHash(QuerySetUpdateType.Tables)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FQuerySetUpdateType); + + UE_SPACETIMEDB_STRUCT(FQuerySetUpdateType, QuerySetId, Tables); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryUpdateType.g.h deleted file mode 100644 index d710b49a324..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/QueryUpdateType.g.h +++ /dev/null @@ -1,50 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/BsatnRowListType.g.h" -#include "QueryUpdateType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FQueryUpdateType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FBsatnRowListType Deletes; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FBsatnRowListType Inserts; - - FORCEINLINE bool operator==(const FQueryUpdateType& Other) const - { - return Deletes == Other.Deletes && Inserts == Other.Inserts; - } - - FORCEINLINE bool operator!=(const FQueryUpdateType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FQueryUpdateType. - * Combines the hashes of all fields that are compared in operator==. - * @param QueryUpdateType The FQueryUpdateType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FQueryUpdateType& QueryUpdateType) -{ - uint32 Hash = GetTypeHash(QueryUpdateType.Deletes); - Hash = HashCombine(Hash, GetTypeHash(QueryUpdateType.Inserts)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FQueryUpdateType); - - UE_SPACETIMEDB_STRUCT(FQueryUpdateType, Deletes, Inserts); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerCallInfoType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerCallInfoType.g.h deleted file mode 100644 index 8eb26e8c05c..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerCallInfoType.g.h +++ /dev/null @@ -1,57 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ReducerCallInfoType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FReducerCallInfoType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString ReducerName; - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 ReducerId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Args; - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - FORCEINLINE bool operator==(const FReducerCallInfoType& Other) const - { - return ReducerName == Other.ReducerName && ReducerId == Other.ReducerId && Args == Other.Args && RequestId == Other.RequestId; - } - - FORCEINLINE bool operator!=(const FReducerCallInfoType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FReducerCallInfoType. - * Combines the hashes of all fields that are compared in operator==. - * @param ReducerCallInfoType The FReducerCallInfoType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FReducerCallInfoType& ReducerCallInfoType) -{ - uint32 Hash = GetTypeHash(ReducerCallInfoType.ReducerName); - Hash = HashCombine(Hash, GetTypeHash(ReducerCallInfoType.ReducerId)); - Hash = HashCombine(Hash, GetTypeHash(ReducerCallInfoType.Args)); - Hash = HashCombine(Hash, GetTypeHash(ReducerCallInfoType.RequestId)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FReducerCallInfoType); - - UE_SPACETIMEDB_STRUCT(FReducerCallInfoType, ReducerName, ReducerId, Args, RequestId); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOkType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOkType.g.h new file mode 100644 index 00000000000..84e56ac72f9 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOkType.g.h @@ -0,0 +1,50 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/TransactionUpdateType.g.h" +#include "ReducerOkType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FReducerOkType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray RetValue; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FTransactionUpdateType TransactionUpdate; + + FORCEINLINE bool operator==(const FReducerOkType& Other) const + { + return RetValue == Other.RetValue && TransactionUpdate == Other.TransactionUpdate; + } + + FORCEINLINE bool operator!=(const FReducerOkType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FReducerOkType. + * Combines the hashes of all fields that are compared in operator==. + * @param ReducerOkType The FReducerOkType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FReducerOkType& ReducerOkType) +{ + uint32 Hash = GetTypeHash(ReducerOkType.RetValue); + Hash = HashCombine(Hash, GetTypeHash(ReducerOkType.TransactionUpdate)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FReducerOkType); + + UE_SPACETIMEDB_STRUCT(FReducerOkType, RetValue, TransactionUpdate); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOutcomeType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOutcomeType.g.h new file mode 100644 index 00000000000..6f52f95f93c --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerOutcomeType.g.h @@ -0,0 +1,224 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "Types/UnitType.h" +#include "ModuleBindings/Types/ReducerOkType.g.h" +#include "ReducerOutcomeType.g.generated.h" + +UENUM(BlueprintType) +enum class EReducerOutcomeTag : uint8 +{ + Ok, + OkEmpty, + Err, + InternalError +}; + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FReducerOutcomeType +{ + GENERATED_BODY() + +public: + FReducerOutcomeType() = default; + + TVariant, FSpacetimeDBUnit> MessageData; + + UPROPERTY(BlueprintReadOnly) + EReducerOutcomeTag Tag = static_cast(0); + + static FReducerOutcomeType Ok(const FReducerOkType& Value) + { + FReducerOutcomeType Obj; + Obj.Tag = EReducerOutcomeTag::Ok; + Obj.MessageData.Set(Value); + return Obj; + } + + static FReducerOutcomeType OkEmpty(const FSpacetimeDBUnit& Value) + { + FReducerOutcomeType Obj; + Obj.Tag = EReducerOutcomeTag::OkEmpty; + Obj.MessageData.Set(Value); + return Obj; + } + + static FReducerOutcomeType Err(const TArray& Value) + { + FReducerOutcomeType Obj; + Obj.Tag = EReducerOutcomeTag::Err; + Obj.MessageData.Set>(Value); + return Obj; + } + + static FReducerOutcomeType InternalError(const FString& Value) + { + FReducerOutcomeType Obj; + Obj.Tag = EReducerOutcomeTag::InternalError; + Obj.MessageData.Set(Value); + return Obj; + } + + FORCEINLINE bool IsOk() const { return Tag == EReducerOutcomeTag::Ok; } + + FORCEINLINE FReducerOkType GetAsOk() const + { + ensureMsgf(IsOk(), TEXT("MessageData does not hold Ok!")); + return MessageData.Get(); + } + + FORCEINLINE bool IsOkEmpty() const { return Tag == EReducerOutcomeTag::OkEmpty; } + + FORCEINLINE FSpacetimeDBUnit GetAsOkEmpty() const + { + ensureMsgf(IsOkEmpty(), TEXT("MessageData does not hold OkEmpty!")); + return MessageData.Get(); + } + + FORCEINLINE bool IsErr() const { return Tag == EReducerOutcomeTag::Err; } + + FORCEINLINE TArray GetAsErr() const + { + ensureMsgf(IsErr(), TEXT("MessageData does not hold Err!")); + return MessageData.Get>(); + } + + FORCEINLINE bool IsInternalError() const { return Tag == EReducerOutcomeTag::InternalError; } + + FORCEINLINE FString GetAsInternalError() const + { + ensureMsgf(IsInternalError(), TEXT("MessageData does not hold InternalError!")); + return MessageData.Get(); + } + + // Inline equality operators + FORCEINLINE bool operator==(const FReducerOutcomeType& Other) const + { + if (Tag != Other.Tag) return false; + + switch (Tag) + { + case EReducerOutcomeTag::Ok: + return GetAsOk() == Other.GetAsOk(); + case EReducerOutcomeTag::OkEmpty: + return GetAsOkEmpty() == Other.GetAsOkEmpty(); + case EReducerOutcomeTag::Err: + return GetAsErr() == Other.GetAsErr(); + case EReducerOutcomeTag::InternalError: + return GetAsInternalError() == Other.GetAsInternalError(); + default: + return false; + } + } + + FORCEINLINE bool operator!=(const FReducerOutcomeType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FReducerOutcomeType. + * Combines the hashes of all fields that are compared in operator==. + * @param ReducerOutcomeType The FReducerOutcomeType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FReducerOutcomeType& ReducerOutcome) +{ + const uint32 TagHash = GetTypeHash(static_cast(ReducerOutcome.Tag)); + switch (ReducerOutcome.Tag) + { + case EReducerOutcomeTag::Ok: return HashCombine(TagHash, ::GetTypeHash(ReducerOutcome.GetAsOk())); + case EReducerOutcomeTag::OkEmpty: return HashCombine(TagHash, ::GetTypeHash(ReducerOutcome.GetAsOkEmpty())); + case EReducerOutcomeTag::Err: return HashCombine(TagHash, ::GetTypeHash(ReducerOutcome.GetAsErr())); + case EReducerOutcomeTag::InternalError: return HashCombine(TagHash, GetTypeHash(ReducerOutcome.GetAsInternalError())); + default: return TagHash; + } +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FReducerOutcomeType); + + UE_SPACETIMEDB_TAGGED_ENUM( + FReducerOutcomeType, + EReducerOutcomeTag, + MessageData, + Ok, FReducerOkType, + OkEmpty, FSpacetimeDBUnit, + Err, TArray, + InternalError, FString + ); +} + +UCLASS() +class SPACETIMEDBSDK_API UReducerOutcomeBpLib : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +private: + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ReducerOutcome") + static FReducerOutcomeType Ok(const FReducerOkType& InValue) + { + return FReducerOutcomeType::Ok(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static bool IsOk(const FReducerOutcomeType& InValue) { return InValue.IsOk(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static FReducerOkType GetAsOk(const FReducerOutcomeType& InValue) + { + return InValue.GetAsOk(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ReducerOutcome") + static FReducerOutcomeType OkEmpty(const FSpacetimeDBUnit& InValue) + { + return FReducerOutcomeType::OkEmpty(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static bool IsOkEmpty(const FReducerOutcomeType& InValue) { return InValue.IsOkEmpty(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static FSpacetimeDBUnit GetAsOkEmpty(const FReducerOutcomeType& InValue) + { + return InValue.GetAsOkEmpty(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ReducerOutcome") + static FReducerOutcomeType Err(const TArray& InValue) + { + return FReducerOutcomeType::Err(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static bool IsErr(const FReducerOutcomeType& InValue) { return InValue.IsErr(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static TArray GetAsErr(const FReducerOutcomeType& InValue) + { + return InValue.GetAsErr(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ReducerOutcome") + static FReducerOutcomeType InternalError(const FString& InValue) + { + return FReducerOutcomeType::InternalError(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static bool IsInternalError(const FReducerOutcomeType& InValue) { return InValue.IsInternalError(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ReducerOutcome") + static FString GetAsInternalError(const FReducerOutcomeType& InValue) + { + return InValue.GetAsInternalError(); + } + +}; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerResultType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerResultType.g.h new file mode 100644 index 00000000000..415d30bb692 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ReducerResultType.g.h @@ -0,0 +1,55 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/ReducerOutcomeType.g.h" +#include "Types/Builtins.h" +#include "ReducerResultType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FReducerResultType +{ + GENERATED_BODY() + + // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements + uint32 RequestId = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FSpacetimeDBTimestamp Timestamp; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FReducerOutcomeType Result; + + FORCEINLINE bool operator==(const FReducerResultType& Other) const + { + return RequestId == Other.RequestId && Timestamp == Other.Timestamp && Result == Other.Result; + } + + FORCEINLINE bool operator!=(const FReducerResultType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FReducerResultType. + * Combines the hashes of all fields that are compared in operator==. + * @param ReducerResultType The FReducerResultType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FReducerResultType& ReducerResultType) +{ + uint32 Hash = GetTypeHash(ReducerResultType.RequestId); + Hash = HashCombine(Hash, GetTypeHash(ReducerResultType.Timestamp)); + Hash = HashCombine(Hash, GetTypeHash(ReducerResultType.Result)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FReducerResultType); + + UE_SPACETIMEDB_STRUCT(FReducerResultType, RequestId, Timestamp, Result); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/RowSizeHintType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/RowSizeHintType.g.h index 1a7fd221198..45166ef6ec0 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/RowSizeHintType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/RowSizeHintType.g.h @@ -22,9 +22,9 @@ struct SPACETIMEDBSDK_API FRowSizeHintType public: FRowSizeHintType() = default; - TVariant, uint16> MessageData; + TVariant> MessageData; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") + UPROPERTY(BlueprintReadOnly) ERowSizeHintTag Tag = static_cast(0); static FRowSizeHintType FixedSize(const uint16& Value) diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ServerMessageType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ServerMessageType.g.h index e8cb743fdbd..a53ebf9ed0e 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ServerMessageType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/ServerMessageType.g.h @@ -4,33 +4,27 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/SubscribeMultiAppliedType.g.h" -#include "ModuleBindings/Types/TransactionUpdateLightType.g.h" +#include "ModuleBindings/Types/SubscribeAppliedType.g.h" +#include "ModuleBindings/Types/SubscriptionErrorType.g.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "ModuleBindings/Types/ReducerResultType.g.h" #include "ModuleBindings/Types/TransactionUpdateType.g.h" -#include "ModuleBindings/Types/InitialSubscriptionType.g.h" #include "ModuleBindings/Types/UnsubscribeAppliedType.g.h" -#include "ModuleBindings/Types/SubscriptionErrorType.g.h" -#include "ModuleBindings/Types/OneOffQueryResponseType.g.h" -#include "ModuleBindings/Types/SubscribeAppliedType.g.h" -#include "ModuleBindings/Types/IdentityTokenType.g.h" -#include "ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h" #include "ModuleBindings/Types/ProcedureResultType.g.h" -#include "Kismet/BlueprintFunctionLibrary.h" +#include "ModuleBindings/Types/InitialConnectionType.g.h" +#include "ModuleBindings/Types/OneOffQueryResultType.g.h" #include "ServerMessageType.g.generated.h" UENUM(BlueprintType) enum class EServerMessageTag : uint8 { - InitialSubscription, - TransactionUpdate, - TransactionUpdateLight, - IdentityToken, - OneOffQueryResponse, + InitialConnection, SubscribeApplied, UnsubscribeApplied, SubscriptionError, - SubscribeMultiApplied, - UnsubscribeMultiApplied, + TransactionUpdate, + OneOffQueryResult, + ReducerResult, ProcedureResult }; @@ -42,48 +36,16 @@ struct SPACETIMEDBSDK_API FServerMessageType public: FServerMessageType() = default; - TVariant MessageData; + TVariant MessageData; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") + UPROPERTY(BlueprintReadOnly) EServerMessageTag Tag = static_cast(0); - static FServerMessageType InitialSubscription(const FInitialSubscriptionType& Value) - { - FServerMessageType Obj; - Obj.Tag = EServerMessageTag::InitialSubscription; - Obj.MessageData.Set(Value); - return Obj; - } - - static FServerMessageType TransactionUpdate(const FTransactionUpdateType& Value) - { - FServerMessageType Obj; - Obj.Tag = EServerMessageTag::TransactionUpdate; - Obj.MessageData.Set(Value); - return Obj; - } - - static FServerMessageType TransactionUpdateLight(const FTransactionUpdateLightType& Value) - { - FServerMessageType Obj; - Obj.Tag = EServerMessageTag::TransactionUpdateLight; - Obj.MessageData.Set(Value); - return Obj; - } - - static FServerMessageType IdentityToken(const FIdentityTokenType& Value) + static FServerMessageType InitialConnection(const FInitialConnectionType& Value) { FServerMessageType Obj; - Obj.Tag = EServerMessageTag::IdentityToken; - Obj.MessageData.Set(Value); - return Obj; - } - - static FServerMessageType OneOffQueryResponse(const FOneOffQueryResponseType& Value) - { - FServerMessageType Obj; - Obj.Tag = EServerMessageTag::OneOffQueryResponse; - Obj.MessageData.Set(Value); + Obj.Tag = EServerMessageTag::InitialConnection; + Obj.MessageData.Set(Value); return Obj; } @@ -111,19 +73,27 @@ struct SPACETIMEDBSDK_API FServerMessageType return Obj; } - static FServerMessageType SubscribeMultiApplied(const FSubscribeMultiAppliedType& Value) + static FServerMessageType TransactionUpdate(const FTransactionUpdateType& Value) + { + FServerMessageType Obj; + Obj.Tag = EServerMessageTag::TransactionUpdate; + Obj.MessageData.Set(Value); + return Obj; + } + + static FServerMessageType OneOffQueryResult(const FOneOffQueryResultType& Value) { FServerMessageType Obj; - Obj.Tag = EServerMessageTag::SubscribeMultiApplied; - Obj.MessageData.Set(Value); + Obj.Tag = EServerMessageTag::OneOffQueryResult; + Obj.MessageData.Set(Value); return Obj; } - static FServerMessageType UnsubscribeMultiApplied(const FUnsubscribeMultiAppliedType& Value) + static FServerMessageType ReducerResult(const FReducerResultType& Value) { FServerMessageType Obj; - Obj.Tag = EServerMessageTag::UnsubscribeMultiApplied; - Obj.MessageData.Set(Value); + Obj.Tag = EServerMessageTag::ReducerResult; + Obj.MessageData.Set(Value); return Obj; } @@ -135,44 +105,12 @@ struct SPACETIMEDBSDK_API FServerMessageType return Obj; } - FORCEINLINE bool IsInitialSubscription() const { return Tag == EServerMessageTag::InitialSubscription; } - - FORCEINLINE FInitialSubscriptionType GetAsInitialSubscription() const - { - ensureMsgf(IsInitialSubscription(), TEXT("MessageData does not hold InitialSubscription!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsTransactionUpdate() const { return Tag == EServerMessageTag::TransactionUpdate; } - - FORCEINLINE FTransactionUpdateType GetAsTransactionUpdate() const - { - ensureMsgf(IsTransactionUpdate(), TEXT("MessageData does not hold TransactionUpdate!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsTransactionUpdateLight() const { return Tag == EServerMessageTag::TransactionUpdateLight; } + FORCEINLINE bool IsInitialConnection() const { return Tag == EServerMessageTag::InitialConnection; } - FORCEINLINE FTransactionUpdateLightType GetAsTransactionUpdateLight() const + FORCEINLINE FInitialConnectionType GetAsInitialConnection() const { - ensureMsgf(IsTransactionUpdateLight(), TEXT("MessageData does not hold TransactionUpdateLight!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsIdentityToken() const { return Tag == EServerMessageTag::IdentityToken; } - - FORCEINLINE FIdentityTokenType GetAsIdentityToken() const - { - ensureMsgf(IsIdentityToken(), TEXT("MessageData does not hold IdentityToken!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsOneOffQueryResponse() const { return Tag == EServerMessageTag::OneOffQueryResponse; } - - FORCEINLINE FOneOffQueryResponseType GetAsOneOffQueryResponse() const - { - ensureMsgf(IsOneOffQueryResponse(), TEXT("MessageData does not hold OneOffQueryResponse!")); - return MessageData.Get(); + ensureMsgf(IsInitialConnection(), TEXT("MessageData does not hold InitialConnection!")); + return MessageData.Get(); } FORCEINLINE bool IsSubscribeApplied() const { return Tag == EServerMessageTag::SubscribeApplied; } @@ -199,20 +137,28 @@ struct SPACETIMEDBSDK_API FServerMessageType return MessageData.Get(); } - FORCEINLINE bool IsSubscribeMultiApplied() const { return Tag == EServerMessageTag::SubscribeMultiApplied; } + FORCEINLINE bool IsTransactionUpdate() const { return Tag == EServerMessageTag::TransactionUpdate; } - FORCEINLINE FSubscribeMultiAppliedType GetAsSubscribeMultiApplied() const + FORCEINLINE FTransactionUpdateType GetAsTransactionUpdate() const + { + ensureMsgf(IsTransactionUpdate(), TEXT("MessageData does not hold TransactionUpdate!")); + return MessageData.Get(); + } + + FORCEINLINE bool IsOneOffQueryResult() const { return Tag == EServerMessageTag::OneOffQueryResult; } + + FORCEINLINE FOneOffQueryResultType GetAsOneOffQueryResult() const { - ensureMsgf(IsSubscribeMultiApplied(), TEXT("MessageData does not hold SubscribeMultiApplied!")); - return MessageData.Get(); + ensureMsgf(IsOneOffQueryResult(), TEXT("MessageData does not hold OneOffQueryResult!")); + return MessageData.Get(); } - FORCEINLINE bool IsUnsubscribeMultiApplied() const { return Tag == EServerMessageTag::UnsubscribeMultiApplied; } + FORCEINLINE bool IsReducerResult() const { return Tag == EServerMessageTag::ReducerResult; } - FORCEINLINE FUnsubscribeMultiAppliedType GetAsUnsubscribeMultiApplied() const + FORCEINLINE FReducerResultType GetAsReducerResult() const { - ensureMsgf(IsUnsubscribeMultiApplied(), TEXT("MessageData does not hold UnsubscribeMultiApplied!")); - return MessageData.Get(); + ensureMsgf(IsReducerResult(), TEXT("MessageData does not hold ReducerResult!")); + return MessageData.Get(); } FORCEINLINE bool IsProcedureResult() const { return Tag == EServerMessageTag::ProcedureResult; } @@ -230,26 +176,20 @@ struct SPACETIMEDBSDK_API FServerMessageType switch (Tag) { - case EServerMessageTag::InitialSubscription: - return GetAsInitialSubscription() == Other.GetAsInitialSubscription(); - case EServerMessageTag::TransactionUpdate: - return GetAsTransactionUpdate() == Other.GetAsTransactionUpdate(); - case EServerMessageTag::TransactionUpdateLight: - return GetAsTransactionUpdateLight() == Other.GetAsTransactionUpdateLight(); - case EServerMessageTag::IdentityToken: - return GetAsIdentityToken() == Other.GetAsIdentityToken(); - case EServerMessageTag::OneOffQueryResponse: - return GetAsOneOffQueryResponse() == Other.GetAsOneOffQueryResponse(); + case EServerMessageTag::InitialConnection: + return GetAsInitialConnection() == Other.GetAsInitialConnection(); case EServerMessageTag::SubscribeApplied: return GetAsSubscribeApplied() == Other.GetAsSubscribeApplied(); case EServerMessageTag::UnsubscribeApplied: return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case EServerMessageTag::SubscriptionError: return GetAsSubscriptionError() == Other.GetAsSubscriptionError(); - case EServerMessageTag::SubscribeMultiApplied: - return GetAsSubscribeMultiApplied() == Other.GetAsSubscribeMultiApplied(); - case EServerMessageTag::UnsubscribeMultiApplied: - return GetAsUnsubscribeMultiApplied() == Other.GetAsUnsubscribeMultiApplied(); + case EServerMessageTag::TransactionUpdate: + return GetAsTransactionUpdate() == Other.GetAsTransactionUpdate(); + case EServerMessageTag::OneOffQueryResult: + return GetAsOneOffQueryResult() == Other.GetAsOneOffQueryResult(); + case EServerMessageTag::ReducerResult: + return GetAsReducerResult() == Other.GetAsReducerResult(); case EServerMessageTag::ProcedureResult: return GetAsProcedureResult() == Other.GetAsProcedureResult(); default: @@ -274,16 +214,13 @@ FORCEINLINE uint32 GetTypeHash(const FServerMessageType& ServerMessage) const uint32 TagHash = GetTypeHash(static_cast(ServerMessage.Tag)); switch (ServerMessage.Tag) { - case EServerMessageTag::InitialSubscription: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsInitialSubscription())); - case EServerMessageTag::TransactionUpdate: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsTransactionUpdate())); - case EServerMessageTag::TransactionUpdateLight: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsTransactionUpdateLight())); - case EServerMessageTag::IdentityToken: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsIdentityToken())); - case EServerMessageTag::OneOffQueryResponse: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsOneOffQueryResponse())); + case EServerMessageTag::InitialConnection: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsInitialConnection())); case EServerMessageTag::SubscribeApplied: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsSubscribeApplied())); case EServerMessageTag::UnsubscribeApplied: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsUnsubscribeApplied())); case EServerMessageTag::SubscriptionError: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsSubscriptionError())); - case EServerMessageTag::SubscribeMultiApplied: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsSubscribeMultiApplied())); - case EServerMessageTag::UnsubscribeMultiApplied: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsUnsubscribeMultiApplied())); + case EServerMessageTag::TransactionUpdate: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsTransactionUpdate())); + case EServerMessageTag::OneOffQueryResult: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsOneOffQueryResult())); + case EServerMessageTag::ReducerResult: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsReducerResult())); case EServerMessageTag::ProcedureResult: return HashCombine(TagHash, ::GetTypeHash(ServerMessage.GetAsProcedureResult())); default: return TagHash; } @@ -297,16 +234,13 @@ namespace UE::SpacetimeDB FServerMessageType, EServerMessageTag, MessageData, - InitialSubscription, FInitialSubscriptionType, - TransactionUpdate, FTransactionUpdateType, - TransactionUpdateLight, FTransactionUpdateLightType, - IdentityToken, FIdentityTokenType, - OneOffQueryResponse, FOneOffQueryResponseType, + InitialConnection, FInitialConnectionType, SubscribeApplied, FSubscribeAppliedType, UnsubscribeApplied, FUnsubscribeAppliedType, SubscriptionError, FSubscriptionErrorType, - SubscribeMultiApplied, FSubscribeMultiAppliedType, - UnsubscribeMultiApplied, FUnsubscribeMultiAppliedType, + TransactionUpdate, FTransactionUpdateType, + OneOffQueryResult, FOneOffQueryResultType, + ReducerResult, FReducerResultType, ProcedureResult, FProcedureResultType ); } @@ -318,78 +252,18 @@ class SPACETIMEDBSDK_API UServerMessageBpLib : public UBlueprintFunctionLibrary private: UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType InitialSubscription(const FInitialSubscriptionType& InValue) - { - return FServerMessageType::InitialSubscription(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsInitialSubscription(const FServerMessageType& InValue) { return InValue.IsInitialSubscription(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FInitialSubscriptionType GetAsInitialSubscription(const FServerMessageType& InValue) - { - return InValue.GetAsInitialSubscription(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType TransactionUpdate(const FTransactionUpdateType& InValue) + static FServerMessageType InitialConnection(const FInitialConnectionType& InValue) { - return FServerMessageType::TransactionUpdate(InValue); + return FServerMessageType::InitialConnection(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsTransactionUpdate(const FServerMessageType& InValue) { return InValue.IsTransactionUpdate(); } + static bool IsInitialConnection(const FServerMessageType& InValue) { return InValue.IsInitialConnection(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FTransactionUpdateType GetAsTransactionUpdate(const FServerMessageType& InValue) + static FInitialConnectionType GetAsInitialConnection(const FServerMessageType& InValue) { - return InValue.GetAsTransactionUpdate(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType TransactionUpdateLight(const FTransactionUpdateLightType& InValue) - { - return FServerMessageType::TransactionUpdateLight(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsTransactionUpdateLight(const FServerMessageType& InValue) { return InValue.IsTransactionUpdateLight(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FTransactionUpdateLightType GetAsTransactionUpdateLight(const FServerMessageType& InValue) - { - return InValue.GetAsTransactionUpdateLight(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType IdentityToken(const FIdentityTokenType& InValue) - { - return FServerMessageType::IdentityToken(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsIdentityToken(const FServerMessageType& InValue) { return InValue.IsIdentityToken(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FIdentityTokenType GetAsIdentityToken(const FServerMessageType& InValue) - { - return InValue.GetAsIdentityToken(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType OneOffQueryResponse(const FOneOffQueryResponseType& InValue) - { - return FServerMessageType::OneOffQueryResponse(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsOneOffQueryResponse(const FServerMessageType& InValue) { return InValue.IsOneOffQueryResponse(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FOneOffQueryResponseType GetAsOneOffQueryResponse(const FServerMessageType& InValue) - { - return InValue.GetAsOneOffQueryResponse(); + return InValue.GetAsInitialConnection(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") @@ -438,33 +312,48 @@ class SPACETIMEDBSDK_API UServerMessageBpLib : public UBlueprintFunctionLibrary } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType SubscribeMultiApplied(const FSubscribeMultiAppliedType& InValue) + static FServerMessageType TransactionUpdate(const FTransactionUpdateType& InValue) + { + return FServerMessageType::TransactionUpdate(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") + static bool IsTransactionUpdate(const FServerMessageType& InValue) { return InValue.IsTransactionUpdate(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") + static FTransactionUpdateType GetAsTransactionUpdate(const FServerMessageType& InValue) + { + return InValue.GetAsTransactionUpdate(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") + static FServerMessageType OneOffQueryResult(const FOneOffQueryResultType& InValue) { - return FServerMessageType::SubscribeMultiApplied(InValue); + return FServerMessageType::OneOffQueryResult(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsSubscribeMultiApplied(const FServerMessageType& InValue) { return InValue.IsSubscribeMultiApplied(); } + static bool IsOneOffQueryResult(const FServerMessageType& InValue) { return InValue.IsOneOffQueryResult(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FSubscribeMultiAppliedType GetAsSubscribeMultiApplied(const FServerMessageType& InValue) + static FOneOffQueryResultType GetAsOneOffQueryResult(const FServerMessageType& InValue) { - return InValue.GetAsSubscribeMultiApplied(); + return InValue.GetAsOneOffQueryResult(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") - static FServerMessageType UnsubscribeMultiApplied(const FUnsubscribeMultiAppliedType& InValue) + static FServerMessageType ReducerResult(const FReducerResultType& InValue) { - return FServerMessageType::UnsubscribeMultiApplied(InValue); + return FServerMessageType::ReducerResult(InValue); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static bool IsUnsubscribeMultiApplied(const FServerMessageType& InValue) { return InValue.IsUnsubscribeMultiApplied(); } + static bool IsReducerResult(const FServerMessageType& InValue) { return InValue.IsReducerResult(); } UFUNCTION(BlueprintPure, Category = "SpacetimeDB|ServerMessage") - static FUnsubscribeMultiAppliedType GetAsUnsubscribeMultiApplied(const FServerMessageType& InValue) + static FReducerResultType GetAsReducerResult(const FServerMessageType& InValue) { - return InValue.GetAsUnsubscribeMultiApplied(); + return InValue.GetAsReducerResult(); } UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|ServerMessage") diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SingleTableRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SingleTableRowsType.g.h new file mode 100644 index 00000000000..a1e6151fc61 --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SingleTableRowsType.g.h @@ -0,0 +1,50 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/BsatnRowListType.g.h" +#include "SingleTableRowsType.g.generated.h" + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FSingleTableRowsType +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FString Table; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FBsatnRowListType Rows; + + FORCEINLINE bool operator==(const FSingleTableRowsType& Other) const + { + return Table == Other.Table && Rows == Other.Rows; + } + + FORCEINLINE bool operator!=(const FSingleTableRowsType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FSingleTableRowsType. + * Combines the hashes of all fields that are compared in operator==. + * @param SingleTableRowsType The FSingleTableRowsType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FSingleTableRowsType& SingleTableRowsType) +{ + uint32 Hash = GetTypeHash(SingleTableRowsType.Table); + Hash = HashCombine(Hash, GetTypeHash(SingleTableRowsType.Rows)); + return Hash; +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FSingleTableRowsType); + + UE_SPACETIMEDB_STRUCT(FSingleTableRowsType, Table, Rows); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeAppliedType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeAppliedType.g.h index fcc7107e437..64636c51f09 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeAppliedType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeAppliedType.g.h @@ -4,8 +4,8 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "ModuleBindings/Types/SubscribeRowsType.g.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" #include "SubscribeAppliedType.g.generated.h" USTRUCT(BlueprintType) @@ -16,18 +16,15 @@ struct SPACETIMEDBSDK_API FSubscribeAppliedType // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 RequestId = 0; - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 TotalHostExecutionDurationMicros = 0; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; + FQuerySetIdType QuerySetId; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSubscribeRowsType Rows; + FQueryRowsType Rows; FORCEINLINE bool operator==(const FSubscribeAppliedType& Other) const { - return RequestId == Other.RequestId && TotalHostExecutionDurationMicros == Other.TotalHostExecutionDurationMicros && QueryId == Other.QueryId && Rows == Other.Rows; + return RequestId == Other.RequestId && QuerySetId == Other.QuerySetId && Rows == Other.Rows; } FORCEINLINE bool operator!=(const FSubscribeAppliedType& Other) const @@ -45,8 +42,7 @@ struct SPACETIMEDBSDK_API FSubscribeAppliedType FORCEINLINE uint32 GetTypeHash(const FSubscribeAppliedType& SubscribeAppliedType) { uint32 Hash = GetTypeHash(SubscribeAppliedType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(SubscribeAppliedType.TotalHostExecutionDurationMicros)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeAppliedType.QueryId)); + Hash = HashCombine(Hash, GetTypeHash(SubscribeAppliedType.QuerySetId)); Hash = HashCombine(Hash, GetTypeHash(SubscribeAppliedType.Rows)); return Hash; } @@ -55,5 +51,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeAppliedType); - UE_SPACETIMEDB_STRUCT(FSubscribeAppliedType, RequestId, TotalHostExecutionDurationMicros, QueryId, Rows); + UE_SPACETIMEDB_STRUCT(FSubscribeAppliedType, RequestId, QuerySetId, Rows); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiAppliedType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiAppliedType.g.h deleted file mode 100644 index b97c25dc8aa..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiAppliedType.g.h +++ /dev/null @@ -1,59 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "SubscribeMultiAppliedType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FSubscribeMultiAppliedType -{ - GENERATED_BODY() - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 TotalHostExecutionDurationMicros = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FDatabaseUpdateType Update; - - FORCEINLINE bool operator==(const FSubscribeMultiAppliedType& Other) const - { - return RequestId == Other.RequestId && TotalHostExecutionDurationMicros == Other.TotalHostExecutionDurationMicros && QueryId == Other.QueryId && Update == Other.Update; - } - - FORCEINLINE bool operator!=(const FSubscribeMultiAppliedType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FSubscribeMultiAppliedType. - * Combines the hashes of all fields that are compared in operator==. - * @param SubscribeMultiAppliedType The FSubscribeMultiAppliedType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FSubscribeMultiAppliedType& SubscribeMultiAppliedType) -{ - uint32 Hash = GetTypeHash(SubscribeMultiAppliedType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(SubscribeMultiAppliedType.TotalHostExecutionDurationMicros)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeMultiAppliedType.QueryId)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeMultiAppliedType.Update)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeMultiAppliedType); - - UE_SPACETIMEDB_STRUCT(FSubscribeMultiAppliedType, RequestId, TotalHostExecutionDurationMicros, QueryId, Update); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiType.g.h deleted file mode 100644 index 1794d8f39f0..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeMultiType.g.h +++ /dev/null @@ -1,54 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "SubscribeMultiType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FSubscribeMultiType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray QueryStrings; - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; - - FORCEINLINE bool operator==(const FSubscribeMultiType& Other) const - { - return QueryStrings == Other.QueryStrings && RequestId == Other.RequestId && QueryId == Other.QueryId; - } - - FORCEINLINE bool operator!=(const FSubscribeMultiType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FSubscribeMultiType. - * Combines the hashes of all fields that are compared in operator==. - * @param SubscribeMultiType The FSubscribeMultiType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FSubscribeMultiType& SubscribeMultiType) -{ - uint32 Hash = GetTypeHash(SubscribeMultiType.QueryStrings); - Hash = HashCombine(Hash, GetTypeHash(SubscribeMultiType.RequestId)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeMultiType.QueryId)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeMultiType); - - UE_SPACETIMEDB_STRUCT(FSubscribeMultiType, QueryStrings, RequestId, QueryId); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeRowsType.g.h deleted file mode 100644 index 70a463d2bc2..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeRowsType.g.h +++ /dev/null @@ -1,54 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/TableUpdateType.g.h" -#include "SubscribeRowsType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FSubscribeRowsType -{ - GENERATED_BODY() - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 TableId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString TableName; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FTableUpdateType TableRows; - - FORCEINLINE bool operator==(const FSubscribeRowsType& Other) const - { - return TableId == Other.TableId && TableName == Other.TableName && TableRows == Other.TableRows; - } - - FORCEINLINE bool operator!=(const FSubscribeRowsType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FSubscribeRowsType. - * Combines the hashes of all fields that are compared in operator==. - * @param SubscribeRowsType The FSubscribeRowsType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FSubscribeRowsType& SubscribeRowsType) -{ - uint32 Hash = GetTypeHash(SubscribeRowsType.TableId); - Hash = HashCombine(Hash, GetTypeHash(SubscribeRowsType.TableName)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeRowsType.TableRows)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeRowsType); - - UE_SPACETIMEDB_STRUCT(FSubscribeRowsType, TableId, TableName, TableRows); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeSingleType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeSingleType.g.h deleted file mode 100644 index 828171789bc..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeSingleType.g.h +++ /dev/null @@ -1,54 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "SubscribeSingleType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FSubscribeSingleType -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FString Query; - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; - - FORCEINLINE bool operator==(const FSubscribeSingleType& Other) const - { - return Query == Other.Query && RequestId == Other.RequestId && QueryId == Other.QueryId; - } - - FORCEINLINE bool operator!=(const FSubscribeSingleType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FSubscribeSingleType. - * Combines the hashes of all fields that are compared in operator==. - * @param SubscribeSingleType The FSubscribeSingleType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FSubscribeSingleType& SubscribeSingleType) -{ - uint32 Hash = GetTypeHash(SubscribeSingleType.Query); - Hash = HashCombine(Hash, GetTypeHash(SubscribeSingleType.RequestId)); - Hash = HashCombine(Hash, GetTypeHash(SubscribeSingleType.QueryId)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeSingleType); - - UE_SPACETIMEDB_STRUCT(FSubscribeSingleType, Query, RequestId, QueryId); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeType.g.h index a7e09710577..07487d3b347 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscribeType.g.h @@ -4,6 +4,7 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" #include "SubscribeType.g.generated.h" USTRUCT(BlueprintType) @@ -11,15 +12,18 @@ struct SPACETIMEDBSDK_API FSubscribeType { GENERATED_BODY() - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray QueryStrings; - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 RequestId = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FQuerySetIdType QuerySetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + TArray QueryStrings; + FORCEINLINE bool operator==(const FSubscribeType& Other) const { - return QueryStrings == Other.QueryStrings && RequestId == Other.RequestId; + return RequestId == Other.RequestId && QuerySetId == Other.QuerySetId && QueryStrings == Other.QueryStrings; } FORCEINLINE bool operator!=(const FSubscribeType& Other) const @@ -36,8 +40,9 @@ struct SPACETIMEDBSDK_API FSubscribeType */ FORCEINLINE uint32 GetTypeHash(const FSubscribeType& SubscribeType) { - uint32 Hash = GetTypeHash(SubscribeType.QueryStrings); - Hash = HashCombine(Hash, GetTypeHash(SubscribeType.RequestId)); + uint32 Hash = GetTypeHash(SubscribeType.RequestId); + Hash = HashCombine(Hash, GetTypeHash(SubscribeType.QuerySetId)); + Hash = HashCombine(Hash, GetTypeHash(SubscribeType.QueryStrings)); return Hash; } @@ -45,5 +50,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FSubscribeType); - UE_SPACETIMEDB_STRUCT(FSubscribeType, QueryStrings, RequestId); + UE_SPACETIMEDB_STRUCT(FSubscribeType, RequestId, QuerySetId, QueryStrings); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscriptionErrorType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscriptionErrorType.g.h index d8a9bc82066..2827ca93d46 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscriptionErrorType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/SubscriptionErrorType.g.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" #include "ModuleBindings/Optionals/SpacetimeDbSdkOptionalUInt32.g.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" #include "SubscriptionErrorType.g.generated.h" USTRUCT(BlueprintType) @@ -12,24 +13,18 @@ struct SPACETIMEDBSDK_API FSubscriptionErrorType { GENERATED_BODY() - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 TotalHostExecutionDurationMicros = 0; - // NOTE: FSpacetimeDbSdkOptionalUInt32 field not exposed to Blueprint due to non-blueprintable elements FSpacetimeDbSdkOptionalUInt32 RequestId; - // NOTE: FSpacetimeDbSdkOptionalUInt32 field not exposed to Blueprint due to non-blueprintable elements - FSpacetimeDbSdkOptionalUInt32 QueryId; - - // NOTE: FSpacetimeDbSdkOptionalUInt32 field not exposed to Blueprint due to non-blueprintable elements - FSpacetimeDbSdkOptionalUInt32 TableId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + FQuerySetIdType QuerySetId; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") FString Error; FORCEINLINE bool operator==(const FSubscriptionErrorType& Other) const { - return TotalHostExecutionDurationMicros == Other.TotalHostExecutionDurationMicros && RequestId == Other.RequestId && QueryId == Other.QueryId && TableId == Other.TableId && Error == Other.Error; + return RequestId == Other.RequestId && QuerySetId == Other.QuerySetId && Error == Other.Error; } FORCEINLINE bool operator!=(const FSubscriptionErrorType& Other) const @@ -46,10 +41,8 @@ struct SPACETIMEDBSDK_API FSubscriptionErrorType */ FORCEINLINE uint32 GetTypeHash(const FSubscriptionErrorType& SubscriptionErrorType) { - uint32 Hash = GetTypeHash(SubscriptionErrorType.TotalHostExecutionDurationMicros); - Hash = HashCombine(Hash, GetTypeHash(SubscriptionErrorType.RequestId)); - Hash = HashCombine(Hash, GetTypeHash(SubscriptionErrorType.QueryId)); - Hash = HashCombine(Hash, GetTypeHash(SubscriptionErrorType.TableId)); + uint32 Hash = GetTypeHash(SubscriptionErrorType.RequestId); + Hash = HashCombine(Hash, GetTypeHash(SubscriptionErrorType.QuerySetId)); Hash = HashCombine(Hash, GetTypeHash(SubscriptionErrorType.Error)); return Hash; } @@ -58,5 +51,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FSubscriptionErrorType); - UE_SPACETIMEDB_STRUCT(FSubscriptionErrorType, TotalHostExecutionDurationMicros, RequestId, QueryId, TableId, Error); + UE_SPACETIMEDB_STRUCT(FSubscriptionErrorType, RequestId, QuerySetId, Error); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateRowsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateRowsType.g.h new file mode 100644 index 00000000000..d4a2589a73a --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateRowsType.g.h @@ -0,0 +1,152 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "ModuleBindings/Types/PersistentTableRowsType.g.h" +#include "ModuleBindings/Types/EventTableRowsType.g.h" +#include "TableUpdateRowsType.g.generated.h" + +UENUM(BlueprintType) +enum class ETableUpdateRowsTag : uint8 +{ + PersistentTable, + EventTable +}; + +USTRUCT(BlueprintType) +struct SPACETIMEDBSDK_API FTableUpdateRowsType +{ + GENERATED_BODY() + +public: + FTableUpdateRowsType() = default; + + TVariant MessageData; + + UPROPERTY(BlueprintReadOnly) + ETableUpdateRowsTag Tag = static_cast(0); + + static FTableUpdateRowsType PersistentTable(const FPersistentTableRowsType& Value) + { + FTableUpdateRowsType Obj; + Obj.Tag = ETableUpdateRowsTag::PersistentTable; + Obj.MessageData.Set(Value); + return Obj; + } + + static FTableUpdateRowsType EventTable(const FEventTableRowsType& Value) + { + FTableUpdateRowsType Obj; + Obj.Tag = ETableUpdateRowsTag::EventTable; + Obj.MessageData.Set(Value); + return Obj; + } + + FORCEINLINE bool IsPersistentTable() const { return Tag == ETableUpdateRowsTag::PersistentTable; } + + FORCEINLINE FPersistentTableRowsType GetAsPersistentTable() const + { + ensureMsgf(IsPersistentTable(), TEXT("MessageData does not hold PersistentTable!")); + return MessageData.Get(); + } + + FORCEINLINE bool IsEventTable() const { return Tag == ETableUpdateRowsTag::EventTable; } + + FORCEINLINE FEventTableRowsType GetAsEventTable() const + { + ensureMsgf(IsEventTable(), TEXT("MessageData does not hold EventTable!")); + return MessageData.Get(); + } + + // Inline equality operators + FORCEINLINE bool operator==(const FTableUpdateRowsType& Other) const + { + if (Tag != Other.Tag) return false; + + switch (Tag) + { + case ETableUpdateRowsTag::PersistentTable: + return GetAsPersistentTable() == Other.GetAsPersistentTable(); + case ETableUpdateRowsTag::EventTable: + return GetAsEventTable() == Other.GetAsEventTable(); + default: + return false; + } + } + + FORCEINLINE bool operator!=(const FTableUpdateRowsType& Other) const + { + return !(*this == Other); + } +}; + +/** + * Custom hash function for FTableUpdateRowsType. + * Combines the hashes of all fields that are compared in operator==. + * @param TableUpdateRowsType The FTableUpdateRowsType instance to hash. + * @return The combined hash value. + */ +FORCEINLINE uint32 GetTypeHash(const FTableUpdateRowsType& TableUpdateRows) +{ + const uint32 TagHash = GetTypeHash(static_cast(TableUpdateRows.Tag)); + switch (TableUpdateRows.Tag) + { + case ETableUpdateRowsTag::PersistentTable: return HashCombine(TagHash, ::GetTypeHash(TableUpdateRows.GetAsPersistentTable())); + case ETableUpdateRowsTag::EventTable: return HashCombine(TagHash, ::GetTypeHash(TableUpdateRows.GetAsEventTable())); + default: return TagHash; + } +} + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(FTableUpdateRowsType); + + UE_SPACETIMEDB_TAGGED_ENUM( + FTableUpdateRowsType, + ETableUpdateRowsTag, + MessageData, + PersistentTable, FPersistentTableRowsType, + EventTable, FEventTableRowsType + ); +} + +UCLASS() +class SPACETIMEDBSDK_API UTableUpdateRowsBpLib : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + +private: + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TableUpdateRows") + static FTableUpdateRowsType PersistentTable(const FPersistentTableRowsType& InValue) + { + return FTableUpdateRowsType::PersistentTable(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TableUpdateRows") + static bool IsPersistentTable(const FTableUpdateRowsType& InValue) { return InValue.IsPersistentTable(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TableUpdateRows") + static FPersistentTableRowsType GetAsPersistentTable(const FTableUpdateRowsType& InValue) + { + return InValue.GetAsPersistentTable(); + } + + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TableUpdateRows") + static FTableUpdateRowsType EventTable(const FEventTableRowsType& InValue) + { + return FTableUpdateRowsType::EventTable(InValue); + } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TableUpdateRows") + static bool IsEventTable(const FTableUpdateRowsType& InValue) { return InValue.IsEventTable(); } + + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TableUpdateRows") + static FEventTableRowsType GetAsEventTable(const FTableUpdateRowsType& InValue) + { + return InValue.GetAsEventTable(); + } + +}; diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateType.g.h index 029c672e60f..25be9117a8a 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TableUpdateType.g.h @@ -4,7 +4,7 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/CompressableQueryUpdateType.g.h" +#include "ModuleBindings/Types/TableUpdateRowsType.g.h" #include "TableUpdateType.g.generated.h" USTRUCT(BlueprintType) @@ -12,21 +12,15 @@ struct SPACETIMEDBSDK_API FTableUpdateType { GENERATED_BODY() - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 TableId = 0; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") FString TableName; - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 NumRows = 0; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - TArray Updates; + TArray Rows; FORCEINLINE bool operator==(const FTableUpdateType& Other) const { - return TableId == Other.TableId && TableName == Other.TableName && NumRows == Other.NumRows && Updates == Other.Updates; + return TableName == Other.TableName && Rows == Other.Rows; } FORCEINLINE bool operator!=(const FTableUpdateType& Other) const @@ -43,10 +37,8 @@ struct SPACETIMEDBSDK_API FTableUpdateType */ FORCEINLINE uint32 GetTypeHash(const FTableUpdateType& TableUpdateType) { - uint32 Hash = GetTypeHash(TableUpdateType.TableId); - Hash = HashCombine(Hash, GetTypeHash(TableUpdateType.TableName)); - Hash = HashCombine(Hash, GetTypeHash(TableUpdateType.NumRows)); - Hash = HashCombine(Hash, GetTypeHash(TableUpdateType.Updates)); + uint32 Hash = GetTypeHash(TableUpdateType.TableName); + Hash = HashCombine(Hash, GetTypeHash(TableUpdateType.Rows)); return Hash; } @@ -54,5 +46,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FTableUpdateType); - UE_SPACETIMEDB_STRUCT(FTableUpdateType, TableId, TableName, NumRows, Updates); + UE_SPACETIMEDB_STRUCT(FTableUpdateType, TableName, Rows); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateLightType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateLightType.g.h deleted file mode 100644 index 8e3f8fa32b5..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateLightType.g.h +++ /dev/null @@ -1,50 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "TransactionUpdateLightType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FTransactionUpdateLightType -{ - GENERATED_BODY() - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FDatabaseUpdateType Update; - - FORCEINLINE bool operator==(const FTransactionUpdateLightType& Other) const - { - return RequestId == Other.RequestId && Update == Other.Update; - } - - FORCEINLINE bool operator!=(const FTransactionUpdateLightType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FTransactionUpdateLightType. - * Combines the hashes of all fields that are compared in operator==. - * @param TransactionUpdateLightType The FTransactionUpdateLightType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FTransactionUpdateLightType& TransactionUpdateLightType) -{ - uint32 Hash = GetTypeHash(TransactionUpdateLightType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateLightType.Update)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FTransactionUpdateLightType); - - UE_SPACETIMEDB_STRUCT(FTransactionUpdateLightType, RequestId, Update); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateType.g.h index 18c0d727cd3..d449805bad8 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/TransactionUpdateType.g.h @@ -4,10 +4,7 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/EnergyQuantaType.g.h" -#include "ModuleBindings/Types/ReducerCallInfoType.g.h" -#include "ModuleBindings/Types/UpdateStatusType.g.h" -#include "Types/Builtins.h" +#include "ModuleBindings/Types/QuerySetUpdateType.g.h" #include "TransactionUpdateType.g.generated.h" USTRUCT(BlueprintType) @@ -16,29 +13,11 @@ struct SPACETIMEDBSDK_API FTransactionUpdateType GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FUpdateStatusType Status; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBTimestamp Timestamp; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBIdentity CallerIdentity; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBConnectionId CallerConnectionId; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FReducerCallInfoType ReducerCall; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FEnergyQuantaType EnergyQuantaUsed; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSpacetimeDBTimeDuration TotalHostExecutionDuration; + TArray QuerySets; FORCEINLINE bool operator==(const FTransactionUpdateType& Other) const { - return Status == Other.Status && Timestamp == Other.Timestamp && CallerIdentity == Other.CallerIdentity && CallerConnectionId == Other.CallerConnectionId && ReducerCall == Other.ReducerCall && EnergyQuantaUsed == Other.EnergyQuantaUsed && TotalHostExecutionDuration == Other.TotalHostExecutionDuration; + return QuerySets == Other.QuerySets; } FORCEINLINE bool operator!=(const FTransactionUpdateType& Other) const @@ -55,13 +34,7 @@ struct SPACETIMEDBSDK_API FTransactionUpdateType */ FORCEINLINE uint32 GetTypeHash(const FTransactionUpdateType& TransactionUpdateType) { - uint32 Hash = GetTypeHash(TransactionUpdateType.Status); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.Timestamp)); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.CallerIdentity)); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.CallerConnectionId)); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.ReducerCall)); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.EnergyQuantaUsed)); - Hash = HashCombine(Hash, GetTypeHash(TransactionUpdateType.TotalHostExecutionDuration)); + uint32 Hash = GetTypeHash(TransactionUpdateType.QuerySets); return Hash; } @@ -69,5 +42,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FTransactionUpdateType); - UE_SPACETIMEDB_STRUCT(FTransactionUpdateType, Status, Timestamp, CallerIdentity, CallerConnectionId, ReducerCall, EnergyQuantaUsed, TotalHostExecutionDuration); + UE_SPACETIMEDB_STRUCT(FTransactionUpdateType, QuerySets); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeAppliedType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeAppliedType.g.h index 6aee42d8a67..db0992379b0 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeAppliedType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeAppliedType.g.h @@ -4,8 +4,9 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "ModuleBindings/Types/SubscribeRowsType.g.h" +#include "ModuleBindings/Optionals/SpacetimeDbSdkOptionalQueryRows.g.h" +#include "ModuleBindings/Types/QueryRowsType.g.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" #include "UnsubscribeAppliedType.g.generated.h" USTRUCT(BlueprintType) @@ -16,18 +17,15 @@ struct SPACETIMEDBSDK_API FUnsubscribeAppliedType // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements uint32 RequestId = 0; - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 TotalHostExecutionDurationMicros = 0; - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; + FQuerySetIdType QuerySetId; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FSubscribeRowsType Rows; + FSpacetimeDbSdkOptionalQueryRows Rows; FORCEINLINE bool operator==(const FUnsubscribeAppliedType& Other) const { - return RequestId == Other.RequestId && TotalHostExecutionDurationMicros == Other.TotalHostExecutionDurationMicros && QueryId == Other.QueryId && Rows == Other.Rows; + return RequestId == Other.RequestId && QuerySetId == Other.QuerySetId && Rows == Other.Rows; } FORCEINLINE bool operator!=(const FUnsubscribeAppliedType& Other) const @@ -45,8 +43,7 @@ struct SPACETIMEDBSDK_API FUnsubscribeAppliedType FORCEINLINE uint32 GetTypeHash(const FUnsubscribeAppliedType& UnsubscribeAppliedType) { uint32 Hash = GetTypeHash(UnsubscribeAppliedType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeAppliedType.TotalHostExecutionDurationMicros)); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeAppliedType.QueryId)); + Hash = HashCombine(Hash, GetTypeHash(UnsubscribeAppliedType.QuerySetId)); Hash = HashCombine(Hash, GetTypeHash(UnsubscribeAppliedType.Rows)); return Hash; } @@ -55,5 +52,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FUnsubscribeAppliedType); - UE_SPACETIMEDB_STRUCT(FUnsubscribeAppliedType, RequestId, TotalHostExecutionDurationMicros, QueryId, Rows); + UE_SPACETIMEDB_STRUCT(FUnsubscribeAppliedType, RequestId, QuerySetId, Rows); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeFlagsType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeFlagsType.g.h new file mode 100644 index 00000000000..46120a986af --- /dev/null +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeFlagsType.g.h @@ -0,0 +1,19 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#pragma once +#include "CoreMinimal.h" +#include "BSATN/UESpacetimeDB.h" +#include "UnsubscribeFlagsType.g.generated.h" + +UENUM(BlueprintType) +enum class EUnsubscribeFlagsType : uint8 +{ + Default, + SendDroppedRows, +}; + +namespace UE::SpacetimeDB +{ + UE_SPACETIMEDB_ENABLE_TARRAY(EUnsubscribeFlagsType); +} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h deleted file mode 100644 index 80415dec1bf..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiAppliedType.g.h +++ /dev/null @@ -1,59 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "UnsubscribeMultiAppliedType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FUnsubscribeMultiAppliedType -{ - GENERATED_BODY() - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - // NOTE: uint64 field not exposed to Blueprint due to non-blueprintable elements - uint64 TotalHostExecutionDurationMicros = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FDatabaseUpdateType Update; - - FORCEINLINE bool operator==(const FUnsubscribeMultiAppliedType& Other) const - { - return RequestId == Other.RequestId && TotalHostExecutionDurationMicros == Other.TotalHostExecutionDurationMicros && QueryId == Other.QueryId && Update == Other.Update; - } - - FORCEINLINE bool operator!=(const FUnsubscribeMultiAppliedType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FUnsubscribeMultiAppliedType. - * Combines the hashes of all fields that are compared in operator==. - * @param UnsubscribeMultiAppliedType The FUnsubscribeMultiAppliedType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FUnsubscribeMultiAppliedType& UnsubscribeMultiAppliedType) -{ - uint32 Hash = GetTypeHash(UnsubscribeMultiAppliedType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeMultiAppliedType.TotalHostExecutionDurationMicros)); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeMultiAppliedType.QueryId)); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeMultiAppliedType.Update)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FUnsubscribeMultiAppliedType); - - UE_SPACETIMEDB_STRUCT(FUnsubscribeMultiAppliedType, RequestId, TotalHostExecutionDurationMicros, QueryId, Update); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiType.g.h deleted file mode 100644 index a490a73daaa..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeMultiType.g.h +++ /dev/null @@ -1,50 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" -#include "UnsubscribeMultiType.g.generated.h" - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FUnsubscribeMultiType -{ - GENERATED_BODY() - - // NOTE: uint32 field not exposed to Blueprint due to non-blueprintable elements - uint32 RequestId = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; - - FORCEINLINE bool operator==(const FUnsubscribeMultiType& Other) const - { - return RequestId == Other.RequestId && QueryId == Other.QueryId; - } - - FORCEINLINE bool operator!=(const FUnsubscribeMultiType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FUnsubscribeMultiType. - * Combines the hashes of all fields that are compared in operator==. - * @param UnsubscribeMultiType The FUnsubscribeMultiType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FUnsubscribeMultiType& UnsubscribeMultiType) -{ - uint32 Hash = GetTypeHash(UnsubscribeMultiType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeMultiType.QueryId)); - return Hash; -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FUnsubscribeMultiType); - - UE_SPACETIMEDB_STRUCT(FUnsubscribeMultiType, RequestId, QueryId); -} diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeType.g.h index 37530918737..04ce34c727f 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeType.g.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UnsubscribeType.g.h @@ -4,7 +4,8 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "ModuleBindings/Types/QueryIdType.g.h" +#include "ModuleBindings/Types/QuerySetIdType.g.h" +#include "ModuleBindings/Types/UnsubscribeFlagsType.g.h" #include "UnsubscribeType.g.generated.h" USTRUCT(BlueprintType) @@ -16,11 +17,14 @@ struct SPACETIMEDBSDK_API FUnsubscribeType uint32 RequestId = 0; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") - FQueryIdType QueryId; + FQuerySetIdType QuerySetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB") + EUnsubscribeFlagsType Flags = EUnsubscribeFlagsType::Default; FORCEINLINE bool operator==(const FUnsubscribeType& Other) const { - return RequestId == Other.RequestId && QueryId == Other.QueryId; + return RequestId == Other.RequestId && QuerySetId == Other.QuerySetId && Flags == Other.Flags; } FORCEINLINE bool operator!=(const FUnsubscribeType& Other) const @@ -38,7 +42,8 @@ struct SPACETIMEDBSDK_API FUnsubscribeType FORCEINLINE uint32 GetTypeHash(const FUnsubscribeType& UnsubscribeType) { uint32 Hash = GetTypeHash(UnsubscribeType.RequestId); - Hash = HashCombine(Hash, GetTypeHash(UnsubscribeType.QueryId)); + Hash = HashCombine(Hash, GetTypeHash(UnsubscribeType.QuerySetId)); + Hash = HashCombine(Hash, GetTypeHash(UnsubscribeType.Flags)); return Hash; } @@ -46,5 +51,5 @@ namespace UE::SpacetimeDB { UE_SPACETIMEDB_ENABLE_TARRAY(FUnsubscribeType); - UE_SPACETIMEDB_STRUCT(FUnsubscribeType, RequestId, QueryId); + UE_SPACETIMEDB_STRUCT(FUnsubscribeType, RequestId, QuerySetId, Flags); } diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UpdateStatusType.g.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UpdateStatusType.g.h deleted file mode 100644 index 3ad273dd2d8..00000000000 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/ModuleBindings/Types/UpdateStatusType.g.h +++ /dev/null @@ -1,188 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE -// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. - -#pragma once -#include "CoreMinimal.h" -#include "BSATN/UESpacetimeDB.h" -#include "Kismet/BlueprintFunctionLibrary.h" -#include "ModuleBindings/Types/DatabaseUpdateType.g.h" -#include "Types/UnitType.h" -#include "UpdateStatusType.g.generated.h" - -UENUM(BlueprintType) -enum class EUpdateStatusTag : uint8 -{ - Committed, - Failed, - OutOfEnergy -}; - -USTRUCT(BlueprintType) -struct SPACETIMEDBSDK_API FUpdateStatusType -{ - GENERATED_BODY() - -public: - FUpdateStatusType() = default; - - TVariant MessageData; - - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - EUpdateStatusTag Tag = static_cast(0); - - static FUpdateStatusType Committed(const FDatabaseUpdateType& Value) - { - FUpdateStatusType Obj; - Obj.Tag = EUpdateStatusTag::Committed; - Obj.MessageData.Set(Value); - return Obj; - } - - static FUpdateStatusType Failed(const FString& Value) - { - FUpdateStatusType Obj; - Obj.Tag = EUpdateStatusTag::Failed; - Obj.MessageData.Set(Value); - return Obj; - } - - static FUpdateStatusType OutOfEnergy(const FSpacetimeDBUnit& Value) - { - FUpdateStatusType Obj; - Obj.Tag = EUpdateStatusTag::OutOfEnergy; - Obj.MessageData.Set(Value); - return Obj; - } - - FORCEINLINE bool IsCommitted() const { return Tag == EUpdateStatusTag::Committed; } - - FORCEINLINE FDatabaseUpdateType GetAsCommitted() const - { - ensureMsgf(IsCommitted(), TEXT("MessageData does not hold Committed!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsFailed() const { return Tag == EUpdateStatusTag::Failed; } - - FORCEINLINE FString GetAsFailed() const - { - ensureMsgf(IsFailed(), TEXT("MessageData does not hold Failed!")); - return MessageData.Get(); - } - - FORCEINLINE bool IsOutOfEnergy() const { return Tag == EUpdateStatusTag::OutOfEnergy; } - - FORCEINLINE FSpacetimeDBUnit GetAsOutOfEnergy() const - { - ensureMsgf(IsOutOfEnergy(), TEXT("MessageData does not hold OutOfEnergy!")); - return MessageData.Get(); - } - - // Inline equality operators - FORCEINLINE bool operator==(const FUpdateStatusType& Other) const - { - if (Tag != Other.Tag) return false; - - switch (Tag) - { - case EUpdateStatusTag::Committed: - return GetAsCommitted() == Other.GetAsCommitted(); - case EUpdateStatusTag::Failed: - return GetAsFailed() == Other.GetAsFailed(); - case EUpdateStatusTag::OutOfEnergy: - return GetAsOutOfEnergy() == Other.GetAsOutOfEnergy(); - default: - return false; - } - } - - FORCEINLINE bool operator!=(const FUpdateStatusType& Other) const - { - return !(*this == Other); - } -}; - -/** - * Custom hash function for FUpdateStatusType. - * Combines the hashes of all fields that are compared in operator==. - * @param UpdateStatusType The FUpdateStatusType instance to hash. - * @return The combined hash value. - */ -FORCEINLINE uint32 GetTypeHash(const FUpdateStatusType& UpdateStatus) -{ - const uint32 TagHash = GetTypeHash(static_cast(UpdateStatus.Tag)); - switch (UpdateStatus.Tag) - { - case EUpdateStatusTag::Committed: return HashCombine(TagHash, ::GetTypeHash(UpdateStatus.GetAsCommitted())); - case EUpdateStatusTag::Failed: return HashCombine(TagHash, GetTypeHash(UpdateStatus.GetAsFailed())); - case EUpdateStatusTag::OutOfEnergy: return HashCombine(TagHash, ::GetTypeHash(UpdateStatus.GetAsOutOfEnergy())); - default: return TagHash; - } -} - -namespace UE::SpacetimeDB -{ - UE_SPACETIMEDB_ENABLE_TARRAY(FUpdateStatusType); - - UE_SPACETIMEDB_TAGGED_ENUM( - FUpdateStatusType, - EUpdateStatusTag, - MessageData, - Committed, FDatabaseUpdateType, - Failed, FString, - OutOfEnergy, FSpacetimeDBUnit - ); -} - -UCLASS() -class SPACETIMEDBSDK_API UUpdateStatusBpLib : public UBlueprintFunctionLibrary -{ - GENERATED_BODY() - -private: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|UpdateStatus") - static FUpdateStatusType Committed(const FDatabaseUpdateType& InValue) - { - return FUpdateStatusType::Committed(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static bool IsCommitted(const FUpdateStatusType& InValue) { return InValue.IsCommitted(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static FDatabaseUpdateType GetAsCommitted(const FUpdateStatusType& InValue) - { - return InValue.GetAsCommitted(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|UpdateStatus") - static FUpdateStatusType Failed(const FString& InValue) - { - return FUpdateStatusType::Failed(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static bool IsFailed(const FUpdateStatusType& InValue) { return InValue.IsFailed(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static FString GetAsFailed(const FUpdateStatusType& InValue) - { - return InValue.GetAsFailed(); - } - - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|UpdateStatus") - static FUpdateStatusType OutOfEnergy(const FSpacetimeDBUnit& InValue) - { - return FUpdateStatusType::OutOfEnergy(InValue); - } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static bool IsOutOfEnergy(const FUpdateStatusType& InValue) { return InValue.IsOutOfEnergy(); } - - UFUNCTION(BlueprintPure, Category = "SpacetimeDB|UpdateStatus") - static FSpacetimeDBUnit GetAsOutOfEnergy(const FUpdateStatusType& InValue) - { - return InValue.GetAsOutOfEnergy(); - } - -}; diff --git a/sdks/unreal/tests/TestClient/Config/DefaultEngine.ini b/sdks/unreal/tests/TestClient/Config/DefaultEngine.ini index 92c3bae9b3e..0239c099c52 100644 --- a/sdks/unreal/tests/TestClient/Config/DefaultEngine.ini +++ b/sdks/unreal/tests/TestClient/Config/DefaultEngine.ini @@ -23,7 +23,7 @@ DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 [/Script/Engine.RendererSettings] r.AllowStaticLighting=0 -r.GenerateMeshDistanceFields=True +r.GenerateMeshDistanceFields=False r.DynamicGlobalIlluminationMethod=1 r.ReflectionMethod=1 r.Shadow.Virtual.Enable=1 diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp b/sdks/unreal/tests/TestClient/Source/TestClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp index 91dc96f168e..22169073be0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp @@ -112,2358 +112,376 @@ #include "ModuleBindings/Tables/VecUnitStructTable.g.h" #include "ModuleBindings/Tables/VecUuidTable.g.h" -static FReducer DecodeReducer(const FReducerEvent& Event) +UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - const FString& ReducerName = Event.ReducerCall.ReducerName; - - if (ReducerName == TEXT("delete_from_btree_u32")) - { - FDeleteFromBtreeU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteFromBtreeU32(Args); - } - - if (ReducerName == TEXT("delete_large_table")) - { - FDeleteLargeTableArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteLargeTable(Args); - } - - if (ReducerName == TEXT("delete_pk_bool")) - { - FDeletePkBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkBool(Args); - } - - if (ReducerName == TEXT("delete_pk_connection_id")) - { - FDeletePkConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkConnectionId(Args); - } - - if (ReducerName == TEXT("delete_pk_i128")) - { - FDeletePkI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI128(Args); - } - - if (ReducerName == TEXT("delete_pk_i16")) - { - FDeletePkI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI16(Args); - } - - if (ReducerName == TEXT("delete_pk_i256")) - { - FDeletePkI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI256(Args); - } - - if (ReducerName == TEXT("delete_pk_i32")) - { - FDeletePkI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI32(Args); - } - - if (ReducerName == TEXT("delete_pk_i64")) - { - FDeletePkI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI64(Args); - } - - if (ReducerName == TEXT("delete_pk_i8")) - { - FDeletePkI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkI8(Args); - } - - if (ReducerName == TEXT("delete_pk_identity")) - { - FDeletePkIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkIdentity(Args); - } - - if (ReducerName == TEXT("delete_pk_string")) - { - FDeletePkStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkString(Args); - } - - if (ReducerName == TEXT("delete_pk_u128")) - { - FDeletePkU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU128(Args); - } - - if (ReducerName == TEXT("delete_pk_u16")) - { - FDeletePkU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU16(Args); - } - - if (ReducerName == TEXT("delete_pk_u256")) - { - FDeletePkU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU256(Args); - } - - if (ReducerName == TEXT("delete_pk_u32")) - { - FDeletePkU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU32(Args); - } - - if (ReducerName == TEXT("delete_pk_u32_insert_pk_u32_two")) - { - FDeletePkU32InsertPkU32TwoArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU32InsertPkU32Two(Args); - } - - if (ReducerName == TEXT("delete_pk_u32_two")) - { - FDeletePkU32TwoArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU32Two(Args); - } - - if (ReducerName == TEXT("delete_pk_u64")) - { - FDeletePkU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU64(Args); - } - - if (ReducerName == TEXT("delete_pk_u8")) - { - FDeletePkU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkU8(Args); - } - - if (ReducerName == TEXT("delete_pk_uuid")) - { - FDeletePkUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeletePkUuid(Args); - } - - if (ReducerName == TEXT("delete_unique_bool")) - { - FDeleteUniqueBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueBool(Args); - } - - if (ReducerName == TEXT("delete_unique_connection_id")) - { - FDeleteUniqueConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueConnectionId(Args); - } - - if (ReducerName == TEXT("delete_unique_i128")) - { - FDeleteUniqueI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI128(Args); - } - - if (ReducerName == TEXT("delete_unique_i16")) - { - FDeleteUniqueI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI16(Args); - } - - if (ReducerName == TEXT("delete_unique_i256")) - { - FDeleteUniqueI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI256(Args); - } - - if (ReducerName == TEXT("delete_unique_i32")) - { - FDeleteUniqueI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI32(Args); - } - - if (ReducerName == TEXT("delete_unique_i64")) - { - FDeleteUniqueI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI64(Args); - } - - if (ReducerName == TEXT("delete_unique_i8")) - { - FDeleteUniqueI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueI8(Args); - } - - if (ReducerName == TEXT("delete_unique_identity")) - { - FDeleteUniqueIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueIdentity(Args); - } - - if (ReducerName == TEXT("delete_unique_string")) - { - FDeleteUniqueStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueString(Args); - } - - if (ReducerName == TEXT("delete_unique_u128")) - { - FDeleteUniqueU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU128(Args); - } - - if (ReducerName == TEXT("delete_unique_u16")) - { - FDeleteUniqueU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU16(Args); - } - - if (ReducerName == TEXT("delete_unique_u256")) - { - FDeleteUniqueU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU256(Args); - } - - if (ReducerName == TEXT("delete_unique_u32")) - { - FDeleteUniqueU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU32(Args); - } - - if (ReducerName == TEXT("delete_unique_u64")) - { - FDeleteUniqueU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU64(Args); - } - - if (ReducerName == TEXT("delete_unique_u8")) - { - FDeleteUniqueU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueU8(Args); - } - - if (ReducerName == TEXT("delete_unique_uuid")) - { - FDeleteUniqueUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::DeleteUniqueUuid(Args); - } - - if (ReducerName == TEXT("insert_call_timestamp")) - { - FInsertCallTimestampArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallTimestamp(Args); - } - - if (ReducerName == TEXT("insert_call_uuid_v4")) - { - FInsertCallUuidV4Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallUuidV4(Args); - } - - if (ReducerName == TEXT("insert_call_uuid_v7")) - { - FInsertCallUuidV7Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallUuidV7(Args); - } - - if (ReducerName == TEXT("insert_caller_one_connection_id")) - { - FInsertCallerOneConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerOneConnectionId(Args); - } - - if (ReducerName == TEXT("insert_caller_one_identity")) - { - FInsertCallerOneIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerOneIdentity(Args); - } - - if (ReducerName == TEXT("insert_caller_pk_connection_id")) - { - FInsertCallerPkConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerPkConnectionId(Args); - } - - if (ReducerName == TEXT("insert_caller_pk_identity")) - { - FInsertCallerPkIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerPkIdentity(Args); - } - - if (ReducerName == TEXT("insert_caller_unique_connection_id")) - { - FInsertCallerUniqueConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerUniqueConnectionId(Args); - } - - if (ReducerName == TEXT("insert_caller_unique_identity")) - { - FInsertCallerUniqueIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerUniqueIdentity(Args); - } - - if (ReducerName == TEXT("insert_caller_vec_connection_id")) - { - FInsertCallerVecConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerVecConnectionId(Args); - } - - if (ReducerName == TEXT("insert_caller_vec_identity")) - { - FInsertCallerVecIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertCallerVecIdentity(Args); - } - - if (ReducerName == TEXT("insert_into_btree_u32")) - { - FInsertIntoBtreeU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertIntoBtreeU32(Args); - } - - if (ReducerName == TEXT("insert_into_indexed_simple_enum")) - { - FInsertIntoIndexedSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertIntoIndexedSimpleEnum(Args); - } - - if (ReducerName == TEXT("insert_into_pk_btree_u32")) - { - FInsertIntoPkBtreeU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertIntoPkBtreeU32(Args); - } - - if (ReducerName == TEXT("insert_large_table")) - { - FInsertLargeTableArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertLargeTable(Args); - } - - if (ReducerName == TEXT("insert_one_bool")) - { - FInsertOneBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneBool(Args); - } - - if (ReducerName == TEXT("insert_one_byte_struct")) - { - FInsertOneByteStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneByteStruct(Args); - } - - if (ReducerName == TEXT("insert_one_connection_id")) - { - FInsertOneConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneConnectionId(Args); - } + Db = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteTables")); + Db->Initialize(); + + Reducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteReducers")); + Reducers->Conn = this; - if (ReducerName == TEXT("insert_one_enum_with_payload")) - { - FInsertOneEnumWithPayloadArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneEnumWithPayload(Args); - } + Procedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteProcedures")); + Procedures->Conn = this; - if (ReducerName == TEXT("insert_one_every_primitive_struct")) - { - FInsertOneEveryPrimitiveStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneEveryPrimitiveStruct(Args); - } + RegisterTable(TEXT("btree_u_32"), Db->BtreeU32); + RegisterTable(TEXT("indexed_simple_enum"), Db->IndexedSimpleEnum); + RegisterTable(TEXT("large_table"), Db->LargeTable); + RegisterTable(TEXT("one_bool"), Db->OneBool); + RegisterTable(TEXT("one_byte_struct"), Db->OneByteStruct); + RegisterTable(TEXT("one_connection_id"), Db->OneConnectionId); + RegisterTable(TEXT("one_enum_with_payload"), Db->OneEnumWithPayload); + RegisterTable(TEXT("one_every_primitive_struct"), Db->OneEveryPrimitiveStruct); + RegisterTable(TEXT("one_every_vec_struct"), Db->OneEveryVecStruct); + RegisterTable(TEXT("one_f_32"), Db->OneF32); + RegisterTable(TEXT("one_f_64"), Db->OneF64); + RegisterTable(TEXT("one_i_128"), Db->OneI128); + RegisterTable(TEXT("one_i_16"), Db->OneI16); + RegisterTable(TEXT("one_i_256"), Db->OneI256); + RegisterTable(TEXT("one_i_32"), Db->OneI32); + RegisterTable(TEXT("one_i_64"), Db->OneI64); + RegisterTable(TEXT("one_i_8"), Db->OneI8); + RegisterTable(TEXT("one_identity"), Db->OneIdentity); + RegisterTable(TEXT("one_simple_enum"), Db->OneSimpleEnum); + RegisterTable(TEXT("one_string"), Db->OneString); + RegisterTable(TEXT("one_timestamp"), Db->OneTimestamp); + RegisterTable(TEXT("one_u_128"), Db->OneU128); + RegisterTable(TEXT("one_u_16"), Db->OneU16); + RegisterTable(TEXT("one_u_256"), Db->OneU256); + RegisterTable(TEXT("one_u_32"), Db->OneU32); + RegisterTable(TEXT("one_u_64"), Db->OneU64); + RegisterTable(TEXT("one_u_8"), Db->OneU8); + RegisterTable(TEXT("one_unit_struct"), Db->OneUnitStruct); + RegisterTable(TEXT("one_uuid"), Db->OneUuid); + RegisterTable(TEXT("option_every_primitive_struct"), Db->OptionEveryPrimitiveStruct); + RegisterTable(TEXT("option_i_32"), Db->OptionI32); + RegisterTable(TEXT("option_identity"), Db->OptionIdentity); + RegisterTable(TEXT("option_simple_enum"), Db->OptionSimpleEnum); + RegisterTable(TEXT("option_string"), Db->OptionString); + RegisterTable(TEXT("option_uuid"), Db->OptionUuid); + RegisterTable(TEXT("option_vec_option_i_32"), Db->OptionVecOptionI32); + RegisterTable(TEXT("pk_bool"), Db->PkBool); + RegisterTable(TEXT("pk_connection_id"), Db->PkConnectionId); + RegisterTable(TEXT("pk_i_128"), Db->PkI128); + RegisterTable(TEXT("pk_i_16"), Db->PkI16); + RegisterTable(TEXT("pk_i_256"), Db->PkI256); + RegisterTable(TEXT("pk_i_32"), Db->PkI32); + RegisterTable(TEXT("pk_i_64"), Db->PkI64); + RegisterTable(TEXT("pk_i_8"), Db->PkI8); + RegisterTable(TEXT("pk_identity"), Db->PkIdentity); + RegisterTable(TEXT("pk_simple_enum"), Db->PkSimpleEnum); + RegisterTable(TEXT("pk_string"), Db->PkString); + RegisterTable(TEXT("pk_u_128"), Db->PkU128); + RegisterTable(TEXT("pk_u_16"), Db->PkU16); + RegisterTable(TEXT("pk_u_256"), Db->PkU256); + RegisterTable(TEXT("pk_u_32"), Db->PkU32); + RegisterTable(TEXT("pk_u_32_two"), Db->PkU32Two); + RegisterTable(TEXT("pk_u_64"), Db->PkU64); + RegisterTable(TEXT("pk_u_8"), Db->PkU8); + RegisterTable(TEXT("pk_uuid"), Db->PkUuid); + RegisterTable(TEXT("result_every_primitive_struct_string"), Db->ResultEveryPrimitiveStructString); + RegisterTable(TEXT("result_i_32_string"), Db->ResultI32String); + RegisterTable(TEXT("result_identity_string"), Db->ResultIdentityString); + RegisterTable(TEXT("result_simple_enum_i_32"), Db->ResultSimpleEnumI32); + RegisterTable(TEXT("result_string_i_32"), Db->ResultStringI32); + RegisterTable(TEXT("result_vec_i_32_string"), Db->ResultVecI32String); + RegisterTable(TEXT("scheduled_table"), Db->ScheduledTable); + RegisterTable(TEXT("table_holds_table"), Db->TableHoldsTable); + RegisterTable(TEXT("unique_bool"), Db->UniqueBool); + RegisterTable(TEXT("unique_connection_id"), Db->UniqueConnectionId); + RegisterTable(TEXT("unique_i_128"), Db->UniqueI128); + RegisterTable(TEXT("unique_i_16"), Db->UniqueI16); + RegisterTable(TEXT("unique_i_256"), Db->UniqueI256); + RegisterTable(TEXT("unique_i_32"), Db->UniqueI32); + RegisterTable(TEXT("unique_i_64"), Db->UniqueI64); + RegisterTable(TEXT("unique_i_8"), Db->UniqueI8); + RegisterTable(TEXT("unique_identity"), Db->UniqueIdentity); + RegisterTable(TEXT("unique_string"), Db->UniqueString); + RegisterTable(TEXT("unique_u_128"), Db->UniqueU128); + RegisterTable(TEXT("unique_u_16"), Db->UniqueU16); + RegisterTable(TEXT("unique_u_256"), Db->UniqueU256); + RegisterTable(TEXT("unique_u_32"), Db->UniqueU32); + RegisterTable(TEXT("unique_u_64"), Db->UniqueU64); + RegisterTable(TEXT("unique_u_8"), Db->UniqueU8); + RegisterTable(TEXT("unique_uuid"), Db->UniqueUuid); + RegisterTable(TEXT("users"), Db->Users); + RegisterTable(TEXT("vec_bool"), Db->VecBool); + RegisterTable(TEXT("vec_byte_struct"), Db->VecByteStruct); + RegisterTable(TEXT("vec_connection_id"), Db->VecConnectionId); + RegisterTable(TEXT("vec_enum_with_payload"), Db->VecEnumWithPayload); + RegisterTable(TEXT("vec_every_primitive_struct"), Db->VecEveryPrimitiveStruct); + RegisterTable(TEXT("vec_every_vec_struct"), Db->VecEveryVecStruct); + RegisterTable(TEXT("vec_f_32"), Db->VecF32); + RegisterTable(TEXT("vec_f_64"), Db->VecF64); + RegisterTable(TEXT("vec_i_128"), Db->VecI128); + RegisterTable(TEXT("vec_i_16"), Db->VecI16); + RegisterTable(TEXT("vec_i_256"), Db->VecI256); + RegisterTable(TEXT("vec_i_32"), Db->VecI32); + RegisterTable(TEXT("vec_i_64"), Db->VecI64); + RegisterTable(TEXT("vec_i_8"), Db->VecI8); + RegisterTable(TEXT("vec_identity"), Db->VecIdentity); + RegisterTable(TEXT("vec_simple_enum"), Db->VecSimpleEnum); + RegisterTable(TEXT("vec_string"), Db->VecString); + RegisterTable(TEXT("vec_timestamp"), Db->VecTimestamp); + RegisterTable(TEXT("vec_u_128"), Db->VecU128); + RegisterTable(TEXT("vec_u_16"), Db->VecU16); + RegisterTable(TEXT("vec_u_256"), Db->VecU256); + RegisterTable(TEXT("vec_u_32"), Db->VecU32); + RegisterTable(TEXT("vec_u_64"), Db->VecU64); + RegisterTable(TEXT("vec_u_8"), Db->VecU8); + RegisterTable(TEXT("vec_unit_struct"), Db->VecUnitStruct); + RegisterTable(TEXT("vec_uuid"), Db->VecUuid); +} - if (ReducerName == TEXT("insert_one_every_vec_struct")) - { - FInsertOneEveryVecStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneEveryVecStruct(Args); - } - - if (ReducerName == TEXT("insert_one_f32")) - { - FInsertOneF32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneF32(Args); - } - - if (ReducerName == TEXT("insert_one_f64")) - { - FInsertOneF64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneF64(Args); - } - - if (ReducerName == TEXT("insert_one_i128")) - { - FInsertOneI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI128(Args); - } - - if (ReducerName == TEXT("insert_one_i16")) - { - FInsertOneI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI16(Args); - } - - if (ReducerName == TEXT("insert_one_i256")) - { - FInsertOneI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI256(Args); - } - - if (ReducerName == TEXT("insert_one_i32")) - { - FInsertOneI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI32(Args); - } - - if (ReducerName == TEXT("insert_one_i64")) - { - FInsertOneI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI64(Args); - } - - if (ReducerName == TEXT("insert_one_i8")) - { - FInsertOneI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneI8(Args); - } - - if (ReducerName == TEXT("insert_one_identity")) - { - FInsertOneIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneIdentity(Args); - } - - if (ReducerName == TEXT("insert_one_simple_enum")) - { - FInsertOneSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneSimpleEnum(Args); - } - - if (ReducerName == TEXT("insert_one_string")) - { - FInsertOneStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneString(Args); - } - - if (ReducerName == TEXT("insert_one_timestamp")) - { - FInsertOneTimestampArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneTimestamp(Args); - } - - if (ReducerName == TEXT("insert_one_u128")) - { - FInsertOneU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU128(Args); - } - - if (ReducerName == TEXT("insert_one_u16")) - { - FInsertOneU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU16(Args); - } - - if (ReducerName == TEXT("insert_one_u256")) - { - FInsertOneU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU256(Args); - } - - if (ReducerName == TEXT("insert_one_u32")) - { - FInsertOneU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU32(Args); - } - - if (ReducerName == TEXT("insert_one_u64")) - { - FInsertOneU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU64(Args); - } - - if (ReducerName == TEXT("insert_one_u8")) - { - FInsertOneU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneU8(Args); - } - - if (ReducerName == TEXT("insert_one_unit_struct")) - { - FInsertOneUnitStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneUnitStruct(Args); - } - - if (ReducerName == TEXT("insert_one_uuid")) - { - FInsertOneUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOneUuid(Args); - } - - if (ReducerName == TEXT("insert_option_every_primitive_struct")) - { - FInsertOptionEveryPrimitiveStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionEveryPrimitiveStruct(Args); - } - - if (ReducerName == TEXT("insert_option_i32")) - { - FInsertOptionI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionI32(Args); - } - - if (ReducerName == TEXT("insert_option_identity")) - { - FInsertOptionIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionIdentity(Args); - } - - if (ReducerName == TEXT("insert_option_simple_enum")) - { - FInsertOptionSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionSimpleEnum(Args); - } - - if (ReducerName == TEXT("insert_option_string")) - { - FInsertOptionStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionString(Args); - } - - if (ReducerName == TEXT("insert_option_uuid")) - { - FInsertOptionUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionUuid(Args); - } - - if (ReducerName == TEXT("insert_option_vec_option_i32")) - { - FInsertOptionVecOptionI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertOptionVecOptionI32(Args); - } - - if (ReducerName == TEXT("insert_pk_bool")) - { - FInsertPkBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkBool(Args); - } - - if (ReducerName == TEXT("insert_pk_connection_id")) - { - FInsertPkConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkConnectionId(Args); - } - - if (ReducerName == TEXT("insert_pk_i128")) - { - FInsertPkI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI128(Args); - } - - if (ReducerName == TEXT("insert_pk_i16")) - { - FInsertPkI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI16(Args); - } - - if (ReducerName == TEXT("insert_pk_i256")) - { - FInsertPkI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI256(Args); - } - - if (ReducerName == TEXT("insert_pk_i32")) - { - FInsertPkI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI32(Args); - } - - if (ReducerName == TEXT("insert_pk_i64")) - { - FInsertPkI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI64(Args); - } - - if (ReducerName == TEXT("insert_pk_i8")) - { - FInsertPkI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkI8(Args); - } - - if (ReducerName == TEXT("insert_pk_identity")) - { - FInsertPkIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkIdentity(Args); - } - - if (ReducerName == TEXT("insert_pk_simple_enum")) - { - FInsertPkSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkSimpleEnum(Args); - } - - if (ReducerName == TEXT("insert_pk_string")) - { - FInsertPkStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkString(Args); - } - - if (ReducerName == TEXT("insert_pk_u128")) - { - FInsertPkU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU128(Args); - } - - if (ReducerName == TEXT("insert_pk_u16")) - { - FInsertPkU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU16(Args); - } - - if (ReducerName == TEXT("insert_pk_u256")) - { - FInsertPkU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU256(Args); - } - - if (ReducerName == TEXT("insert_pk_u32")) - { - FInsertPkU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU32(Args); - } - - if (ReducerName == TEXT("insert_pk_u32_two")) - { - FInsertPkU32TwoArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU32Two(Args); - } - - if (ReducerName == TEXT("insert_pk_u64")) - { - FInsertPkU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU64(Args); - } - - if (ReducerName == TEXT("insert_pk_u8")) - { - FInsertPkU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkU8(Args); - } - - if (ReducerName == TEXT("insert_pk_uuid")) - { - FInsertPkUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPkUuid(Args); - } - - if (ReducerName == TEXT("insert_primitives_as_strings")) - { - FInsertPrimitivesAsStringsArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertPrimitivesAsStrings(Args); - } - - if (ReducerName == TEXT("insert_result_every_primitive_struct_string")) - { - FInsertResultEveryPrimitiveStructStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultEveryPrimitiveStructString(Args); - } - - if (ReducerName == TEXT("insert_result_i32_string")) - { - FInsertResultI32StringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultI32String(Args); - } - - if (ReducerName == TEXT("insert_result_identity_string")) - { - FInsertResultIdentityStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultIdentityString(Args); - } - - if (ReducerName == TEXT("insert_result_simple_enum_i32")) - { - FInsertResultSimpleEnumI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultSimpleEnumI32(Args); - } - - if (ReducerName == TEXT("insert_result_string_i32")) - { - FInsertResultStringI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultStringI32(Args); - } - - if (ReducerName == TEXT("insert_result_vec_i32_string")) - { - FInsertResultVecI32StringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertResultVecI32String(Args); - } - - if (ReducerName == TEXT("insert_table_holds_table")) - { - FInsertTableHoldsTableArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertTableHoldsTable(Args); - } - - if (ReducerName == TEXT("insert_unique_bool")) - { - FInsertUniqueBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueBool(Args); - } - - if (ReducerName == TEXT("insert_unique_connection_id")) - { - FInsertUniqueConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueConnectionId(Args); - } - - if (ReducerName == TEXT("insert_unique_i128")) - { - FInsertUniqueI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI128(Args); - } - - if (ReducerName == TEXT("insert_unique_i16")) - { - FInsertUniqueI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI16(Args); - } - - if (ReducerName == TEXT("insert_unique_i256")) - { - FInsertUniqueI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI256(Args); - } - - if (ReducerName == TEXT("insert_unique_i32")) - { - FInsertUniqueI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI32(Args); - } - - if (ReducerName == TEXT("insert_unique_i64")) - { - FInsertUniqueI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI64(Args); - } - - if (ReducerName == TEXT("insert_unique_i8")) - { - FInsertUniqueI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueI8(Args); - } - - if (ReducerName == TEXT("insert_unique_identity")) - { - FInsertUniqueIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueIdentity(Args); - } - - if (ReducerName == TEXT("insert_unique_string")) - { - FInsertUniqueStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueString(Args); - } - - if (ReducerName == TEXT("insert_unique_u128")) - { - FInsertUniqueU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU128(Args); - } - - if (ReducerName == TEXT("insert_unique_u16")) - { - FInsertUniqueU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU16(Args); - } - - if (ReducerName == TEXT("insert_unique_u256")) - { - FInsertUniqueU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU256(Args); - } - - if (ReducerName == TEXT("insert_unique_u32")) - { - FInsertUniqueU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU32(Args); - } - - if (ReducerName == TEXT("insert_unique_u32_update_pk_u32")) - { - FInsertUniqueU32UpdatePkU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU32UpdatePkU32(Args); - } - - if (ReducerName == TEXT("insert_unique_u64")) - { - FInsertUniqueU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU64(Args); - } - - if (ReducerName == TEXT("insert_unique_u8")) - { - FInsertUniqueU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueU8(Args); - } - - if (ReducerName == TEXT("insert_unique_uuid")) - { - FInsertUniqueUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUniqueUuid(Args); - } - - if (ReducerName == TEXT("insert_user")) - { - FInsertUserArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertUser(Args); - } - - if (ReducerName == TEXT("insert_vec_bool")) - { - FInsertVecBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecBool(Args); - } - - if (ReducerName == TEXT("insert_vec_byte_struct")) - { - FInsertVecByteStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecByteStruct(Args); - } - - if (ReducerName == TEXT("insert_vec_connection_id")) - { - FInsertVecConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecConnectionId(Args); - } - - if (ReducerName == TEXT("insert_vec_enum_with_payload")) - { - FInsertVecEnumWithPayloadArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecEnumWithPayload(Args); - } - - if (ReducerName == TEXT("insert_vec_every_primitive_struct")) - { - FInsertVecEveryPrimitiveStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecEveryPrimitiveStruct(Args); - } - - if (ReducerName == TEXT("insert_vec_every_vec_struct")) - { - FInsertVecEveryVecStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecEveryVecStruct(Args); - } - - if (ReducerName == TEXT("insert_vec_f32")) - { - FInsertVecF32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecF32(Args); - } - - if (ReducerName == TEXT("insert_vec_f64")) - { - FInsertVecF64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecF64(Args); - } - - if (ReducerName == TEXT("insert_vec_i128")) - { - FInsertVecI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI128(Args); - } - - if (ReducerName == TEXT("insert_vec_i16")) - { - FInsertVecI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI16(Args); - } - - if (ReducerName == TEXT("insert_vec_i256")) - { - FInsertVecI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI256(Args); - } - - if (ReducerName == TEXT("insert_vec_i32")) - { - FInsertVecI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI32(Args); - } - - if (ReducerName == TEXT("insert_vec_i64")) - { - FInsertVecI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI64(Args); - } - - if (ReducerName == TEXT("insert_vec_i8")) - { - FInsertVecI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecI8(Args); - } - - if (ReducerName == TEXT("insert_vec_identity")) - { - FInsertVecIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecIdentity(Args); - } - - if (ReducerName == TEXT("insert_vec_simple_enum")) - { - FInsertVecSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecSimpleEnum(Args); - } - - if (ReducerName == TEXT("insert_vec_string")) - { - FInsertVecStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecString(Args); - } - - if (ReducerName == TEXT("insert_vec_timestamp")) - { - FInsertVecTimestampArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecTimestamp(Args); - } - - if (ReducerName == TEXT("insert_vec_u128")) - { - FInsertVecU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU128(Args); - } - - if (ReducerName == TEXT("insert_vec_u16")) - { - FInsertVecU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU16(Args); - } - - if (ReducerName == TEXT("insert_vec_u256")) - { - FInsertVecU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU256(Args); - } - - if (ReducerName == TEXT("insert_vec_u32")) - { - FInsertVecU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU32(Args); - } - - if (ReducerName == TEXT("insert_vec_u64")) - { - FInsertVecU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU64(Args); - } - - if (ReducerName == TEXT("insert_vec_u8")) - { - FInsertVecU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecU8(Args); - } - - if (ReducerName == TEXT("insert_vec_unit_struct")) - { - FInsertVecUnitStructArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecUnitStruct(Args); - } - - if (ReducerName == TEXT("insert_vec_uuid")) - { - FInsertVecUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::InsertVecUuid(Args); - } - - if (ReducerName == TEXT("no_op_succeeds")) - { - FNoOpSucceedsArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::NoOpSucceeds(Args); - } - - if (ReducerName == TEXT("sorted_uuids_insert")) - { - FSortedUuidsInsertArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::SortedUuidsInsert(Args); - } - - if (ReducerName == TEXT("update_indexed_simple_enum")) - { - FUpdateIndexedSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateIndexedSimpleEnum(Args); - } - - if (ReducerName == TEXT("update_pk_bool")) - { - FUpdatePkBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkBool(Args); - } - - if (ReducerName == TEXT("update_pk_connection_id")) - { - FUpdatePkConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkConnectionId(Args); - } - - if (ReducerName == TEXT("update_pk_i128")) - { - FUpdatePkI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI128(Args); - } - - if (ReducerName == TEXT("update_pk_i16")) - { - FUpdatePkI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI16(Args); - } - - if (ReducerName == TEXT("update_pk_i256")) - { - FUpdatePkI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI256(Args); - } - - if (ReducerName == TEXT("update_pk_i32")) - { - FUpdatePkI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI32(Args); - } - - if (ReducerName == TEXT("update_pk_i64")) - { - FUpdatePkI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI64(Args); - } - - if (ReducerName == TEXT("update_pk_i8")) - { - FUpdatePkI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkI8(Args); - } - - if (ReducerName == TEXT("update_pk_identity")) - { - FUpdatePkIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkIdentity(Args); - } - - if (ReducerName == TEXT("update_pk_simple_enum")) - { - FUpdatePkSimpleEnumArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkSimpleEnum(Args); - } - - if (ReducerName == TEXT("update_pk_string")) - { - FUpdatePkStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkString(Args); - } - - if (ReducerName == TEXT("update_pk_u128")) - { - FUpdatePkU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU128(Args); - } - - if (ReducerName == TEXT("update_pk_u16")) - { - FUpdatePkU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU16(Args); - } - - if (ReducerName == TEXT("update_pk_u256")) - { - FUpdatePkU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU256(Args); - } - - if (ReducerName == TEXT("update_pk_u32")) - { - FUpdatePkU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU32(Args); - } - - if (ReducerName == TEXT("update_pk_u32_two")) - { - FUpdatePkU32TwoArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU32Two(Args); - } - - if (ReducerName == TEXT("update_pk_u64")) - { - FUpdatePkU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU64(Args); - } - - if (ReducerName == TEXT("update_pk_u8")) - { - FUpdatePkU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkU8(Args); - } - - if (ReducerName == TEXT("update_pk_uuid")) - { - FUpdatePkUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdatePkUuid(Args); - } - - if (ReducerName == TEXT("update_unique_bool")) - { - FUpdateUniqueBoolArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueBool(Args); - } - - if (ReducerName == TEXT("update_unique_connection_id")) - { - FUpdateUniqueConnectionIdArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueConnectionId(Args); - } - - if (ReducerName == TEXT("update_unique_i128")) - { - FUpdateUniqueI128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI128(Args); - } - - if (ReducerName == TEXT("update_unique_i16")) - { - FUpdateUniqueI16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI16(Args); - } - - if (ReducerName == TEXT("update_unique_i256")) - { - FUpdateUniqueI256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI256(Args); - } - - if (ReducerName == TEXT("update_unique_i32")) - { - FUpdateUniqueI32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI32(Args); - } - - if (ReducerName == TEXT("update_unique_i64")) - { - FUpdateUniqueI64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI64(Args); - } - - if (ReducerName == TEXT("update_unique_i8")) - { - FUpdateUniqueI8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueI8(Args); - } - - if (ReducerName == TEXT("update_unique_identity")) - { - FUpdateUniqueIdentityArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueIdentity(Args); - } - - if (ReducerName == TEXT("update_unique_string")) - { - FUpdateUniqueStringArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueString(Args); - } - - if (ReducerName == TEXT("update_unique_u128")) - { - FUpdateUniqueU128Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU128(Args); - } - - if (ReducerName == TEXT("update_unique_u16")) - { - FUpdateUniqueU16Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU16(Args); - } - - if (ReducerName == TEXT("update_unique_u256")) - { - FUpdateUniqueU256Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU256(Args); - } - - if (ReducerName == TEXT("update_unique_u32")) - { - FUpdateUniqueU32Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU32(Args); - } - - if (ReducerName == TEXT("update_unique_u64")) - { - FUpdateUniqueU64Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU64(Args); - } - - if (ReducerName == TEXT("update_unique_u8")) - { - FUpdateUniqueU8Args Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueU8(Args); - } - - if (ReducerName == TEXT("update_unique_uuid")) - { - FUpdateUniqueUuidArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::UpdateUniqueUuid(Args); - } - - return FReducer(); -} - -UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) -{ - SetReducerFlags = ObjectInitializer.CreateDefaultSubobject(this, TEXT("SetReducerFlags")); - - Db = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteTables")); - Db->Initialize(); - - Reducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteReducers")); - Reducers->SetCallReducerFlags = SetReducerFlags; - Reducers->Conn = this; - - Procedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteProcedures")); - Procedures->Conn = this; - - RegisterTable(TEXT("btree_u32"), Db->BtreeU32); - RegisterTable(TEXT("indexed_simple_enum"), Db->IndexedSimpleEnum); - RegisterTable(TEXT("large_table"), Db->LargeTable); - RegisterTable(TEXT("one_bool"), Db->OneBool); - RegisterTable(TEXT("one_byte_struct"), Db->OneByteStruct); - RegisterTable(TEXT("one_connection_id"), Db->OneConnectionId); - RegisterTable(TEXT("one_enum_with_payload"), Db->OneEnumWithPayload); - RegisterTable(TEXT("one_every_primitive_struct"), Db->OneEveryPrimitiveStruct); - RegisterTable(TEXT("one_every_vec_struct"), Db->OneEveryVecStruct); - RegisterTable(TEXT("one_f32"), Db->OneF32); - RegisterTable(TEXT("one_f64"), Db->OneF64); - RegisterTable(TEXT("one_i128"), Db->OneI128); - RegisterTable(TEXT("one_i16"), Db->OneI16); - RegisterTable(TEXT("one_i256"), Db->OneI256); - RegisterTable(TEXT("one_i32"), Db->OneI32); - RegisterTable(TEXT("one_i64"), Db->OneI64); - RegisterTable(TEXT("one_i8"), Db->OneI8); - RegisterTable(TEXT("one_identity"), Db->OneIdentity); - RegisterTable(TEXT("one_simple_enum"), Db->OneSimpleEnum); - RegisterTable(TEXT("one_string"), Db->OneString); - RegisterTable(TEXT("one_timestamp"), Db->OneTimestamp); - RegisterTable(TEXT("one_u128"), Db->OneU128); - RegisterTable(TEXT("one_u16"), Db->OneU16); - RegisterTable(TEXT("one_u256"), Db->OneU256); - RegisterTable(TEXT("one_u32"), Db->OneU32); - RegisterTable(TEXT("one_u64"), Db->OneU64); - RegisterTable(TEXT("one_u8"), Db->OneU8); - RegisterTable(TEXT("one_unit_struct"), Db->OneUnitStruct); - RegisterTable(TEXT("one_uuid"), Db->OneUuid); - RegisterTable(TEXT("option_every_primitive_struct"), Db->OptionEveryPrimitiveStruct); - RegisterTable(TEXT("option_i32"), Db->OptionI32); - RegisterTable(TEXT("option_identity"), Db->OptionIdentity); - RegisterTable(TEXT("option_simple_enum"), Db->OptionSimpleEnum); - RegisterTable(TEXT("option_string"), Db->OptionString); - RegisterTable(TEXT("option_uuid"), Db->OptionUuid); - RegisterTable(TEXT("option_vec_option_i32"), Db->OptionVecOptionI32); - RegisterTable(TEXT("pk_bool"), Db->PkBool); - RegisterTable(TEXT("pk_connection_id"), Db->PkConnectionId); - RegisterTable(TEXT("pk_i128"), Db->PkI128); - RegisterTable(TEXT("pk_i16"), Db->PkI16); - RegisterTable(TEXT("pk_i256"), Db->PkI256); - RegisterTable(TEXT("pk_i32"), Db->PkI32); - RegisterTable(TEXT("pk_i64"), Db->PkI64); - RegisterTable(TEXT("pk_i8"), Db->PkI8); - RegisterTable(TEXT("pk_identity"), Db->PkIdentity); - RegisterTable(TEXT("pk_simple_enum"), Db->PkSimpleEnum); - RegisterTable(TEXT("pk_string"), Db->PkString); - RegisterTable(TEXT("pk_u128"), Db->PkU128); - RegisterTable(TEXT("pk_u16"), Db->PkU16); - RegisterTable(TEXT("pk_u256"), Db->PkU256); - RegisterTable(TEXT("pk_u32"), Db->PkU32); - RegisterTable(TEXT("pk_u32_two"), Db->PkU32Two); - RegisterTable(TEXT("pk_u64"), Db->PkU64); - RegisterTable(TEXT("pk_u8"), Db->PkU8); - RegisterTable(TEXT("pk_uuid"), Db->PkUuid); - RegisterTable(TEXT("result_every_primitive_struct_string"), Db->ResultEveryPrimitiveStructString); - RegisterTable(TEXT("result_i32_string"), Db->ResultI32String); - RegisterTable(TEXT("result_identity_string"), Db->ResultIdentityString); - RegisterTable(TEXT("result_simple_enum_i32"), Db->ResultSimpleEnumI32); - RegisterTable(TEXT("result_string_i32"), Db->ResultStringI32); - RegisterTable(TEXT("result_vec_i32_string"), Db->ResultVecI32String); - RegisterTable(TEXT("scheduled_table"), Db->ScheduledTable); - RegisterTable(TEXT("table_holds_table"), Db->TableHoldsTable); - RegisterTable(TEXT("unique_bool"), Db->UniqueBool); - RegisterTable(TEXT("unique_connection_id"), Db->UniqueConnectionId); - RegisterTable(TEXT("unique_i128"), Db->UniqueI128); - RegisterTable(TEXT("unique_i16"), Db->UniqueI16); - RegisterTable(TEXT("unique_i256"), Db->UniqueI256); - RegisterTable(TEXT("unique_i32"), Db->UniqueI32); - RegisterTable(TEXT("unique_i64"), Db->UniqueI64); - RegisterTable(TEXT("unique_i8"), Db->UniqueI8); - RegisterTable(TEXT("unique_identity"), Db->UniqueIdentity); - RegisterTable(TEXT("unique_string"), Db->UniqueString); - RegisterTable(TEXT("unique_u128"), Db->UniqueU128); - RegisterTable(TEXT("unique_u16"), Db->UniqueU16); - RegisterTable(TEXT("unique_u256"), Db->UniqueU256); - RegisterTable(TEXT("unique_u32"), Db->UniqueU32); - RegisterTable(TEXT("unique_u64"), Db->UniqueU64); - RegisterTable(TEXT("unique_u8"), Db->UniqueU8); - RegisterTable(TEXT("unique_uuid"), Db->UniqueUuid); - RegisterTable(TEXT("users"), Db->Users); - RegisterTable(TEXT("vec_bool"), Db->VecBool); - RegisterTable(TEXT("vec_byte_struct"), Db->VecByteStruct); - RegisterTable(TEXT("vec_connection_id"), Db->VecConnectionId); - RegisterTable(TEXT("vec_enum_with_payload"), Db->VecEnumWithPayload); - RegisterTable(TEXT("vec_every_primitive_struct"), Db->VecEveryPrimitiveStruct); - RegisterTable(TEXT("vec_every_vec_struct"), Db->VecEveryVecStruct); - RegisterTable(TEXT("vec_f32"), Db->VecF32); - RegisterTable(TEXT("vec_f64"), Db->VecF64); - RegisterTable(TEXT("vec_i128"), Db->VecI128); - RegisterTable(TEXT("vec_i16"), Db->VecI16); - RegisterTable(TEXT("vec_i256"), Db->VecI256); - RegisterTable(TEXT("vec_i32"), Db->VecI32); - RegisterTable(TEXT("vec_i64"), Db->VecI64); - RegisterTable(TEXT("vec_i8"), Db->VecI8); - RegisterTable(TEXT("vec_identity"), Db->VecIdentity); - RegisterTable(TEXT("vec_simple_enum"), Db->VecSimpleEnum); - RegisterTable(TEXT("vec_string"), Db->VecString); - RegisterTable(TEXT("vec_timestamp"), Db->VecTimestamp); - RegisterTable(TEXT("vec_u128"), Db->VecU128); - RegisterTable(TEXT("vec_u16"), Db->VecU16); - RegisterTable(TEXT("vec_u256"), Db->VecU256); - RegisterTable(TEXT("vec_u32"), Db->VecU32); - RegisterTable(TEXT("vec_u64"), Db->VecU64); - RegisterTable(TEXT("vec_u8"), Db->VecU8); - RegisterTable(TEXT("vec_unit_struct"), Db->VecUnitStruct); - RegisterTable(TEXT("vec_uuid"), Db->VecUuid); -} - -FContextBase::FContextBase(UDbConnection* InConn) -{ - Db = InConn->Db; - Reducers = InConn->Reducers; - SetReducerFlags = InConn->SetReducerFlags; - Procedures = InConn->Procedures; - Conn = InConn; -} -bool FContextBase::IsActive() const -{ - return Conn->IsActive(); -} -void FContextBase::Disconnect() -{ - Conn->Disconnect(); -} -USubscriptionBuilder* FContextBase::SubscriptionBuilder() -{ - return Conn->SubscriptionBuilder(); -} -bool FContextBase::TryGetIdentity(FSpacetimeDBIdentity& OutIdentity) const -{ - return Conn->TryGetIdentity(OutIdentity); -} -FSpacetimeDBConnectionId FContextBase::GetConnectionId() const -{ - return Conn->GetConnectionId(); -} - -void URemoteTables::Initialize() -{ - - /** Creating tables */ - BtreeU32 = NewObject(this); - IndexedSimpleEnum = NewObject(this); - LargeTable = NewObject(this); - OneBool = NewObject(this); - OneByteStruct = NewObject(this); - OneConnectionId = NewObject(this); - OneEnumWithPayload = NewObject(this); - OneEveryPrimitiveStruct = NewObject(this); - OneEveryVecStruct = NewObject(this); - OneF32 = NewObject(this); - OneF64 = NewObject(this); - OneI128 = NewObject(this); - OneI16 = NewObject(this); - OneI256 = NewObject(this); - OneI32 = NewObject(this); - OneI64 = NewObject(this); - OneI8 = NewObject(this); - OneIdentity = NewObject(this); - OneSimpleEnum = NewObject(this); - OneString = NewObject(this); - OneTimestamp = NewObject(this); - OneU128 = NewObject(this); - OneU16 = NewObject(this); - OneU256 = NewObject(this); - OneU32 = NewObject(this); - OneU64 = NewObject(this); - OneU8 = NewObject(this); - OneUnitStruct = NewObject(this); - OneUuid = NewObject(this); - OptionEveryPrimitiveStruct = NewObject(this); - OptionI32 = NewObject(this); - OptionIdentity = NewObject(this); - OptionSimpleEnum = NewObject(this); - OptionString = NewObject(this); - OptionUuid = NewObject(this); - OptionVecOptionI32 = NewObject(this); - PkBool = NewObject(this); - PkConnectionId = NewObject(this); - PkI128 = NewObject(this); - PkI16 = NewObject(this); - PkI256 = NewObject(this); - PkI32 = NewObject(this); - PkI64 = NewObject(this); - PkI8 = NewObject(this); - PkIdentity = NewObject(this); - PkSimpleEnum = NewObject(this); - PkString = NewObject(this); - PkU128 = NewObject(this); - PkU16 = NewObject(this); - PkU256 = NewObject(this); - PkU32 = NewObject(this); - PkU32Two = NewObject(this); - PkU64 = NewObject(this); - PkU8 = NewObject(this); - PkUuid = NewObject(this); - ResultEveryPrimitiveStructString = NewObject(this); - ResultI32String = NewObject(this); - ResultIdentityString = NewObject(this); - ResultSimpleEnumI32 = NewObject(this); - ResultStringI32 = NewObject(this); - ResultVecI32String = NewObject(this); - ScheduledTable = NewObject(this); - TableHoldsTable = NewObject(this); - UniqueBool = NewObject(this); - UniqueConnectionId = NewObject(this); - UniqueI128 = NewObject(this); - UniqueI16 = NewObject(this); - UniqueI256 = NewObject(this); - UniqueI32 = NewObject(this); - UniqueI64 = NewObject(this); - UniqueI8 = NewObject(this); - UniqueIdentity = NewObject(this); - UniqueString = NewObject(this); - UniqueU128 = NewObject(this); - UniqueU16 = NewObject(this); - UniqueU256 = NewObject(this); - UniqueU32 = NewObject(this); - UniqueU64 = NewObject(this); - UniqueU8 = NewObject(this); - UniqueUuid = NewObject(this); - Users = NewObject(this); - VecBool = NewObject(this); - VecByteStruct = NewObject(this); - VecConnectionId = NewObject(this); - VecEnumWithPayload = NewObject(this); - VecEveryPrimitiveStruct = NewObject(this); - VecEveryVecStruct = NewObject(this); - VecF32 = NewObject(this); - VecF64 = NewObject(this); - VecI128 = NewObject(this); - VecI16 = NewObject(this); - VecI256 = NewObject(this); - VecI32 = NewObject(this); - VecI64 = NewObject(this); - VecI8 = NewObject(this); - VecIdentity = NewObject(this); - VecSimpleEnum = NewObject(this); - VecString = NewObject(this); - VecTimestamp = NewObject(this); - VecU128 = NewObject(this); - VecU16 = NewObject(this); - VecU256 = NewObject(this); - VecU32 = NewObject(this); - VecU64 = NewObject(this); - VecU8 = NewObject(this); - VecUnitStruct = NewObject(this); - VecUuid = NewObject(this); - /**/ - - /** Initialization */ - BtreeU32->PostInitialize(); - IndexedSimpleEnum->PostInitialize(); - LargeTable->PostInitialize(); - OneBool->PostInitialize(); - OneByteStruct->PostInitialize(); - OneConnectionId->PostInitialize(); - OneEnumWithPayload->PostInitialize(); - OneEveryPrimitiveStruct->PostInitialize(); - OneEveryVecStruct->PostInitialize(); - OneF32->PostInitialize(); - OneF64->PostInitialize(); - OneI128->PostInitialize(); - OneI16->PostInitialize(); - OneI256->PostInitialize(); - OneI32->PostInitialize(); - OneI64->PostInitialize(); - OneI8->PostInitialize(); - OneIdentity->PostInitialize(); - OneSimpleEnum->PostInitialize(); - OneString->PostInitialize(); - OneTimestamp->PostInitialize(); - OneU128->PostInitialize(); - OneU16->PostInitialize(); - OneU256->PostInitialize(); - OneU32->PostInitialize(); - OneU64->PostInitialize(); - OneU8->PostInitialize(); - OneUnitStruct->PostInitialize(); - OneUuid->PostInitialize(); - OptionEveryPrimitiveStruct->PostInitialize(); - OptionI32->PostInitialize(); - OptionIdentity->PostInitialize(); - OptionSimpleEnum->PostInitialize(); - OptionString->PostInitialize(); - OptionUuid->PostInitialize(); - OptionVecOptionI32->PostInitialize(); - PkBool->PostInitialize(); - PkConnectionId->PostInitialize(); - PkI128->PostInitialize(); - PkI16->PostInitialize(); - PkI256->PostInitialize(); - PkI32->PostInitialize(); - PkI64->PostInitialize(); - PkI8->PostInitialize(); - PkIdentity->PostInitialize(); - PkSimpleEnum->PostInitialize(); - PkString->PostInitialize(); - PkU128->PostInitialize(); - PkU16->PostInitialize(); - PkU256->PostInitialize(); - PkU32->PostInitialize(); - PkU32Two->PostInitialize(); - PkU64->PostInitialize(); - PkU8->PostInitialize(); - PkUuid->PostInitialize(); - ResultEveryPrimitiveStructString->PostInitialize(); - ResultI32String->PostInitialize(); - ResultIdentityString->PostInitialize(); - ResultSimpleEnumI32->PostInitialize(); - ResultStringI32->PostInitialize(); - ResultVecI32String->PostInitialize(); - ScheduledTable->PostInitialize(); - TableHoldsTable->PostInitialize(); - UniqueBool->PostInitialize(); - UniqueConnectionId->PostInitialize(); - UniqueI128->PostInitialize(); - UniqueI16->PostInitialize(); - UniqueI256->PostInitialize(); - UniqueI32->PostInitialize(); - UniqueI64->PostInitialize(); - UniqueI8->PostInitialize(); - UniqueIdentity->PostInitialize(); - UniqueString->PostInitialize(); - UniqueU128->PostInitialize(); - UniqueU16->PostInitialize(); - UniqueU256->PostInitialize(); - UniqueU32->PostInitialize(); - UniqueU64->PostInitialize(); - UniqueU8->PostInitialize(); - UniqueUuid->PostInitialize(); - Users->PostInitialize(); - VecBool->PostInitialize(); - VecByteStruct->PostInitialize(); - VecConnectionId->PostInitialize(); - VecEnumWithPayload->PostInitialize(); - VecEveryPrimitiveStruct->PostInitialize(); - VecEveryVecStruct->PostInitialize(); - VecF32->PostInitialize(); - VecF64->PostInitialize(); - VecI128->PostInitialize(); - VecI16->PostInitialize(); - VecI256->PostInitialize(); - VecI32->PostInitialize(); - VecI64->PostInitialize(); - VecI8->PostInitialize(); - VecIdentity->PostInitialize(); - VecSimpleEnum->PostInitialize(); - VecString->PostInitialize(); - VecTimestamp->PostInitialize(); - VecU128->PostInitialize(); - VecU16->PostInitialize(); - VecU256->PostInitialize(); - VecU32->PostInitialize(); - VecU64->PostInitialize(); - VecU8->PostInitialize(); - VecUnitStruct->PostInitialize(); - VecUuid->PostInitialize(); - /**/ -} - -void USetReducerFlags::DeleteFromBtreeU32(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteFromBtreeU32", Flag); -} -void USetReducerFlags::DeleteLargeTable(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteLargeTable", Flag); -} -void USetReducerFlags::DeletePkBool(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkBool", Flag); -} -void USetReducerFlags::DeletePkConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkConnectionId", Flag); -} -void USetReducerFlags::DeletePkI128(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI128", Flag); -} -void USetReducerFlags::DeletePkI16(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI16", Flag); -} -void USetReducerFlags::DeletePkI256(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI256", Flag); -} -void USetReducerFlags::DeletePkI32(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI32", Flag); -} -void USetReducerFlags::DeletePkI64(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI64", Flag); -} -void USetReducerFlags::DeletePkI8(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkI8", Flag); -} -void USetReducerFlags::DeletePkIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkIdentity", Flag); -} -void USetReducerFlags::DeletePkString(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkString", Flag); -} -void USetReducerFlags::DeletePkU128(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU128", Flag); -} -void USetReducerFlags::DeletePkU16(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU16", Flag); -} -void USetReducerFlags::DeletePkU256(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU256", Flag); -} -void USetReducerFlags::DeletePkU32(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU32", Flag); -} -void USetReducerFlags::DeletePkU32InsertPkU32Two(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU32InsertPkU32Two", Flag); -} -void USetReducerFlags::DeletePkU32Two(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU32Two", Flag); -} -void USetReducerFlags::DeletePkU64(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU64", Flag); -} -void USetReducerFlags::DeletePkU8(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkU8", Flag); -} -void USetReducerFlags::DeletePkUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("DeletePkUuid", Flag); -} -void USetReducerFlags::DeleteUniqueBool(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueBool", Flag); -} -void USetReducerFlags::DeleteUniqueConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueConnectionId", Flag); -} -void USetReducerFlags::DeleteUniqueI128(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI128", Flag); -} -void USetReducerFlags::DeleteUniqueI16(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI16", Flag); -} -void USetReducerFlags::DeleteUniqueI256(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI256", Flag); -} -void USetReducerFlags::DeleteUniqueI32(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI32", Flag); -} -void USetReducerFlags::DeleteUniqueI64(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI64", Flag); -} -void USetReducerFlags::DeleteUniqueI8(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueI8", Flag); -} -void USetReducerFlags::DeleteUniqueIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueIdentity", Flag); -} -void USetReducerFlags::DeleteUniqueString(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueString", Flag); -} -void USetReducerFlags::DeleteUniqueU128(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU128", Flag); -} -void USetReducerFlags::DeleteUniqueU16(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU16", Flag); -} -void USetReducerFlags::DeleteUniqueU256(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU256", Flag); -} -void USetReducerFlags::DeleteUniqueU32(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU32", Flag); -} -void USetReducerFlags::DeleteUniqueU64(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU64", Flag); -} -void USetReducerFlags::DeleteUniqueU8(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueU8", Flag); -} -void USetReducerFlags::DeleteUniqueUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("DeleteUniqueUuid", Flag); -} -void USetReducerFlags::InsertCallTimestamp(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallTimestamp", Flag); -} -void USetReducerFlags::InsertCallUuidV4(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallUuidV4", Flag); -} -void USetReducerFlags::InsertCallUuidV7(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallUuidV7", Flag); -} -void USetReducerFlags::InsertCallerOneConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerOneConnectionId", Flag); -} -void USetReducerFlags::InsertCallerOneIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerOneIdentity", Flag); -} -void USetReducerFlags::InsertCallerPkConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerPkConnectionId", Flag); -} -void USetReducerFlags::InsertCallerPkIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerPkIdentity", Flag); -} -void USetReducerFlags::InsertCallerUniqueConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerUniqueConnectionId", Flag); -} -void USetReducerFlags::InsertCallerUniqueIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerUniqueIdentity", Flag); -} -void USetReducerFlags::InsertCallerVecConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerVecConnectionId", Flag); -} -void USetReducerFlags::InsertCallerVecIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertCallerVecIdentity", Flag); -} -void USetReducerFlags::InsertIntoBtreeU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertIntoBtreeU32", Flag); -} -void USetReducerFlags::InsertIntoIndexedSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertIntoIndexedSimpleEnum", Flag); -} -void USetReducerFlags::InsertIntoPkBtreeU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertIntoPkBtreeU32", Flag); -} -void USetReducerFlags::InsertLargeTable(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertLargeTable", Flag); -} -void USetReducerFlags::InsertOneBool(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneBool", Flag); -} -void USetReducerFlags::InsertOneByteStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneByteStruct", Flag); -} -void USetReducerFlags::InsertOneConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneConnectionId", Flag); -} -void USetReducerFlags::InsertOneEnumWithPayload(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneEnumWithPayload", Flag); -} -void USetReducerFlags::InsertOneEveryPrimitiveStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneEveryPrimitiveStruct", Flag); -} -void USetReducerFlags::InsertOneEveryVecStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneEveryVecStruct", Flag); -} -void USetReducerFlags::InsertOneF32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneF32", Flag); -} -void USetReducerFlags::InsertOneF64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneF64", Flag); -} -void USetReducerFlags::InsertOneI128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI128", Flag); -} -void USetReducerFlags::InsertOneI16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI16", Flag); -} -void USetReducerFlags::InsertOneI256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI256", Flag); -} -void USetReducerFlags::InsertOneI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI32", Flag); -} -void USetReducerFlags::InsertOneI64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI64", Flag); -} -void USetReducerFlags::InsertOneI8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneI8", Flag); -} -void USetReducerFlags::InsertOneIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneIdentity", Flag); -} -void USetReducerFlags::InsertOneSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneSimpleEnum", Flag); -} -void USetReducerFlags::InsertOneString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneString", Flag); -} -void USetReducerFlags::InsertOneTimestamp(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneTimestamp", Flag); -} -void USetReducerFlags::InsertOneU128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU128", Flag); -} -void USetReducerFlags::InsertOneU16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU16", Flag); -} -void USetReducerFlags::InsertOneU256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU256", Flag); -} -void USetReducerFlags::InsertOneU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU32", Flag); -} -void USetReducerFlags::InsertOneU64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU64", Flag); -} -void USetReducerFlags::InsertOneU8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneU8", Flag); -} -void USetReducerFlags::InsertOneUnitStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneUnitStruct", Flag); -} -void USetReducerFlags::InsertOneUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOneUuid", Flag); -} -void USetReducerFlags::InsertOptionEveryPrimitiveStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionEveryPrimitiveStruct", Flag); -} -void USetReducerFlags::InsertOptionI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionI32", Flag); -} -void USetReducerFlags::InsertOptionIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionIdentity", Flag); -} -void USetReducerFlags::InsertOptionSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionSimpleEnum", Flag); -} -void USetReducerFlags::InsertOptionString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionString", Flag); -} -void USetReducerFlags::InsertOptionUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionUuid", Flag); -} -void USetReducerFlags::InsertOptionVecOptionI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertOptionVecOptionI32", Flag); -} -void USetReducerFlags::InsertPkBool(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkBool", Flag); -} -void USetReducerFlags::InsertPkConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkConnectionId", Flag); -} -void USetReducerFlags::InsertPkI128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI128", Flag); -} -void USetReducerFlags::InsertPkI16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI16", Flag); -} -void USetReducerFlags::InsertPkI256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI256", Flag); -} -void USetReducerFlags::InsertPkI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI32", Flag); -} -void USetReducerFlags::InsertPkI64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI64", Flag); -} -void USetReducerFlags::InsertPkI8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkI8", Flag); -} -void USetReducerFlags::InsertPkIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkIdentity", Flag); -} -void USetReducerFlags::InsertPkSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkSimpleEnum", Flag); -} -void USetReducerFlags::InsertPkString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkString", Flag); -} -void USetReducerFlags::InsertPkU128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU128", Flag); -} -void USetReducerFlags::InsertPkU16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU16", Flag); -} -void USetReducerFlags::InsertPkU256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU256", Flag); -} -void USetReducerFlags::InsertPkU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU32", Flag); -} -void USetReducerFlags::InsertPkU32Two(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU32Two", Flag); -} -void USetReducerFlags::InsertPkU64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU64", Flag); -} -void USetReducerFlags::InsertPkU8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkU8", Flag); -} -void USetReducerFlags::InsertPkUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPkUuid", Flag); -} -void USetReducerFlags::InsertPrimitivesAsStrings(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertPrimitivesAsStrings", Flag); -} -void USetReducerFlags::InsertResultEveryPrimitiveStructString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultEveryPrimitiveStructString", Flag); -} -void USetReducerFlags::InsertResultI32String(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultI32String", Flag); -} -void USetReducerFlags::InsertResultIdentityString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultIdentityString", Flag); -} -void USetReducerFlags::InsertResultSimpleEnumI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultSimpleEnumI32", Flag); -} -void USetReducerFlags::InsertResultStringI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultStringI32", Flag); -} -void USetReducerFlags::InsertResultVecI32String(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertResultVecI32String", Flag); -} -void USetReducerFlags::InsertTableHoldsTable(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertTableHoldsTable", Flag); -} -void USetReducerFlags::InsertUniqueBool(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueBool", Flag); -} -void USetReducerFlags::InsertUniqueConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueConnectionId", Flag); -} -void USetReducerFlags::InsertUniqueI128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI128", Flag); -} -void USetReducerFlags::InsertUniqueI16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI16", Flag); -} -void USetReducerFlags::InsertUniqueI256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI256", Flag); -} -void USetReducerFlags::InsertUniqueI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI32", Flag); -} -void USetReducerFlags::InsertUniqueI64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI64", Flag); -} -void USetReducerFlags::InsertUniqueI8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueI8", Flag); -} -void USetReducerFlags::InsertUniqueIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueIdentity", Flag); -} -void USetReducerFlags::InsertUniqueString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueString", Flag); -} -void USetReducerFlags::InsertUniqueU128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU128", Flag); -} -void USetReducerFlags::InsertUniqueU16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU16", Flag); -} -void USetReducerFlags::InsertUniqueU256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU256", Flag); -} -void USetReducerFlags::InsertUniqueU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU32", Flag); -} -void USetReducerFlags::InsertUniqueU32UpdatePkU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU32UpdatePkU32", Flag); -} -void USetReducerFlags::InsertUniqueU64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU64", Flag); -} -void USetReducerFlags::InsertUniqueU8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueU8", Flag); -} -void USetReducerFlags::InsertUniqueUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUniqueUuid", Flag); -} -void USetReducerFlags::InsertUser(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertUser", Flag); -} -void USetReducerFlags::InsertVecBool(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecBool", Flag); -} -void USetReducerFlags::InsertVecByteStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecByteStruct", Flag); -} -void USetReducerFlags::InsertVecConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecConnectionId", Flag); -} -void USetReducerFlags::InsertVecEnumWithPayload(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecEnumWithPayload", Flag); -} -void USetReducerFlags::InsertVecEveryPrimitiveStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecEveryPrimitiveStruct", Flag); -} -void USetReducerFlags::InsertVecEveryVecStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecEveryVecStruct", Flag); -} -void USetReducerFlags::InsertVecF32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecF32", Flag); -} -void USetReducerFlags::InsertVecF64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecF64", Flag); -} -void USetReducerFlags::InsertVecI128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI128", Flag); -} -void USetReducerFlags::InsertVecI16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI16", Flag); -} -void USetReducerFlags::InsertVecI256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI256", Flag); -} -void USetReducerFlags::InsertVecI32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI32", Flag); -} -void USetReducerFlags::InsertVecI64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI64", Flag); -} -void USetReducerFlags::InsertVecI8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecI8", Flag); -} -void USetReducerFlags::InsertVecIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecIdentity", Flag); -} -void USetReducerFlags::InsertVecSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecSimpleEnum", Flag); -} -void USetReducerFlags::InsertVecString(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecString", Flag); -} -void USetReducerFlags::InsertVecTimestamp(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecTimestamp", Flag); -} -void USetReducerFlags::InsertVecU128(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU128", Flag); -} -void USetReducerFlags::InsertVecU16(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU16", Flag); -} -void USetReducerFlags::InsertVecU256(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU256", Flag); -} -void USetReducerFlags::InsertVecU32(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU32", Flag); -} -void USetReducerFlags::InsertVecU64(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU64", Flag); -} -void USetReducerFlags::InsertVecU8(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecU8", Flag); -} -void USetReducerFlags::InsertVecUnitStruct(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecUnitStruct", Flag); -} -void USetReducerFlags::InsertVecUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("InsertVecUuid", Flag); -} -void USetReducerFlags::NoOpSucceeds(ECallReducerFlags Flag) -{ - FlagMap.Add("NoOpSucceeds", Flag); -} -void USetReducerFlags::SortedUuidsInsert(ECallReducerFlags Flag) -{ - FlagMap.Add("SortedUuidsInsert", Flag); -} -void USetReducerFlags::UpdateIndexedSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateIndexedSimpleEnum", Flag); -} -void USetReducerFlags::UpdatePkBool(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkBool", Flag); -} -void USetReducerFlags::UpdatePkConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkConnectionId", Flag); -} -void USetReducerFlags::UpdatePkI128(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI128", Flag); -} -void USetReducerFlags::UpdatePkI16(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI16", Flag); -} -void USetReducerFlags::UpdatePkI256(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI256", Flag); -} -void USetReducerFlags::UpdatePkI32(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI32", Flag); -} -void USetReducerFlags::UpdatePkI64(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI64", Flag); -} -void USetReducerFlags::UpdatePkI8(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkI8", Flag); -} -void USetReducerFlags::UpdatePkIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkIdentity", Flag); -} -void USetReducerFlags::UpdatePkSimpleEnum(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkSimpleEnum", Flag); -} -void USetReducerFlags::UpdatePkString(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkString", Flag); -} -void USetReducerFlags::UpdatePkU128(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU128", Flag); -} -void USetReducerFlags::UpdatePkU16(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU16", Flag); -} -void USetReducerFlags::UpdatePkU256(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU256", Flag); -} -void USetReducerFlags::UpdatePkU32(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU32", Flag); -} -void USetReducerFlags::UpdatePkU32Two(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU32Two", Flag); -} -void USetReducerFlags::UpdatePkU64(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU64", Flag); -} -void USetReducerFlags::UpdatePkU8(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkU8", Flag); -} -void USetReducerFlags::UpdatePkUuid(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdatePkUuid", Flag); -} -void USetReducerFlags::UpdateUniqueBool(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueBool", Flag); -} -void USetReducerFlags::UpdateUniqueConnectionId(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueConnectionId", Flag); -} -void USetReducerFlags::UpdateUniqueI128(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI128", Flag); -} -void USetReducerFlags::UpdateUniqueI16(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI16", Flag); -} -void USetReducerFlags::UpdateUniqueI256(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI256", Flag); -} -void USetReducerFlags::UpdateUniqueI32(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI32", Flag); -} -void USetReducerFlags::UpdateUniqueI64(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI64", Flag); -} -void USetReducerFlags::UpdateUniqueI8(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueI8", Flag); -} -void USetReducerFlags::UpdateUniqueIdentity(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueIdentity", Flag); -} -void USetReducerFlags::UpdateUniqueString(ECallReducerFlags Flag) -{ - FlagMap.Add("UpdateUniqueString", Flag); -} -void USetReducerFlags::UpdateUniqueU128(ECallReducerFlags Flag) +FContextBase::FContextBase(UDbConnection* InConn) { - FlagMap.Add("UpdateUniqueU128", Flag); + Db = InConn->Db; + Reducers = InConn->Reducers; + Procedures = InConn->Procedures; + Conn = InConn; } -void USetReducerFlags::UpdateUniqueU16(ECallReducerFlags Flag) +bool FContextBase::IsActive() const { - FlagMap.Add("UpdateUniqueU16", Flag); + return Conn->IsActive(); } -void USetReducerFlags::UpdateUniqueU256(ECallReducerFlags Flag) +void FContextBase::Disconnect() { - FlagMap.Add("UpdateUniqueU256", Flag); + Conn->Disconnect(); } -void USetReducerFlags::UpdateUniqueU32(ECallReducerFlags Flag) +USubscriptionBuilder* FContextBase::SubscriptionBuilder() { - FlagMap.Add("UpdateUniqueU32", Flag); + return Conn->SubscriptionBuilder(); } -void USetReducerFlags::UpdateUniqueU64(ECallReducerFlags Flag) +bool FContextBase::TryGetIdentity(FSpacetimeDBIdentity& OutIdentity) const { - FlagMap.Add("UpdateUniqueU64", Flag); + return Conn->TryGetIdentity(OutIdentity); } -void USetReducerFlags::UpdateUniqueU8(ECallReducerFlags Flag) +FSpacetimeDBConnectionId FContextBase::GetConnectionId() const { - FlagMap.Add("UpdateUniqueU8", Flag); + return Conn->GetConnectionId(); } -void USetReducerFlags::UpdateUniqueUuid(ECallReducerFlags Flag) + +void URemoteTables::Initialize() { - FlagMap.Add("UpdateUniqueUuid", Flag); + + /** Creating tables */ + BtreeU32 = NewObject(this); + IndexedSimpleEnum = NewObject(this); + LargeTable = NewObject(this); + OneBool = NewObject(this); + OneByteStruct = NewObject(this); + OneConnectionId = NewObject(this); + OneEnumWithPayload = NewObject(this); + OneEveryPrimitiveStruct = NewObject(this); + OneEveryVecStruct = NewObject(this); + OneF32 = NewObject(this); + OneF64 = NewObject(this); + OneI128 = NewObject(this); + OneI16 = NewObject(this); + OneI256 = NewObject(this); + OneI32 = NewObject(this); + OneI64 = NewObject(this); + OneI8 = NewObject(this); + OneIdentity = NewObject(this); + OneSimpleEnum = NewObject(this); + OneString = NewObject(this); + OneTimestamp = NewObject(this); + OneU128 = NewObject(this); + OneU16 = NewObject(this); + OneU256 = NewObject(this); + OneU32 = NewObject(this); + OneU64 = NewObject(this); + OneU8 = NewObject(this); + OneUnitStruct = NewObject(this); + OneUuid = NewObject(this); + OptionEveryPrimitiveStruct = NewObject(this); + OptionI32 = NewObject(this); + OptionIdentity = NewObject(this); + OptionSimpleEnum = NewObject(this); + OptionString = NewObject(this); + OptionUuid = NewObject(this); + OptionVecOptionI32 = NewObject(this); + PkBool = NewObject(this); + PkConnectionId = NewObject(this); + PkI128 = NewObject(this); + PkI16 = NewObject(this); + PkI256 = NewObject(this); + PkI32 = NewObject(this); + PkI64 = NewObject(this); + PkI8 = NewObject(this); + PkIdentity = NewObject(this); + PkSimpleEnum = NewObject(this); + PkString = NewObject(this); + PkU128 = NewObject(this); + PkU16 = NewObject(this); + PkU256 = NewObject(this); + PkU32 = NewObject(this); + PkU32Two = NewObject(this); + PkU64 = NewObject(this); + PkU8 = NewObject(this); + PkUuid = NewObject(this); + ResultEveryPrimitiveStructString = NewObject(this); + ResultI32String = NewObject(this); + ResultIdentityString = NewObject(this); + ResultSimpleEnumI32 = NewObject(this); + ResultStringI32 = NewObject(this); + ResultVecI32String = NewObject(this); + ScheduledTable = NewObject(this); + TableHoldsTable = NewObject(this); + UniqueBool = NewObject(this); + UniqueConnectionId = NewObject(this); + UniqueI128 = NewObject(this); + UniqueI16 = NewObject(this); + UniqueI256 = NewObject(this); + UniqueI32 = NewObject(this); + UniqueI64 = NewObject(this); + UniqueI8 = NewObject(this); + UniqueIdentity = NewObject(this); + UniqueString = NewObject(this); + UniqueU128 = NewObject(this); + UniqueU16 = NewObject(this); + UniqueU256 = NewObject(this); + UniqueU32 = NewObject(this); + UniqueU64 = NewObject(this); + UniqueU8 = NewObject(this); + UniqueUuid = NewObject(this); + Users = NewObject(this); + VecBool = NewObject(this); + VecByteStruct = NewObject(this); + VecConnectionId = NewObject(this); + VecEnumWithPayload = NewObject(this); + VecEveryPrimitiveStruct = NewObject(this); + VecEveryVecStruct = NewObject(this); + VecF32 = NewObject(this); + VecF64 = NewObject(this); + VecI128 = NewObject(this); + VecI16 = NewObject(this); + VecI256 = NewObject(this); + VecI32 = NewObject(this); + VecI64 = NewObject(this); + VecI8 = NewObject(this); + VecIdentity = NewObject(this); + VecSimpleEnum = NewObject(this); + VecString = NewObject(this); + VecTimestamp = NewObject(this); + VecU128 = NewObject(this); + VecU16 = NewObject(this); + VecU256 = NewObject(this); + VecU32 = NewObject(this); + VecU64 = NewObject(this); + VecU8 = NewObject(this); + VecUnitStruct = NewObject(this); + VecUuid = NewObject(this); + /**/ + + /** Initialization */ + BtreeU32->PostInitialize(); + IndexedSimpleEnum->PostInitialize(); + LargeTable->PostInitialize(); + OneBool->PostInitialize(); + OneByteStruct->PostInitialize(); + OneConnectionId->PostInitialize(); + OneEnumWithPayload->PostInitialize(); + OneEveryPrimitiveStruct->PostInitialize(); + OneEveryVecStruct->PostInitialize(); + OneF32->PostInitialize(); + OneF64->PostInitialize(); + OneI128->PostInitialize(); + OneI16->PostInitialize(); + OneI256->PostInitialize(); + OneI32->PostInitialize(); + OneI64->PostInitialize(); + OneI8->PostInitialize(); + OneIdentity->PostInitialize(); + OneSimpleEnum->PostInitialize(); + OneString->PostInitialize(); + OneTimestamp->PostInitialize(); + OneU128->PostInitialize(); + OneU16->PostInitialize(); + OneU256->PostInitialize(); + OneU32->PostInitialize(); + OneU64->PostInitialize(); + OneU8->PostInitialize(); + OneUnitStruct->PostInitialize(); + OneUuid->PostInitialize(); + OptionEveryPrimitiveStruct->PostInitialize(); + OptionI32->PostInitialize(); + OptionIdentity->PostInitialize(); + OptionSimpleEnum->PostInitialize(); + OptionString->PostInitialize(); + OptionUuid->PostInitialize(); + OptionVecOptionI32->PostInitialize(); + PkBool->PostInitialize(); + PkConnectionId->PostInitialize(); + PkI128->PostInitialize(); + PkI16->PostInitialize(); + PkI256->PostInitialize(); + PkI32->PostInitialize(); + PkI64->PostInitialize(); + PkI8->PostInitialize(); + PkIdentity->PostInitialize(); + PkSimpleEnum->PostInitialize(); + PkString->PostInitialize(); + PkU128->PostInitialize(); + PkU16->PostInitialize(); + PkU256->PostInitialize(); + PkU32->PostInitialize(); + PkU32Two->PostInitialize(); + PkU64->PostInitialize(); + PkU8->PostInitialize(); + PkUuid->PostInitialize(); + ResultEveryPrimitiveStructString->PostInitialize(); + ResultI32String->PostInitialize(); + ResultIdentityString->PostInitialize(); + ResultSimpleEnumI32->PostInitialize(); + ResultStringI32->PostInitialize(); + ResultVecI32String->PostInitialize(); + ScheduledTable->PostInitialize(); + TableHoldsTable->PostInitialize(); + UniqueBool->PostInitialize(); + UniqueConnectionId->PostInitialize(); + UniqueI128->PostInitialize(); + UniqueI16->PostInitialize(); + UniqueI256->PostInitialize(); + UniqueI32->PostInitialize(); + UniqueI64->PostInitialize(); + UniqueI8->PostInitialize(); + UniqueIdentity->PostInitialize(); + UniqueString->PostInitialize(); + UniqueU128->PostInitialize(); + UniqueU16->PostInitialize(); + UniqueU256->PostInitialize(); + UniqueU32->PostInitialize(); + UniqueU64->PostInitialize(); + UniqueU8->PostInitialize(); + UniqueUuid->PostInitialize(); + Users->PostInitialize(); + VecBool->PostInitialize(); + VecByteStruct->PostInitialize(); + VecConnectionId->PostInitialize(); + VecEnumWithPayload->PostInitialize(); + VecEveryPrimitiveStruct->PostInitialize(); + VecEveryVecStruct->PostInitialize(); + VecF32->PostInitialize(); + VecF64->PostInitialize(); + VecI128->PostInitialize(); + VecI16->PostInitialize(); + VecI256->PostInitialize(); + VecI32->PostInitialize(); + VecI64->PostInitialize(); + VecI8->PostInitialize(); + VecIdentity->PostInitialize(); + VecSimpleEnum->PostInitialize(); + VecString->PostInitialize(); + VecTimestamp->PostInitialize(); + VecU128->PostInitialize(); + VecU16->PostInitialize(); + VecU256->PostInitialize(); + VecU32->PostInitialize(); + VecU64->PostInitialize(); + VecU8->PostInitialize(); + VecUnitStruct->PostInitialize(); + VecUuid->PostInitialize(); + /**/ } void URemoteReducers::DeleteFromBtreeU32(const TArray& Rows) @@ -2474,7 +492,9 @@ void URemoteReducers::DeleteFromBtreeU32(const TArray& Rows) return; } - Conn->CallReducerTyped(TEXT("delete_from_btree_u32"), FDeleteFromBtreeU32Args(Rows), SetCallReducerFlags); + FDeleteFromBtreeU32Args ReducerArgs(Rows); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_from_btree_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteFromBtreeU32(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteFromBtreeU32(const FReducerEventContext& Context, const UDeleteFromBtreeU32Reducer* Args) @@ -2518,7 +538,9 @@ void URemoteReducers::DeleteLargeTable(const uint8 A, const uint16 B, const uint return; } - Conn->CallReducerTyped(TEXT("delete_large_table"), FDeleteLargeTableArgs(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V), SetCallReducerFlags); + FDeleteLargeTableArgs ReducerArgs(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_large_table"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteLargeTable(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteLargeTable(const FReducerEventContext& Context, const UDeleteLargeTableReducer* Args) @@ -2585,7 +607,9 @@ void URemoteReducers::DeletePkBool(const bool B) return; } - Conn->CallReducerTyped(TEXT("delete_pk_bool"), FDeletePkBoolArgs(B), SetCallReducerFlags); + FDeletePkBoolArgs ReducerArgs(B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkBool(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkBool(const FReducerEventContext& Context, const UDeletePkBoolReducer* Args) @@ -2629,7 +653,9 @@ void URemoteReducers::DeletePkConnectionId(const FSpacetimeDBConnectionId& A) return; } - Conn->CallReducerTyped(TEXT("delete_pk_connection_id"), FDeletePkConnectionIdArgs(A), SetCallReducerFlags); + FDeletePkConnectionIdArgs ReducerArgs(A); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkConnectionId(const FReducerEventContext& Context, const UDeletePkConnectionIdReducer* Args) @@ -2673,7 +699,9 @@ void URemoteReducers::DeletePkI128(const FSpacetimeDBInt128& N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i128"), FDeletePkI128Args(N), SetCallReducerFlags); + FDeletePkI128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI128(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI128(const FReducerEventContext& Context, const UDeletePkI128Reducer* Args) @@ -2717,7 +745,9 @@ void URemoteReducers::DeletePkI16(const int16 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i16"), FDeletePkI16Args(N), SetCallReducerFlags); + FDeletePkI16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI16(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI16(const FReducerEventContext& Context, const UDeletePkI16Reducer* Args) @@ -2761,7 +791,9 @@ void URemoteReducers::DeletePkI256(const FSpacetimeDBInt256& N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i256"), FDeletePkI256Args(N), SetCallReducerFlags); + FDeletePkI256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI256(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI256(const FReducerEventContext& Context, const UDeletePkI256Reducer* Args) @@ -2805,7 +837,9 @@ void URemoteReducers::DeletePkI32(const int32 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i32"), FDeletePkI32Args(N), SetCallReducerFlags); + FDeletePkI32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI32(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI32(const FReducerEventContext& Context, const UDeletePkI32Reducer* Args) @@ -2849,7 +883,9 @@ void URemoteReducers::DeletePkI64(const int64 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i64"), FDeletePkI64Args(N), SetCallReducerFlags); + FDeletePkI64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI64(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI64(const FReducerEventContext& Context, const UDeletePkI64Reducer* Args) @@ -2893,7 +929,9 @@ void URemoteReducers::DeletePkI8(const int8 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_i8"), FDeletePkI8Args(N), SetCallReducerFlags); + FDeletePkI8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkI8(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkI8(const FReducerEventContext& Context, const UDeletePkI8Reducer* Args) @@ -2937,7 +975,9 @@ void URemoteReducers::DeletePkIdentity(const FSpacetimeDBIdentity& I) return; } - Conn->CallReducerTyped(TEXT("delete_pk_identity"), FDeletePkIdentityArgs(I), SetCallReducerFlags); + FDeletePkIdentityArgs ReducerArgs(I); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkIdentity(const FReducerEventContext& Context, const UDeletePkIdentityReducer* Args) @@ -2981,7 +1021,9 @@ void URemoteReducers::DeletePkString(const FString& S) return; } - Conn->CallReducerTyped(TEXT("delete_pk_string"), FDeletePkStringArgs(S), SetCallReducerFlags); + FDeletePkStringArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkString(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkString(const FReducerEventContext& Context, const UDeletePkStringReducer* Args) @@ -3025,7 +1067,9 @@ void URemoteReducers::DeletePkU128(const FSpacetimeDBUInt128& N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u128"), FDeletePkU128Args(N), SetCallReducerFlags); + FDeletePkU128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU128(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU128(const FReducerEventContext& Context, const UDeletePkU128Reducer* Args) @@ -3069,7 +1113,9 @@ void URemoteReducers::DeletePkU16(const uint16 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u16"), FDeletePkU16Args(N), SetCallReducerFlags); + FDeletePkU16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU16(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU16(const FReducerEventContext& Context, const UDeletePkU16Reducer* Args) @@ -3113,7 +1159,9 @@ void URemoteReducers::DeletePkU256(const FSpacetimeDBUInt256& N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u256"), FDeletePkU256Args(N), SetCallReducerFlags); + FDeletePkU256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU256(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU256(const FReducerEventContext& Context, const UDeletePkU256Reducer* Args) @@ -3157,7 +1205,9 @@ void URemoteReducers::DeletePkU32(const uint32 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u32"), FDeletePkU32Args(N), SetCallReducerFlags); + FDeletePkU32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU32(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU32(const FReducerEventContext& Context, const UDeletePkU32Reducer* Args) @@ -3201,7 +1251,9 @@ void URemoteReducers::DeletePkU32InsertPkU32Two(const uint32 N, const int32 Data return; } - Conn->CallReducerTyped(TEXT("delete_pk_u32_insert_pk_u32_two"), FDeletePkU32InsertPkU32TwoArgs(N, Data), SetCallReducerFlags); + FDeletePkU32InsertPkU32TwoArgs ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_32_insert_pk_u_32_two"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU32InsertPkU32Two(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU32InsertPkU32Two(const FReducerEventContext& Context, const UDeletePkU32InsertPkU32TwoReducer* Args) @@ -3245,7 +1297,9 @@ void URemoteReducers::DeletePkU32Two(const uint32 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u32_two"), FDeletePkU32TwoArgs(N), SetCallReducerFlags); + FDeletePkU32TwoArgs ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_32_two"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU32Two(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU32Two(const FReducerEventContext& Context, const UDeletePkU32TwoReducer* Args) @@ -3289,7 +1343,9 @@ void URemoteReducers::DeletePkU64(const uint64 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u64"), FDeletePkU64Args(N), SetCallReducerFlags); + FDeletePkU64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU64(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU64(const FReducerEventContext& Context, const UDeletePkU64Reducer* Args) @@ -3333,7 +1389,9 @@ void URemoteReducers::DeletePkU8(const uint8 N) return; } - Conn->CallReducerTyped(TEXT("delete_pk_u8"), FDeletePkU8Args(N), SetCallReducerFlags); + FDeletePkU8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkU8(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkU8(const FReducerEventContext& Context, const UDeletePkU8Reducer* Args) @@ -3377,7 +1435,9 @@ void URemoteReducers::DeletePkUuid(const FSpacetimeDBUuid& U) return; } - Conn->CallReducerTyped(TEXT("delete_pk_uuid"), FDeletePkUuidArgs(U), SetCallReducerFlags); + FDeletePkUuidArgs ReducerArgs(U); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_pk_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeletePkUuid(ReducerArgs)); } } bool URemoteReducers::InvokeDeletePkUuid(const FReducerEventContext& Context, const UDeletePkUuidReducer* Args) @@ -3421,7 +1481,9 @@ void URemoteReducers::DeleteUniqueBool(const bool B) return; } - Conn->CallReducerTyped(TEXT("delete_unique_bool"), FDeleteUniqueBoolArgs(B), SetCallReducerFlags); + FDeleteUniqueBoolArgs ReducerArgs(B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueBool(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueBool(const FReducerEventContext& Context, const UDeleteUniqueBoolReducer* Args) @@ -3465,7 +1527,9 @@ void URemoteReducers::DeleteUniqueConnectionId(const FSpacetimeDBConnectionId& A return; } - Conn->CallReducerTyped(TEXT("delete_unique_connection_id"), FDeleteUniqueConnectionIdArgs(A), SetCallReducerFlags); + FDeleteUniqueConnectionIdArgs ReducerArgs(A); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueConnectionId(const FReducerEventContext& Context, const UDeleteUniqueConnectionIdReducer* Args) @@ -3509,7 +1573,9 @@ void URemoteReducers::DeleteUniqueI128(const FSpacetimeDBInt128& N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i128"), FDeleteUniqueI128Args(N), SetCallReducerFlags); + FDeleteUniqueI128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI128(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI128(const FReducerEventContext& Context, const UDeleteUniqueI128Reducer* Args) @@ -3553,7 +1619,9 @@ void URemoteReducers::DeleteUniqueI16(const int16 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i16"), FDeleteUniqueI16Args(N), SetCallReducerFlags); + FDeleteUniqueI16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI16(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI16(const FReducerEventContext& Context, const UDeleteUniqueI16Reducer* Args) @@ -3597,7 +1665,9 @@ void URemoteReducers::DeleteUniqueI256(const FSpacetimeDBInt256& N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i256"), FDeleteUniqueI256Args(N), SetCallReducerFlags); + FDeleteUniqueI256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI256(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI256(const FReducerEventContext& Context, const UDeleteUniqueI256Reducer* Args) @@ -3641,7 +1711,9 @@ void URemoteReducers::DeleteUniqueI32(const int32 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i32"), FDeleteUniqueI32Args(N), SetCallReducerFlags); + FDeleteUniqueI32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI32(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI32(const FReducerEventContext& Context, const UDeleteUniqueI32Reducer* Args) @@ -3685,7 +1757,9 @@ void URemoteReducers::DeleteUniqueI64(const int64 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i64"), FDeleteUniqueI64Args(N), SetCallReducerFlags); + FDeleteUniqueI64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI64(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI64(const FReducerEventContext& Context, const UDeleteUniqueI64Reducer* Args) @@ -3729,7 +1803,9 @@ void URemoteReducers::DeleteUniqueI8(const int8 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_i8"), FDeleteUniqueI8Args(N), SetCallReducerFlags); + FDeleteUniqueI8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueI8(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueI8(const FReducerEventContext& Context, const UDeleteUniqueI8Reducer* Args) @@ -3773,7 +1849,9 @@ void URemoteReducers::DeleteUniqueIdentity(const FSpacetimeDBIdentity& I) return; } - Conn->CallReducerTyped(TEXT("delete_unique_identity"), FDeleteUniqueIdentityArgs(I), SetCallReducerFlags); + FDeleteUniqueIdentityArgs ReducerArgs(I); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueIdentity(const FReducerEventContext& Context, const UDeleteUniqueIdentityReducer* Args) @@ -3817,7 +1895,9 @@ void URemoteReducers::DeleteUniqueString(const FString& S) return; } - Conn->CallReducerTyped(TEXT("delete_unique_string"), FDeleteUniqueStringArgs(S), SetCallReducerFlags); + FDeleteUniqueStringArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueString(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueString(const FReducerEventContext& Context, const UDeleteUniqueStringReducer* Args) @@ -3861,7 +1941,9 @@ void URemoteReducers::DeleteUniqueU128(const FSpacetimeDBUInt128& N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u128"), FDeleteUniqueU128Args(N), SetCallReducerFlags); + FDeleteUniqueU128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU128(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU128(const FReducerEventContext& Context, const UDeleteUniqueU128Reducer* Args) @@ -3905,7 +1987,9 @@ void URemoteReducers::DeleteUniqueU16(const uint16 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u16"), FDeleteUniqueU16Args(N), SetCallReducerFlags); + FDeleteUniqueU16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU16(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU16(const FReducerEventContext& Context, const UDeleteUniqueU16Reducer* Args) @@ -3949,7 +2033,9 @@ void URemoteReducers::DeleteUniqueU256(const FSpacetimeDBUInt256& N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u256"), FDeleteUniqueU256Args(N), SetCallReducerFlags); + FDeleteUniqueU256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU256(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU256(const FReducerEventContext& Context, const UDeleteUniqueU256Reducer* Args) @@ -3993,7 +2079,9 @@ void URemoteReducers::DeleteUniqueU32(const uint32 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u32"), FDeleteUniqueU32Args(N), SetCallReducerFlags); + FDeleteUniqueU32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU32(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU32(const FReducerEventContext& Context, const UDeleteUniqueU32Reducer* Args) @@ -4037,7 +2125,9 @@ void URemoteReducers::DeleteUniqueU64(const uint64 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u64"), FDeleteUniqueU64Args(N), SetCallReducerFlags); + FDeleteUniqueU64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU64(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU64(const FReducerEventContext& Context, const UDeleteUniqueU64Reducer* Args) @@ -4081,7 +2171,9 @@ void URemoteReducers::DeleteUniqueU8(const uint8 N) return; } - Conn->CallReducerTyped(TEXT("delete_unique_u8"), FDeleteUniqueU8Args(N), SetCallReducerFlags); + FDeleteUniqueU8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueU8(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueU8(const FReducerEventContext& Context, const UDeleteUniqueU8Reducer* Args) @@ -4125,7 +2217,9 @@ void URemoteReducers::DeleteUniqueUuid(const FSpacetimeDBUuid& U) return; } - Conn->CallReducerTyped(TEXT("delete_unique_uuid"), FDeleteUniqueUuidArgs(U), SetCallReducerFlags); + FDeleteUniqueUuidArgs ReducerArgs(U); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("delete_unique_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::DeleteUniqueUuid(ReducerArgs)); } } bool URemoteReducers::InvokeDeleteUniqueUuid(const FReducerEventContext& Context, const UDeleteUniqueUuidReducer* Args) @@ -4169,7 +2263,9 @@ void URemoteReducers::InsertCallTimestamp() return; } - Conn->CallReducerTyped(TEXT("insert_call_timestamp"), FInsertCallTimestampArgs(), SetCallReducerFlags); + FInsertCallTimestampArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_call_timestamp"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallTimestamp(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallTimestamp(const FReducerEventContext& Context, const UInsertCallTimestampReducer* Args) @@ -4213,7 +2309,9 @@ void URemoteReducers::InsertCallUuidV4() return; } - Conn->CallReducerTyped(TEXT("insert_call_uuid_v4"), FInsertCallUuidV4Args(), SetCallReducerFlags); + FInsertCallUuidV4Args ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_call_uuid_v_4"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallUuidV4(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallUuidV4(const FReducerEventContext& Context, const UInsertCallUuidV4Reducer* Args) @@ -4257,7 +2355,9 @@ void URemoteReducers::InsertCallUuidV7() return; } - Conn->CallReducerTyped(TEXT("insert_call_uuid_v7"), FInsertCallUuidV7Args(), SetCallReducerFlags); + FInsertCallUuidV7Args ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_call_uuid_v_7"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallUuidV7(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallUuidV7(const FReducerEventContext& Context, const UInsertCallUuidV7Reducer* Args) @@ -4301,7 +2401,9 @@ void URemoteReducers::InsertCallerOneConnectionId() return; } - Conn->CallReducerTyped(TEXT("insert_caller_one_connection_id"), FInsertCallerOneConnectionIdArgs(), SetCallReducerFlags); + FInsertCallerOneConnectionIdArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_one_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerOneConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerOneConnectionId(const FReducerEventContext& Context, const UInsertCallerOneConnectionIdReducer* Args) @@ -4345,7 +2447,9 @@ void URemoteReducers::InsertCallerOneIdentity() return; } - Conn->CallReducerTyped(TEXT("insert_caller_one_identity"), FInsertCallerOneIdentityArgs(), SetCallReducerFlags); + FInsertCallerOneIdentityArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_one_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerOneIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerOneIdentity(const FReducerEventContext& Context, const UInsertCallerOneIdentityReducer* Args) @@ -4389,7 +2493,9 @@ void URemoteReducers::InsertCallerPkConnectionId(const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_caller_pk_connection_id"), FInsertCallerPkConnectionIdArgs(Data), SetCallReducerFlags); + FInsertCallerPkConnectionIdArgs ReducerArgs(Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_pk_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerPkConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerPkConnectionId(const FReducerEventContext& Context, const UInsertCallerPkConnectionIdReducer* Args) @@ -4433,7 +2539,9 @@ void URemoteReducers::InsertCallerPkIdentity(const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_caller_pk_identity"), FInsertCallerPkIdentityArgs(Data), SetCallReducerFlags); + FInsertCallerPkIdentityArgs ReducerArgs(Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_pk_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerPkIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerPkIdentity(const FReducerEventContext& Context, const UInsertCallerPkIdentityReducer* Args) @@ -4477,7 +2585,9 @@ void URemoteReducers::InsertCallerUniqueConnectionId(const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_caller_unique_connection_id"), FInsertCallerUniqueConnectionIdArgs(Data), SetCallReducerFlags); + FInsertCallerUniqueConnectionIdArgs ReducerArgs(Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_unique_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerUniqueConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerUniqueConnectionId(const FReducerEventContext& Context, const UInsertCallerUniqueConnectionIdReducer* Args) @@ -4521,7 +2631,9 @@ void URemoteReducers::InsertCallerUniqueIdentity(const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_caller_unique_identity"), FInsertCallerUniqueIdentityArgs(Data), SetCallReducerFlags); + FInsertCallerUniqueIdentityArgs ReducerArgs(Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_unique_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerUniqueIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerUniqueIdentity(const FReducerEventContext& Context, const UInsertCallerUniqueIdentityReducer* Args) @@ -4565,7 +2677,9 @@ void URemoteReducers::InsertCallerVecConnectionId() return; } - Conn->CallReducerTyped(TEXT("insert_caller_vec_connection_id"), FInsertCallerVecConnectionIdArgs(), SetCallReducerFlags); + FInsertCallerVecConnectionIdArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_vec_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerVecConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerVecConnectionId(const FReducerEventContext& Context, const UInsertCallerVecConnectionIdReducer* Args) @@ -4609,7 +2723,9 @@ void URemoteReducers::InsertCallerVecIdentity() return; } - Conn->CallReducerTyped(TEXT("insert_caller_vec_identity"), FInsertCallerVecIdentityArgs(), SetCallReducerFlags); + FInsertCallerVecIdentityArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_caller_vec_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertCallerVecIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertCallerVecIdentity(const FReducerEventContext& Context, const UInsertCallerVecIdentityReducer* Args) @@ -4653,7 +2769,9 @@ void URemoteReducers::InsertIntoBtreeU32(const TArray& Rows) return; } - Conn->CallReducerTyped(TEXT("insert_into_btree_u32"), FInsertIntoBtreeU32Args(Rows), SetCallReducerFlags); + FInsertIntoBtreeU32Args ReducerArgs(Rows); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_into_btree_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertIntoBtreeU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertIntoBtreeU32(const FReducerEventContext& Context, const UInsertIntoBtreeU32Reducer* Args) @@ -4697,7 +2815,9 @@ void URemoteReducers::InsertIntoIndexedSimpleEnum(const ESimpleEnumType& N) return; } - Conn->CallReducerTyped(TEXT("insert_into_indexed_simple_enum"), FInsertIntoIndexedSimpleEnumArgs(N), SetCallReducerFlags); + FInsertIntoIndexedSimpleEnumArgs ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_into_indexed_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertIntoIndexedSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeInsertIntoIndexedSimpleEnum(const FReducerEventContext& Context, const UInsertIntoIndexedSimpleEnumReducer* Args) @@ -4741,7 +2861,9 @@ void URemoteReducers::InsertIntoPkBtreeU32(const TArray& PkU32, cons return; } - Conn->CallReducerTyped(TEXT("insert_into_pk_btree_u32"), FInsertIntoPkBtreeU32Args(PkU32, BtU32), SetCallReducerFlags); + FInsertIntoPkBtreeU32Args ReducerArgs(PkU32, BtU32); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_into_pk_btree_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertIntoPkBtreeU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertIntoPkBtreeU32(const FReducerEventContext& Context, const UInsertIntoPkBtreeU32Reducer* Args) @@ -4785,7 +2907,9 @@ void URemoteReducers::InsertLargeTable(const uint8 A, const uint16 B, const uint return; } - Conn->CallReducerTyped(TEXT("insert_large_table"), FInsertLargeTableArgs(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V), SetCallReducerFlags); + FInsertLargeTableArgs ReducerArgs(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_large_table"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertLargeTable(ReducerArgs)); } } bool URemoteReducers::InvokeInsertLargeTable(const FReducerEventContext& Context, const UInsertLargeTableReducer* Args) @@ -4852,7 +2976,9 @@ void URemoteReducers::InsertOneBool(const bool B) return; } - Conn->CallReducerTyped(TEXT("insert_one_bool"), FInsertOneBoolArgs(B), SetCallReducerFlags); + FInsertOneBoolArgs ReducerArgs(B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneBool(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneBool(const FReducerEventContext& Context, const UInsertOneBoolReducer* Args) @@ -4896,7 +3022,9 @@ void URemoteReducers::InsertOneByteStruct(const FByteStructType& S) return; } - Conn->CallReducerTyped(TEXT("insert_one_byte_struct"), FInsertOneByteStructArgs(S), SetCallReducerFlags); + FInsertOneByteStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_byte_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneByteStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneByteStruct(const FReducerEventContext& Context, const UInsertOneByteStructReducer* Args) @@ -4940,7 +3068,9 @@ void URemoteReducers::InsertOneConnectionId(const FSpacetimeDBConnectionId& A) return; } - Conn->CallReducerTyped(TEXT("insert_one_connection_id"), FInsertOneConnectionIdArgs(A), SetCallReducerFlags); + FInsertOneConnectionIdArgs ReducerArgs(A); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneConnectionId(const FReducerEventContext& Context, const UInsertOneConnectionIdReducer* Args) @@ -4984,7 +3114,9 @@ void URemoteReducers::InsertOneEnumWithPayload(const FEnumWithPayloadType& E) return; } - Conn->CallReducerTyped(TEXT("insert_one_enum_with_payload"), FInsertOneEnumWithPayloadArgs(E), SetCallReducerFlags); + FInsertOneEnumWithPayloadArgs ReducerArgs(E); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_enum_with_payload"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneEnumWithPayload(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneEnumWithPayload(const FReducerEventContext& Context, const UInsertOneEnumWithPayloadReducer* Args) @@ -5028,7 +3160,9 @@ void URemoteReducers::InsertOneEveryPrimitiveStruct(const FEveryPrimitiveStructT return; } - Conn->CallReducerTyped(TEXT("insert_one_every_primitive_struct"), FInsertOneEveryPrimitiveStructArgs(S), SetCallReducerFlags); + FInsertOneEveryPrimitiveStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_every_primitive_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneEveryPrimitiveStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneEveryPrimitiveStruct(const FReducerEventContext& Context, const UInsertOneEveryPrimitiveStructReducer* Args) @@ -5072,7 +3206,9 @@ void URemoteReducers::InsertOneEveryVecStruct(const FEveryVecStructType& S) return; } - Conn->CallReducerTyped(TEXT("insert_one_every_vec_struct"), FInsertOneEveryVecStructArgs(S), SetCallReducerFlags); + FInsertOneEveryVecStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_every_vec_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneEveryVecStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneEveryVecStruct(const FReducerEventContext& Context, const UInsertOneEveryVecStructReducer* Args) @@ -5116,7 +3252,9 @@ void URemoteReducers::InsertOneF32(const float F) return; } - Conn->CallReducerTyped(TEXT("insert_one_f32"), FInsertOneF32Args(F), SetCallReducerFlags); + FInsertOneF32Args ReducerArgs(F); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_f_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneF32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneF32(const FReducerEventContext& Context, const UInsertOneF32Reducer* Args) @@ -5160,7 +3298,9 @@ void URemoteReducers::InsertOneF64(const double F) return; } - Conn->CallReducerTyped(TEXT("insert_one_f64"), FInsertOneF64Args(F), SetCallReducerFlags); + FInsertOneF64Args ReducerArgs(F); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_f_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneF64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneF64(const FReducerEventContext& Context, const UInsertOneF64Reducer* Args) @@ -5204,7 +3344,9 @@ void URemoteReducers::InsertOneI128(const FSpacetimeDBInt128& N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i128"), FInsertOneI128Args(N), SetCallReducerFlags); + FInsertOneI128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI128(const FReducerEventContext& Context, const UInsertOneI128Reducer* Args) @@ -5248,7 +3390,9 @@ void URemoteReducers::InsertOneI16(const int16 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i16"), FInsertOneI16Args(N), SetCallReducerFlags); + FInsertOneI16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI16(const FReducerEventContext& Context, const UInsertOneI16Reducer* Args) @@ -5292,7 +3436,9 @@ void URemoteReducers::InsertOneI256(const FSpacetimeDBInt256& N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i256"), FInsertOneI256Args(N), SetCallReducerFlags); + FInsertOneI256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI256(const FReducerEventContext& Context, const UInsertOneI256Reducer* Args) @@ -5336,7 +3482,9 @@ void URemoteReducers::InsertOneI32(const int32 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i32"), FInsertOneI32Args(N), SetCallReducerFlags); + FInsertOneI32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI32(const FReducerEventContext& Context, const UInsertOneI32Reducer* Args) @@ -5380,7 +3528,9 @@ void URemoteReducers::InsertOneI64(const int64 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i64"), FInsertOneI64Args(N), SetCallReducerFlags); + FInsertOneI64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI64(const FReducerEventContext& Context, const UInsertOneI64Reducer* Args) @@ -5424,7 +3574,9 @@ void URemoteReducers::InsertOneI8(const int8 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_i8"), FInsertOneI8Args(N), SetCallReducerFlags); + FInsertOneI8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneI8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneI8(const FReducerEventContext& Context, const UInsertOneI8Reducer* Args) @@ -5468,7 +3620,9 @@ void URemoteReducers::InsertOneIdentity(const FSpacetimeDBIdentity& I) return; } - Conn->CallReducerTyped(TEXT("insert_one_identity"), FInsertOneIdentityArgs(I), SetCallReducerFlags); + FInsertOneIdentityArgs ReducerArgs(I); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneIdentity(const FReducerEventContext& Context, const UInsertOneIdentityReducer* Args) @@ -5512,7 +3666,9 @@ void URemoteReducers::InsertOneSimpleEnum(const ESimpleEnumType& E) return; } - Conn->CallReducerTyped(TEXT("insert_one_simple_enum"), FInsertOneSimpleEnumArgs(E), SetCallReducerFlags); + FInsertOneSimpleEnumArgs ReducerArgs(E); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneSimpleEnum(const FReducerEventContext& Context, const UInsertOneSimpleEnumReducer* Args) @@ -5556,7 +3712,9 @@ void URemoteReducers::InsertOneString(const FString& S) return; } - Conn->CallReducerTyped(TEXT("insert_one_string"), FInsertOneStringArgs(S), SetCallReducerFlags); + FInsertOneStringArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneString(const FReducerEventContext& Context, const UInsertOneStringReducer* Args) @@ -5600,7 +3758,9 @@ void URemoteReducers::InsertOneTimestamp(const FSpacetimeDBTimestamp& T) return; } - Conn->CallReducerTyped(TEXT("insert_one_timestamp"), FInsertOneTimestampArgs(T), SetCallReducerFlags); + FInsertOneTimestampArgs ReducerArgs(T); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_timestamp"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneTimestamp(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneTimestamp(const FReducerEventContext& Context, const UInsertOneTimestampReducer* Args) @@ -5644,7 +3804,9 @@ void URemoteReducers::InsertOneU128(const FSpacetimeDBUInt128& N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u128"), FInsertOneU128Args(N), SetCallReducerFlags); + FInsertOneU128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU128(const FReducerEventContext& Context, const UInsertOneU128Reducer* Args) @@ -5688,7 +3850,9 @@ void URemoteReducers::InsertOneU16(const uint16 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u16"), FInsertOneU16Args(N), SetCallReducerFlags); + FInsertOneU16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU16(const FReducerEventContext& Context, const UInsertOneU16Reducer* Args) @@ -5732,7 +3896,9 @@ void URemoteReducers::InsertOneU256(const FSpacetimeDBUInt256& N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u256"), FInsertOneU256Args(N), SetCallReducerFlags); + FInsertOneU256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU256(const FReducerEventContext& Context, const UInsertOneU256Reducer* Args) @@ -5776,7 +3942,9 @@ void URemoteReducers::InsertOneU32(const uint32 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u32"), FInsertOneU32Args(N), SetCallReducerFlags); + FInsertOneU32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU32(const FReducerEventContext& Context, const UInsertOneU32Reducer* Args) @@ -5820,7 +3988,9 @@ void URemoteReducers::InsertOneU64(const uint64 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u64"), FInsertOneU64Args(N), SetCallReducerFlags); + FInsertOneU64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU64(const FReducerEventContext& Context, const UInsertOneU64Reducer* Args) @@ -5864,7 +4034,9 @@ void URemoteReducers::InsertOneU8(const uint8 N) return; } - Conn->CallReducerTyped(TEXT("insert_one_u8"), FInsertOneU8Args(N), SetCallReducerFlags); + FInsertOneU8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneU8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneU8(const FReducerEventContext& Context, const UInsertOneU8Reducer* Args) @@ -5908,7 +4080,9 @@ void URemoteReducers::InsertOneUnitStruct(const FUnitStructType& S) return; } - Conn->CallReducerTyped(TEXT("insert_one_unit_struct"), FInsertOneUnitStructArgs(S), SetCallReducerFlags); + FInsertOneUnitStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_unit_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneUnitStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneUnitStruct(const FReducerEventContext& Context, const UInsertOneUnitStructReducer* Args) @@ -5952,7 +4126,9 @@ void URemoteReducers::InsertOneUuid(const FSpacetimeDBUuid& U) return; } - Conn->CallReducerTyped(TEXT("insert_one_uuid"), FInsertOneUuidArgs(U), SetCallReducerFlags); + FInsertOneUuidArgs ReducerArgs(U); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_one_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOneUuid(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOneUuid(const FReducerEventContext& Context, const UInsertOneUuidReducer* Args) @@ -5996,7 +4172,9 @@ void URemoteReducers::InsertOptionEveryPrimitiveStruct(const FTestClientOptional return; } - Conn->CallReducerTyped(TEXT("insert_option_every_primitive_struct"), FInsertOptionEveryPrimitiveStructArgs(S), SetCallReducerFlags); + FInsertOptionEveryPrimitiveStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_every_primitive_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionEveryPrimitiveStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionEveryPrimitiveStruct(const FReducerEventContext& Context, const UInsertOptionEveryPrimitiveStructReducer* Args) @@ -6040,7 +4218,9 @@ void URemoteReducers::InsertOptionI32(const FTestClientOptionalInt32 N) return; } - Conn->CallReducerTyped(TEXT("insert_option_i32"), FInsertOptionI32Args(N), SetCallReducerFlags); + FInsertOptionI32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionI32(const FReducerEventContext& Context, const UInsertOptionI32Reducer* Args) @@ -6084,7 +4264,9 @@ void URemoteReducers::InsertOptionIdentity(const FTestClientOptionalIdentity& I) return; } - Conn->CallReducerTyped(TEXT("insert_option_identity"), FInsertOptionIdentityArgs(I), SetCallReducerFlags); + FInsertOptionIdentityArgs ReducerArgs(I); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionIdentity(const FReducerEventContext& Context, const UInsertOptionIdentityReducer* Args) @@ -6128,7 +4310,9 @@ void URemoteReducers::InsertOptionSimpleEnum(const FTestClientOptionalSimpleEnum return; } - Conn->CallReducerTyped(TEXT("insert_option_simple_enum"), FInsertOptionSimpleEnumArgs(E), SetCallReducerFlags); + FInsertOptionSimpleEnumArgs ReducerArgs(E); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionSimpleEnum(const FReducerEventContext& Context, const UInsertOptionSimpleEnumReducer* Args) @@ -6172,7 +4356,9 @@ void URemoteReducers::InsertOptionString(const FTestClientOptionalString& S) return; } - Conn->CallReducerTyped(TEXT("insert_option_string"), FInsertOptionStringArgs(S), SetCallReducerFlags); + FInsertOptionStringArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionString(const FReducerEventContext& Context, const UInsertOptionStringReducer* Args) @@ -6216,7 +4402,9 @@ void URemoteReducers::InsertOptionUuid(const FTestClientOptionalUuid& U) return; } - Conn->CallReducerTyped(TEXT("insert_option_uuid"), FInsertOptionUuidArgs(U), SetCallReducerFlags); + FInsertOptionUuidArgs ReducerArgs(U); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionUuid(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionUuid(const FReducerEventContext& Context, const UInsertOptionUuidReducer* Args) @@ -6260,7 +4448,9 @@ void URemoteReducers::InsertOptionVecOptionI32(const FTestClientOptionalVecOptio return; } - Conn->CallReducerTyped(TEXT("insert_option_vec_option_i32"), FInsertOptionVecOptionI32Args(V), SetCallReducerFlags); + FInsertOptionVecOptionI32Args ReducerArgs(V); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_option_vec_option_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertOptionVecOptionI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertOptionVecOptionI32(const FReducerEventContext& Context, const UInsertOptionVecOptionI32Reducer* Args) @@ -6304,7 +4494,9 @@ void URemoteReducers::InsertPkBool(const bool B, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_bool"), FInsertPkBoolArgs(B, Data), SetCallReducerFlags); + FInsertPkBoolArgs ReducerArgs(B, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkBool(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkBool(const FReducerEventContext& Context, const UInsertPkBoolReducer* Args) @@ -6348,7 +4540,9 @@ void URemoteReducers::InsertPkConnectionId(const FSpacetimeDBConnectionId& A, co return; } - Conn->CallReducerTyped(TEXT("insert_pk_connection_id"), FInsertPkConnectionIdArgs(A, Data), SetCallReducerFlags); + FInsertPkConnectionIdArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkConnectionId(const FReducerEventContext& Context, const UInsertPkConnectionIdReducer* Args) @@ -6392,7 +4586,9 @@ void URemoteReducers::InsertPkI128(const FSpacetimeDBInt128& N, const int32 Data return; } - Conn->CallReducerTyped(TEXT("insert_pk_i128"), FInsertPkI128Args(N, Data), SetCallReducerFlags); + FInsertPkI128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI128(const FReducerEventContext& Context, const UInsertPkI128Reducer* Args) @@ -6436,7 +4632,9 @@ void URemoteReducers::InsertPkI16(const int16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_i16"), FInsertPkI16Args(N, Data), SetCallReducerFlags); + FInsertPkI16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI16(const FReducerEventContext& Context, const UInsertPkI16Reducer* Args) @@ -6480,7 +4678,9 @@ void URemoteReducers::InsertPkI256(const FSpacetimeDBInt256& N, const int32 Data return; } - Conn->CallReducerTyped(TEXT("insert_pk_i256"), FInsertPkI256Args(N, Data), SetCallReducerFlags); + FInsertPkI256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI256(const FReducerEventContext& Context, const UInsertPkI256Reducer* Args) @@ -6524,7 +4724,9 @@ void URemoteReducers::InsertPkI32(const int32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_i32"), FInsertPkI32Args(N, Data), SetCallReducerFlags); + FInsertPkI32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI32(const FReducerEventContext& Context, const UInsertPkI32Reducer* Args) @@ -6568,7 +4770,9 @@ void URemoteReducers::InsertPkI64(const int64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_i64"), FInsertPkI64Args(N, Data), SetCallReducerFlags); + FInsertPkI64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI64(const FReducerEventContext& Context, const UInsertPkI64Reducer* Args) @@ -6612,7 +4816,9 @@ void URemoteReducers::InsertPkI8(const int8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_i8"), FInsertPkI8Args(N, Data), SetCallReducerFlags); + FInsertPkI8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkI8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkI8(const FReducerEventContext& Context, const UInsertPkI8Reducer* Args) @@ -6656,7 +4862,9 @@ void URemoteReducers::InsertPkIdentity(const FSpacetimeDBIdentity& I, const int3 return; } - Conn->CallReducerTyped(TEXT("insert_pk_identity"), FInsertPkIdentityArgs(I, Data), SetCallReducerFlags); + FInsertPkIdentityArgs ReducerArgs(I, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkIdentity(const FReducerEventContext& Context, const UInsertPkIdentityReducer* Args) @@ -6700,7 +4908,9 @@ void URemoteReducers::InsertPkSimpleEnum(const ESimpleEnumType& A, const int32 D return; } - Conn->CallReducerTyped(TEXT("insert_pk_simple_enum"), FInsertPkSimpleEnumArgs(A, Data), SetCallReducerFlags); + FInsertPkSimpleEnumArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkSimpleEnum(const FReducerEventContext& Context, const UInsertPkSimpleEnumReducer* Args) @@ -6744,7 +4954,9 @@ void URemoteReducers::InsertPkString(const FString& S, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_string"), FInsertPkStringArgs(S, Data), SetCallReducerFlags); + FInsertPkStringArgs ReducerArgs(S, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkString(const FReducerEventContext& Context, const UInsertPkStringReducer* Args) @@ -6788,7 +5000,9 @@ void URemoteReducers::InsertPkU128(const FSpacetimeDBUInt128& N, const int32 Dat return; } - Conn->CallReducerTyped(TEXT("insert_pk_u128"), FInsertPkU128Args(N, Data), SetCallReducerFlags); + FInsertPkU128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU128(const FReducerEventContext& Context, const UInsertPkU128Reducer* Args) @@ -6832,7 +5046,9 @@ void URemoteReducers::InsertPkU16(const uint16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_u16"), FInsertPkU16Args(N, Data), SetCallReducerFlags); + FInsertPkU16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU16(const FReducerEventContext& Context, const UInsertPkU16Reducer* Args) @@ -6876,7 +5092,9 @@ void URemoteReducers::InsertPkU256(const FSpacetimeDBUInt256& N, const int32 Dat return; } - Conn->CallReducerTyped(TEXT("insert_pk_u256"), FInsertPkU256Args(N, Data), SetCallReducerFlags); + FInsertPkU256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU256(const FReducerEventContext& Context, const UInsertPkU256Reducer* Args) @@ -6920,7 +5138,9 @@ void URemoteReducers::InsertPkU32(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_u32"), FInsertPkU32Args(N, Data), SetCallReducerFlags); + FInsertPkU32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU32(const FReducerEventContext& Context, const UInsertPkU32Reducer* Args) @@ -6964,7 +5184,9 @@ void URemoteReducers::InsertPkU32Two(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_u32_two"), FInsertPkU32TwoArgs(N, Data), SetCallReducerFlags); + FInsertPkU32TwoArgs ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_32_two"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU32Two(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU32Two(const FReducerEventContext& Context, const UInsertPkU32TwoReducer* Args) @@ -7008,7 +5230,9 @@ void URemoteReducers::InsertPkU64(const uint64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_u64"), FInsertPkU64Args(N, Data), SetCallReducerFlags); + FInsertPkU64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU64(const FReducerEventContext& Context, const UInsertPkU64Reducer* Args) @@ -7052,7 +5276,9 @@ void URemoteReducers::InsertPkU8(const uint8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_u8"), FInsertPkU8Args(N, Data), SetCallReducerFlags); + FInsertPkU8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkU8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkU8(const FReducerEventContext& Context, const UInsertPkU8Reducer* Args) @@ -7096,7 +5322,9 @@ void URemoteReducers::InsertPkUuid(const FSpacetimeDBUuid& U, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_pk_uuid"), FInsertPkUuidArgs(U, Data), SetCallReducerFlags); + FInsertPkUuidArgs ReducerArgs(U, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_pk_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPkUuid(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPkUuid(const FReducerEventContext& Context, const UInsertPkUuidReducer* Args) @@ -7140,7 +5368,9 @@ void URemoteReducers::InsertPrimitivesAsStrings(const FEveryPrimitiveStructType& return; } - Conn->CallReducerTyped(TEXT("insert_primitives_as_strings"), FInsertPrimitivesAsStringsArgs(S), SetCallReducerFlags); + FInsertPrimitivesAsStringsArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_primitives_as_strings"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertPrimitivesAsStrings(ReducerArgs)); } } bool URemoteReducers::InvokeInsertPrimitivesAsStrings(const FReducerEventContext& Context, const UInsertPrimitivesAsStringsReducer* Args) @@ -7184,7 +5414,9 @@ void URemoteReducers::InsertResultEveryPrimitiveStructString(const FTestClientRe return; } - Conn->CallReducerTyped(TEXT("insert_result_every_primitive_struct_string"), FInsertResultEveryPrimitiveStructStringArgs(R), SetCallReducerFlags); + FInsertResultEveryPrimitiveStructStringArgs ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_every_primitive_struct_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultEveryPrimitiveStructString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultEveryPrimitiveStructString(const FReducerEventContext& Context, const UInsertResultEveryPrimitiveStructStringReducer* Args) @@ -7228,7 +5460,9 @@ void URemoteReducers::InsertResultI32String(const FTestClientResultInt32String& return; } - Conn->CallReducerTyped(TEXT("insert_result_i32_string"), FInsertResultI32StringArgs(R), SetCallReducerFlags); + FInsertResultI32StringArgs ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_i_32_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultI32String(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultI32String(const FReducerEventContext& Context, const UInsertResultI32StringReducer* Args) @@ -7272,7 +5506,9 @@ void URemoteReducers::InsertResultIdentityString(const FTestClientResultIdentity return; } - Conn->CallReducerTyped(TEXT("insert_result_identity_string"), FInsertResultIdentityStringArgs(R), SetCallReducerFlags); + FInsertResultIdentityStringArgs ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_identity_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultIdentityString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultIdentityString(const FReducerEventContext& Context, const UInsertResultIdentityStringReducer* Args) @@ -7316,7 +5552,9 @@ void URemoteReducers::InsertResultSimpleEnumI32(const FTestClientResultSimpleEnu return; } - Conn->CallReducerTyped(TEXT("insert_result_simple_enum_i32"), FInsertResultSimpleEnumI32Args(R), SetCallReducerFlags); + FInsertResultSimpleEnumI32Args ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_simple_enum_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultSimpleEnumI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultSimpleEnumI32(const FReducerEventContext& Context, const UInsertResultSimpleEnumI32Reducer* Args) @@ -7360,7 +5598,9 @@ void URemoteReducers::InsertResultStringI32(const FTestClientResultStringInt32& return; } - Conn->CallReducerTyped(TEXT("insert_result_string_i32"), FInsertResultStringI32Args(R), SetCallReducerFlags); + FInsertResultStringI32Args ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_string_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultStringI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultStringI32(const FReducerEventContext& Context, const UInsertResultStringI32Reducer* Args) @@ -7404,7 +5644,9 @@ void URemoteReducers::InsertResultVecI32String(const FTestClientResultVecInt32St return; } - Conn->CallReducerTyped(TEXT("insert_result_vec_i32_string"), FInsertResultVecI32StringArgs(R), SetCallReducerFlags); + FInsertResultVecI32StringArgs ReducerArgs(R); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_result_vec_i_32_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertResultVecI32String(ReducerArgs)); } } bool URemoteReducers::InvokeInsertResultVecI32String(const FReducerEventContext& Context, const UInsertResultVecI32StringReducer* Args) @@ -7448,7 +5690,9 @@ void URemoteReducers::InsertTableHoldsTable(const FOneU8Type& A, const FVecU8Typ return; } - Conn->CallReducerTyped(TEXT("insert_table_holds_table"), FInsertTableHoldsTableArgs(A, B), SetCallReducerFlags); + FInsertTableHoldsTableArgs ReducerArgs(A, B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_table_holds_table"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertTableHoldsTable(ReducerArgs)); } } bool URemoteReducers::InvokeInsertTableHoldsTable(const FReducerEventContext& Context, const UInsertTableHoldsTableReducer* Args) @@ -7492,7 +5736,9 @@ void URemoteReducers::InsertUniqueBool(const bool B, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_bool"), FInsertUniqueBoolArgs(B, Data), SetCallReducerFlags); + FInsertUniqueBoolArgs ReducerArgs(B, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueBool(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueBool(const FReducerEventContext& Context, const UInsertUniqueBoolReducer* Args) @@ -7536,7 +5782,9 @@ void URemoteReducers::InsertUniqueConnectionId(const FSpacetimeDBConnectionId& A return; } - Conn->CallReducerTyped(TEXT("insert_unique_connection_id"), FInsertUniqueConnectionIdArgs(A, Data), SetCallReducerFlags); + FInsertUniqueConnectionIdArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueConnectionId(const FReducerEventContext& Context, const UInsertUniqueConnectionIdReducer* Args) @@ -7580,7 +5828,9 @@ void URemoteReducers::InsertUniqueI128(const FSpacetimeDBInt128& N, const int32 return; } - Conn->CallReducerTyped(TEXT("insert_unique_i128"), FInsertUniqueI128Args(N, Data), SetCallReducerFlags); + FInsertUniqueI128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI128(const FReducerEventContext& Context, const UInsertUniqueI128Reducer* Args) @@ -7624,7 +5874,9 @@ void URemoteReducers::InsertUniqueI16(const int16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_i16"), FInsertUniqueI16Args(N, Data), SetCallReducerFlags); + FInsertUniqueI16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI16(const FReducerEventContext& Context, const UInsertUniqueI16Reducer* Args) @@ -7668,7 +5920,9 @@ void URemoteReducers::InsertUniqueI256(const FSpacetimeDBInt256& N, const int32 return; } - Conn->CallReducerTyped(TEXT("insert_unique_i256"), FInsertUniqueI256Args(N, Data), SetCallReducerFlags); + FInsertUniqueI256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI256(const FReducerEventContext& Context, const UInsertUniqueI256Reducer* Args) @@ -7712,7 +5966,9 @@ void URemoteReducers::InsertUniqueI32(const int32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_i32"), FInsertUniqueI32Args(N, Data), SetCallReducerFlags); + FInsertUniqueI32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI32(const FReducerEventContext& Context, const UInsertUniqueI32Reducer* Args) @@ -7756,7 +6012,9 @@ void URemoteReducers::InsertUniqueI64(const int64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_i64"), FInsertUniqueI64Args(N, Data), SetCallReducerFlags); + FInsertUniqueI64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI64(const FReducerEventContext& Context, const UInsertUniqueI64Reducer* Args) @@ -7800,7 +6058,9 @@ void URemoteReducers::InsertUniqueI8(const int8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_i8"), FInsertUniqueI8Args(N, Data), SetCallReducerFlags); + FInsertUniqueI8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueI8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueI8(const FReducerEventContext& Context, const UInsertUniqueI8Reducer* Args) @@ -7844,7 +6104,9 @@ void URemoteReducers::InsertUniqueIdentity(const FSpacetimeDBIdentity& I, const return; } - Conn->CallReducerTyped(TEXT("insert_unique_identity"), FInsertUniqueIdentityArgs(I, Data), SetCallReducerFlags); + FInsertUniqueIdentityArgs ReducerArgs(I, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueIdentity(const FReducerEventContext& Context, const UInsertUniqueIdentityReducer* Args) @@ -7888,7 +6150,9 @@ void URemoteReducers::InsertUniqueString(const FString& S, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_string"), FInsertUniqueStringArgs(S, Data), SetCallReducerFlags); + FInsertUniqueStringArgs ReducerArgs(S, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueString(const FReducerEventContext& Context, const UInsertUniqueStringReducer* Args) @@ -7932,7 +6196,9 @@ void URemoteReducers::InsertUniqueU128(const FSpacetimeDBUInt128& N, const int32 return; } - Conn->CallReducerTyped(TEXT("insert_unique_u128"), FInsertUniqueU128Args(N, Data), SetCallReducerFlags); + FInsertUniqueU128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU128(const FReducerEventContext& Context, const UInsertUniqueU128Reducer* Args) @@ -7976,7 +6242,9 @@ void URemoteReducers::InsertUniqueU16(const uint16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_u16"), FInsertUniqueU16Args(N, Data), SetCallReducerFlags); + FInsertUniqueU16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU16(const FReducerEventContext& Context, const UInsertUniqueU16Reducer* Args) @@ -8020,7 +6288,9 @@ void URemoteReducers::InsertUniqueU256(const FSpacetimeDBUInt256& N, const int32 return; } - Conn->CallReducerTyped(TEXT("insert_unique_u256"), FInsertUniqueU256Args(N, Data), SetCallReducerFlags); + FInsertUniqueU256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU256(const FReducerEventContext& Context, const UInsertUniqueU256Reducer* Args) @@ -8064,7 +6334,9 @@ void URemoteReducers::InsertUniqueU32(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_u32"), FInsertUniqueU32Args(N, Data), SetCallReducerFlags); + FInsertUniqueU32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU32(const FReducerEventContext& Context, const UInsertUniqueU32Reducer* Args) @@ -8108,7 +6380,9 @@ void URemoteReducers::InsertUniqueU32UpdatePkU32(const uint32 N, const int32 DUn return; } - Conn->CallReducerTyped(TEXT("insert_unique_u32_update_pk_u32"), FInsertUniqueU32UpdatePkU32Args(N, DUnique, DPk), SetCallReducerFlags); + FInsertUniqueU32UpdatePkU32Args ReducerArgs(N, DUnique, DPk); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_32_update_pk_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU32UpdatePkU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU32UpdatePkU32(const FReducerEventContext& Context, const UInsertUniqueU32UpdatePkU32Reducer* Args) @@ -8152,7 +6426,9 @@ void URemoteReducers::InsertUniqueU64(const uint64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_u64"), FInsertUniqueU64Args(N, Data), SetCallReducerFlags); + FInsertUniqueU64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU64(const FReducerEventContext& Context, const UInsertUniqueU64Reducer* Args) @@ -8196,7 +6472,9 @@ void URemoteReducers::InsertUniqueU8(const uint8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("insert_unique_u8"), FInsertUniqueU8Args(N, Data), SetCallReducerFlags); + FInsertUniqueU8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueU8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueU8(const FReducerEventContext& Context, const UInsertUniqueU8Reducer* Args) @@ -8240,7 +6518,9 @@ void URemoteReducers::InsertUniqueUuid(const FSpacetimeDBUuid& U, const int32 Da return; } - Conn->CallReducerTyped(TEXT("insert_unique_uuid"), FInsertUniqueUuidArgs(U, Data), SetCallReducerFlags); + FInsertUniqueUuidArgs ReducerArgs(U, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_unique_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUniqueUuid(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUniqueUuid(const FReducerEventContext& Context, const UInsertUniqueUuidReducer* Args) @@ -8284,7 +6564,9 @@ void URemoteReducers::InsertUser(const FString& Name, const FSpacetimeDBIdentity return; } - Conn->CallReducerTyped(TEXT("insert_user"), FInsertUserArgs(Name, Identity), SetCallReducerFlags); + FInsertUserArgs ReducerArgs(Name, Identity); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_user"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertUser(ReducerArgs)); } } bool URemoteReducers::InvokeInsertUser(const FReducerEventContext& Context, const UInsertUserReducer* Args) @@ -8328,7 +6610,9 @@ void URemoteReducers::InsertVecBool(const TArray& B) return; } - Conn->CallReducerTyped(TEXT("insert_vec_bool"), FInsertVecBoolArgs(B), SetCallReducerFlags); + FInsertVecBoolArgs ReducerArgs(B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecBool(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecBool(const FReducerEventContext& Context, const UInsertVecBoolReducer* Args) @@ -8372,7 +6656,9 @@ void URemoteReducers::InsertVecByteStruct(const TArray& S) return; } - Conn->CallReducerTyped(TEXT("insert_vec_byte_struct"), FInsertVecByteStructArgs(S), SetCallReducerFlags); + FInsertVecByteStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_byte_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecByteStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecByteStruct(const FReducerEventContext& Context, const UInsertVecByteStructReducer* Args) @@ -8416,7 +6702,9 @@ void URemoteReducers::InsertVecConnectionId(const TArrayCallReducerTyped(TEXT("insert_vec_connection_id"), FInsertVecConnectionIdArgs(A), SetCallReducerFlags); + FInsertVecConnectionIdArgs ReducerArgs(A); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecConnectionId(const FReducerEventContext& Context, const UInsertVecConnectionIdReducer* Args) @@ -8460,7 +6748,9 @@ void URemoteReducers::InsertVecEnumWithPayload(const TArrayCallReducerTyped(TEXT("insert_vec_enum_with_payload"), FInsertVecEnumWithPayloadArgs(E), SetCallReducerFlags); + FInsertVecEnumWithPayloadArgs ReducerArgs(E); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_enum_with_payload"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecEnumWithPayload(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecEnumWithPayload(const FReducerEventContext& Context, const UInsertVecEnumWithPayloadReducer* Args) @@ -8504,7 +6794,9 @@ void URemoteReducers::InsertVecEveryPrimitiveStruct(const TArrayCallReducerTyped(TEXT("insert_vec_every_primitive_struct"), FInsertVecEveryPrimitiveStructArgs(S), SetCallReducerFlags); + FInsertVecEveryPrimitiveStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_every_primitive_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecEveryPrimitiveStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecEveryPrimitiveStruct(const FReducerEventContext& Context, const UInsertVecEveryPrimitiveStructReducer* Args) @@ -8548,7 +6840,9 @@ void URemoteReducers::InsertVecEveryVecStruct(const TArray& return; } - Conn->CallReducerTyped(TEXT("insert_vec_every_vec_struct"), FInsertVecEveryVecStructArgs(S), SetCallReducerFlags); + FInsertVecEveryVecStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_every_vec_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecEveryVecStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecEveryVecStruct(const FReducerEventContext& Context, const UInsertVecEveryVecStructReducer* Args) @@ -8592,7 +6886,9 @@ void URemoteReducers::InsertVecF32(const TArray& F) return; } - Conn->CallReducerTyped(TEXT("insert_vec_f32"), FInsertVecF32Args(F), SetCallReducerFlags); + FInsertVecF32Args ReducerArgs(F); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_f_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecF32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecF32(const FReducerEventContext& Context, const UInsertVecF32Reducer* Args) @@ -8636,7 +6932,9 @@ void URemoteReducers::InsertVecF64(const TArray& F) return; } - Conn->CallReducerTyped(TEXT("insert_vec_f64"), FInsertVecF64Args(F), SetCallReducerFlags); + FInsertVecF64Args ReducerArgs(F); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_f_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecF64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecF64(const FReducerEventContext& Context, const UInsertVecF64Reducer* Args) @@ -8680,7 +6978,9 @@ void URemoteReducers::InsertVecI128(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i128"), FInsertVecI128Args(N), SetCallReducerFlags); + FInsertVecI128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI128(const FReducerEventContext& Context, const UInsertVecI128Reducer* Args) @@ -8724,7 +7024,9 @@ void URemoteReducers::InsertVecI16(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i16"), FInsertVecI16Args(N), SetCallReducerFlags); + FInsertVecI16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI16(const FReducerEventContext& Context, const UInsertVecI16Reducer* Args) @@ -8768,7 +7070,9 @@ void URemoteReducers::InsertVecI256(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i256"), FInsertVecI256Args(N), SetCallReducerFlags); + FInsertVecI256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI256(const FReducerEventContext& Context, const UInsertVecI256Reducer* Args) @@ -8812,7 +7116,9 @@ void URemoteReducers::InsertVecI32(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i32"), FInsertVecI32Args(N), SetCallReducerFlags); + FInsertVecI32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI32(const FReducerEventContext& Context, const UInsertVecI32Reducer* Args) @@ -8856,7 +7162,9 @@ void URemoteReducers::InsertVecI64(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i64"), FInsertVecI64Args(N), SetCallReducerFlags); + FInsertVecI64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI64(const FReducerEventContext& Context, const UInsertVecI64Reducer* Args) @@ -8900,7 +7208,9 @@ void URemoteReducers::InsertVecI8(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_i8"), FInsertVecI8Args(N), SetCallReducerFlags); + FInsertVecI8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecI8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecI8(const FReducerEventContext& Context, const UInsertVecI8Reducer* Args) @@ -8944,7 +7254,9 @@ void URemoteReducers::InsertVecIdentity(const TArray& I) return; } - Conn->CallReducerTyped(TEXT("insert_vec_identity"), FInsertVecIdentityArgs(I), SetCallReducerFlags); + FInsertVecIdentityArgs ReducerArgs(I); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecIdentity(const FReducerEventContext& Context, const UInsertVecIdentityReducer* Args) @@ -8988,7 +7300,9 @@ void URemoteReducers::InsertVecSimpleEnum(const TArray& E) return; } - Conn->CallReducerTyped(TEXT("insert_vec_simple_enum"), FInsertVecSimpleEnumArgs(E), SetCallReducerFlags); + FInsertVecSimpleEnumArgs ReducerArgs(E); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecSimpleEnum(const FReducerEventContext& Context, const UInsertVecSimpleEnumReducer* Args) @@ -9032,7 +7346,9 @@ void URemoteReducers::InsertVecString(const TArray& S) return; } - Conn->CallReducerTyped(TEXT("insert_vec_string"), FInsertVecStringArgs(S), SetCallReducerFlags); + FInsertVecStringArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecString(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecString(const FReducerEventContext& Context, const UInsertVecStringReducer* Args) @@ -9076,7 +7392,9 @@ void URemoteReducers::InsertVecTimestamp(const TArray& T) return; } - Conn->CallReducerTyped(TEXT("insert_vec_timestamp"), FInsertVecTimestampArgs(T), SetCallReducerFlags); + FInsertVecTimestampArgs ReducerArgs(T); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_timestamp"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecTimestamp(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecTimestamp(const FReducerEventContext& Context, const UInsertVecTimestampReducer* Args) @@ -9120,7 +7438,9 @@ void URemoteReducers::InsertVecU128(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u128"), FInsertVecU128Args(N), SetCallReducerFlags); + FInsertVecU128Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU128(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU128(const FReducerEventContext& Context, const UInsertVecU128Reducer* Args) @@ -9164,7 +7484,9 @@ void URemoteReducers::InsertVecU16(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u16"), FInsertVecU16Args(N), SetCallReducerFlags); + FInsertVecU16Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU16(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU16(const FReducerEventContext& Context, const UInsertVecU16Reducer* Args) @@ -9208,7 +7530,9 @@ void URemoteReducers::InsertVecU256(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u256"), FInsertVecU256Args(N), SetCallReducerFlags); + FInsertVecU256Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU256(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU256(const FReducerEventContext& Context, const UInsertVecU256Reducer* Args) @@ -9252,7 +7576,9 @@ void URemoteReducers::InsertVecU32(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u32"), FInsertVecU32Args(N), SetCallReducerFlags); + FInsertVecU32Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU32(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU32(const FReducerEventContext& Context, const UInsertVecU32Reducer* Args) @@ -9296,7 +7622,9 @@ void URemoteReducers::InsertVecU64(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u64"), FInsertVecU64Args(N), SetCallReducerFlags); + FInsertVecU64Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU64(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU64(const FReducerEventContext& Context, const UInsertVecU64Reducer* Args) @@ -9340,7 +7668,9 @@ void URemoteReducers::InsertVecU8(const TArray& N) return; } - Conn->CallReducerTyped(TEXT("insert_vec_u8"), FInsertVecU8Args(N), SetCallReducerFlags); + FInsertVecU8Args ReducerArgs(N); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecU8(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecU8(const FReducerEventContext& Context, const UInsertVecU8Reducer* Args) @@ -9384,7 +7714,9 @@ void URemoteReducers::InsertVecUnitStruct(const TArray& S) return; } - Conn->CallReducerTyped(TEXT("insert_vec_unit_struct"), FInsertVecUnitStructArgs(S), SetCallReducerFlags); + FInsertVecUnitStructArgs ReducerArgs(S); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_unit_struct"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecUnitStruct(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecUnitStruct(const FReducerEventContext& Context, const UInsertVecUnitStructReducer* Args) @@ -9428,7 +7760,9 @@ void URemoteReducers::InsertVecUuid(const TArray& U) return; } - Conn->CallReducerTyped(TEXT("insert_vec_uuid"), FInsertVecUuidArgs(U), SetCallReducerFlags); + FInsertVecUuidArgs ReducerArgs(U); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("insert_vec_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::InsertVecUuid(ReducerArgs)); } } bool URemoteReducers::InvokeInsertVecUuid(const FReducerEventContext& Context, const UInsertVecUuidReducer* Args) @@ -9472,7 +7806,9 @@ void URemoteReducers::NoOpSucceeds() return; } - Conn->CallReducerTyped(TEXT("no_op_succeeds"), FNoOpSucceedsArgs(), SetCallReducerFlags); + FNoOpSucceedsArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("no_op_succeeds"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::NoOpSucceeds(ReducerArgs)); } } bool URemoteReducers::InvokeNoOpSucceeds(const FReducerEventContext& Context, const UNoOpSucceedsReducer* Args) @@ -9516,7 +7852,9 @@ void URemoteReducers::SortedUuidsInsert() return; } - Conn->CallReducerTyped(TEXT("sorted_uuids_insert"), FSortedUuidsInsertArgs(), SetCallReducerFlags); + FSortedUuidsInsertArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("sorted_uuids_insert"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::SortedUuidsInsert(ReducerArgs)); } } bool URemoteReducers::InvokeSortedUuidsInsert(const FReducerEventContext& Context, const USortedUuidsInsertReducer* Args) @@ -9560,7 +7898,9 @@ void URemoteReducers::UpdateIndexedSimpleEnum(const ESimpleEnumType& A, const ES return; } - Conn->CallReducerTyped(TEXT("update_indexed_simple_enum"), FUpdateIndexedSimpleEnumArgs(A, B), SetCallReducerFlags); + FUpdateIndexedSimpleEnumArgs ReducerArgs(A, B); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_indexed_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateIndexedSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateIndexedSimpleEnum(const FReducerEventContext& Context, const UUpdateIndexedSimpleEnumReducer* Args) @@ -9604,7 +7944,9 @@ void URemoteReducers::UpdatePkBool(const bool B, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_bool"), FUpdatePkBoolArgs(B, Data), SetCallReducerFlags); + FUpdatePkBoolArgs ReducerArgs(B, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkBool(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkBool(const FReducerEventContext& Context, const UUpdatePkBoolReducer* Args) @@ -9648,7 +7990,9 @@ void URemoteReducers::UpdatePkConnectionId(const FSpacetimeDBConnectionId& A, co return; } - Conn->CallReducerTyped(TEXT("update_pk_connection_id"), FUpdatePkConnectionIdArgs(A, Data), SetCallReducerFlags); + FUpdatePkConnectionIdArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkConnectionId(const FReducerEventContext& Context, const UUpdatePkConnectionIdReducer* Args) @@ -9692,7 +8036,9 @@ void URemoteReducers::UpdatePkI128(const FSpacetimeDBInt128& N, const int32 Data return; } - Conn->CallReducerTyped(TEXT("update_pk_i128"), FUpdatePkI128Args(N, Data), SetCallReducerFlags); + FUpdatePkI128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI128(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI128(const FReducerEventContext& Context, const UUpdatePkI128Reducer* Args) @@ -9736,7 +8082,9 @@ void URemoteReducers::UpdatePkI16(const int16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_i16"), FUpdatePkI16Args(N, Data), SetCallReducerFlags); + FUpdatePkI16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI16(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI16(const FReducerEventContext& Context, const UUpdatePkI16Reducer* Args) @@ -9780,7 +8128,9 @@ void URemoteReducers::UpdatePkI256(const FSpacetimeDBInt256& N, const int32 Data return; } - Conn->CallReducerTyped(TEXT("update_pk_i256"), FUpdatePkI256Args(N, Data), SetCallReducerFlags); + FUpdatePkI256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI256(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI256(const FReducerEventContext& Context, const UUpdatePkI256Reducer* Args) @@ -9824,7 +8174,9 @@ void URemoteReducers::UpdatePkI32(const int32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_i32"), FUpdatePkI32Args(N, Data), SetCallReducerFlags); + FUpdatePkI32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI32(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI32(const FReducerEventContext& Context, const UUpdatePkI32Reducer* Args) @@ -9868,7 +8220,9 @@ void URemoteReducers::UpdatePkI64(const int64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_i64"), FUpdatePkI64Args(N, Data), SetCallReducerFlags); + FUpdatePkI64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI64(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI64(const FReducerEventContext& Context, const UUpdatePkI64Reducer* Args) @@ -9912,7 +8266,9 @@ void URemoteReducers::UpdatePkI8(const int8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_i8"), FUpdatePkI8Args(N, Data), SetCallReducerFlags); + FUpdatePkI8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkI8(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkI8(const FReducerEventContext& Context, const UUpdatePkI8Reducer* Args) @@ -9956,7 +8312,9 @@ void URemoteReducers::UpdatePkIdentity(const FSpacetimeDBIdentity& I, const int3 return; } - Conn->CallReducerTyped(TEXT("update_pk_identity"), FUpdatePkIdentityArgs(I, Data), SetCallReducerFlags); + FUpdatePkIdentityArgs ReducerArgs(I, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkIdentity(const FReducerEventContext& Context, const UUpdatePkIdentityReducer* Args) @@ -10000,7 +8358,9 @@ void URemoteReducers::UpdatePkSimpleEnum(const ESimpleEnumType& A, const int32 D return; } - Conn->CallReducerTyped(TEXT("update_pk_simple_enum"), FUpdatePkSimpleEnumArgs(A, Data), SetCallReducerFlags); + FUpdatePkSimpleEnumArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_simple_enum"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkSimpleEnum(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkSimpleEnum(const FReducerEventContext& Context, const UUpdatePkSimpleEnumReducer* Args) @@ -10044,7 +8404,9 @@ void URemoteReducers::UpdatePkString(const FString& S, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_string"), FUpdatePkStringArgs(S, Data), SetCallReducerFlags); + FUpdatePkStringArgs ReducerArgs(S, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkString(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkString(const FReducerEventContext& Context, const UUpdatePkStringReducer* Args) @@ -10088,7 +8450,9 @@ void URemoteReducers::UpdatePkU128(const FSpacetimeDBUInt128& N, const int32 Dat return; } - Conn->CallReducerTyped(TEXT("update_pk_u128"), FUpdatePkU128Args(N, Data), SetCallReducerFlags); + FUpdatePkU128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU128(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU128(const FReducerEventContext& Context, const UUpdatePkU128Reducer* Args) @@ -10132,7 +8496,9 @@ void URemoteReducers::UpdatePkU16(const uint16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_u16"), FUpdatePkU16Args(N, Data), SetCallReducerFlags); + FUpdatePkU16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU16(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU16(const FReducerEventContext& Context, const UUpdatePkU16Reducer* Args) @@ -10176,7 +8542,9 @@ void URemoteReducers::UpdatePkU256(const FSpacetimeDBUInt256& N, const int32 Dat return; } - Conn->CallReducerTyped(TEXT("update_pk_u256"), FUpdatePkU256Args(N, Data), SetCallReducerFlags); + FUpdatePkU256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU256(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU256(const FReducerEventContext& Context, const UUpdatePkU256Reducer* Args) @@ -10220,7 +8588,9 @@ void URemoteReducers::UpdatePkU32(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_u32"), FUpdatePkU32Args(N, Data), SetCallReducerFlags); + FUpdatePkU32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU32(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU32(const FReducerEventContext& Context, const UUpdatePkU32Reducer* Args) @@ -10264,7 +8634,9 @@ void URemoteReducers::UpdatePkU32Two(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_u32_two"), FUpdatePkU32TwoArgs(N, Data), SetCallReducerFlags); + FUpdatePkU32TwoArgs ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_32_two"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU32Two(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU32Two(const FReducerEventContext& Context, const UUpdatePkU32TwoReducer* Args) @@ -10308,7 +8680,9 @@ void URemoteReducers::UpdatePkU64(const uint64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_u64"), FUpdatePkU64Args(N, Data), SetCallReducerFlags); + FUpdatePkU64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU64(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU64(const FReducerEventContext& Context, const UUpdatePkU64Reducer* Args) @@ -10352,7 +8726,9 @@ void URemoteReducers::UpdatePkU8(const uint8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_u8"), FUpdatePkU8Args(N, Data), SetCallReducerFlags); + FUpdatePkU8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkU8(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkU8(const FReducerEventContext& Context, const UUpdatePkU8Reducer* Args) @@ -10396,7 +8772,9 @@ void URemoteReducers::UpdatePkUuid(const FSpacetimeDBUuid& U, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_pk_uuid"), FUpdatePkUuidArgs(U, Data), SetCallReducerFlags); + FUpdatePkUuidArgs ReducerArgs(U, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_pk_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdatePkUuid(ReducerArgs)); } } bool URemoteReducers::InvokeUpdatePkUuid(const FReducerEventContext& Context, const UUpdatePkUuidReducer* Args) @@ -10440,7 +8818,9 @@ void URemoteReducers::UpdateUniqueBool(const bool B, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_bool"), FUpdateUniqueBoolArgs(B, Data), SetCallReducerFlags); + FUpdateUniqueBoolArgs ReducerArgs(B, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_bool"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueBool(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueBool(const FReducerEventContext& Context, const UUpdateUniqueBoolReducer* Args) @@ -10484,7 +8864,9 @@ void URemoteReducers::UpdateUniqueConnectionId(const FSpacetimeDBConnectionId& A return; } - Conn->CallReducerTyped(TEXT("update_unique_connection_id"), FUpdateUniqueConnectionIdArgs(A, Data), SetCallReducerFlags); + FUpdateUniqueConnectionIdArgs ReducerArgs(A, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_connection_id"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueConnectionId(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueConnectionId(const FReducerEventContext& Context, const UUpdateUniqueConnectionIdReducer* Args) @@ -10528,7 +8910,9 @@ void URemoteReducers::UpdateUniqueI128(const FSpacetimeDBInt128& N, const int32 return; } - Conn->CallReducerTyped(TEXT("update_unique_i128"), FUpdateUniqueI128Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI128(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI128(const FReducerEventContext& Context, const UUpdateUniqueI128Reducer* Args) @@ -10572,7 +8956,9 @@ void URemoteReducers::UpdateUniqueI16(const int16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_i16"), FUpdateUniqueI16Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI16(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI16(const FReducerEventContext& Context, const UUpdateUniqueI16Reducer* Args) @@ -10616,7 +9002,9 @@ void URemoteReducers::UpdateUniqueI256(const FSpacetimeDBInt256& N, const int32 return; } - Conn->CallReducerTyped(TEXT("update_unique_i256"), FUpdateUniqueI256Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI256(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI256(const FReducerEventContext& Context, const UUpdateUniqueI256Reducer* Args) @@ -10660,7 +9048,9 @@ void URemoteReducers::UpdateUniqueI32(const int32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_i32"), FUpdateUniqueI32Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI32(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI32(const FReducerEventContext& Context, const UUpdateUniqueI32Reducer* Args) @@ -10704,7 +9094,9 @@ void URemoteReducers::UpdateUniqueI64(const int64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_i64"), FUpdateUniqueI64Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI64(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI64(const FReducerEventContext& Context, const UUpdateUniqueI64Reducer* Args) @@ -10748,7 +9140,9 @@ void URemoteReducers::UpdateUniqueI8(const int8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_i8"), FUpdateUniqueI8Args(N, Data), SetCallReducerFlags); + FUpdateUniqueI8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_i_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueI8(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueI8(const FReducerEventContext& Context, const UUpdateUniqueI8Reducer* Args) @@ -10792,7 +9186,9 @@ void URemoteReducers::UpdateUniqueIdentity(const FSpacetimeDBIdentity& I, const return; } - Conn->CallReducerTyped(TEXT("update_unique_identity"), FUpdateUniqueIdentityArgs(I, Data), SetCallReducerFlags); + FUpdateUniqueIdentityArgs ReducerArgs(I, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_identity"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueIdentity(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueIdentity(const FReducerEventContext& Context, const UUpdateUniqueIdentityReducer* Args) @@ -10836,7 +9232,9 @@ void URemoteReducers::UpdateUniqueString(const FString& S, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_string"), FUpdateUniqueStringArgs(S, Data), SetCallReducerFlags); + FUpdateUniqueStringArgs ReducerArgs(S, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_string"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueString(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueString(const FReducerEventContext& Context, const UUpdateUniqueStringReducer* Args) @@ -10880,7 +9278,9 @@ void URemoteReducers::UpdateUniqueU128(const FSpacetimeDBUInt128& N, const int32 return; } - Conn->CallReducerTyped(TEXT("update_unique_u128"), FUpdateUniqueU128Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU128Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_128"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU128(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU128(const FReducerEventContext& Context, const UUpdateUniqueU128Reducer* Args) @@ -10924,7 +9324,9 @@ void URemoteReducers::UpdateUniqueU16(const uint16 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_u16"), FUpdateUniqueU16Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU16Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_16"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU16(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU16(const FReducerEventContext& Context, const UUpdateUniqueU16Reducer* Args) @@ -10968,7 +9370,9 @@ void URemoteReducers::UpdateUniqueU256(const FSpacetimeDBUInt256& N, const int32 return; } - Conn->CallReducerTyped(TEXT("update_unique_u256"), FUpdateUniqueU256Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU256Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_256"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU256(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU256(const FReducerEventContext& Context, const UUpdateUniqueU256Reducer* Args) @@ -11012,7 +9416,9 @@ void URemoteReducers::UpdateUniqueU32(const uint32 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_u32"), FUpdateUniqueU32Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU32Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_32"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU32(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU32(const FReducerEventContext& Context, const UUpdateUniqueU32Reducer* Args) @@ -11056,7 +9462,9 @@ void URemoteReducers::UpdateUniqueU64(const uint64 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_u64"), FUpdateUniqueU64Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU64Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_64"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU64(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU64(const FReducerEventContext& Context, const UUpdateUniqueU64Reducer* Args) @@ -11100,7 +9508,9 @@ void URemoteReducers::UpdateUniqueU8(const uint8 N, const int32 Data) return; } - Conn->CallReducerTyped(TEXT("update_unique_u8"), FUpdateUniqueU8Args(N, Data), SetCallReducerFlags); + FUpdateUniqueU8Args ReducerArgs(N, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_u_8"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueU8(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueU8(const FReducerEventContext& Context, const UUpdateUniqueU8Reducer* Args) @@ -11144,7 +9554,9 @@ void URemoteReducers::UpdateUniqueUuid(const FSpacetimeDBUuid& U, const int32 Da return; } - Conn->CallReducerTyped(TEXT("update_unique_uuid"), FUpdateUniqueUuidArgs(U, Data), SetCallReducerFlags); + FUpdateUniqueUuidArgs ReducerArgs(U, Data); + const uint32 RequestId = Conn->CallReducerTyped(TEXT("update_unique_uuid"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::UpdateUniqueUuid(ReducerArgs)); } } bool URemoteReducers::InvokeUpdateUniqueUuid(const FReducerEventContext& Context, const UUpdateUniqueUuidReducer* Args) @@ -11215,11 +9627,44 @@ void UDbConnection::OnUnhandledProcedureErrorHandler(const FProcedureEventContex } } +void UDbConnection::RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer) +{ + Reducer.RequestId = RequestId; + PendingTypedReducers.Add(RequestId, MoveTemp(Reducer)); +} + +bool UDbConnection::TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const +{ + if (const FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + return true; + } + return false; +} + +bool UDbConnection::TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer) +{ + if (FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + PendingTypedReducers.Remove(RequestId); + return true; + } + return false; +} + void UDbConnection::ReducerEvent(const FReducerEvent& Event) { if (!Reducers) { return; } - FReducer DecodedReducer = DecodeReducer(Event); + FReducer DecodedReducer; + if (!TryTakePendingTypedReducer(Event.RequestId, DecodedReducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), Event.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } FTestClientReducerEvent ReducerEvent; ReducerEvent.CallerConnectionId = Event.CallerConnectionId; @@ -11231,10 +9676,10 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) FReducerEventContext Context(this, ReducerEvent); - // Use hardcoded string matching for reducer dispatching - const FString& ReducerName = Event.ReducerCall.ReducerName; + // Dispatch by typed reducer metadata + const FString& ReducerName = ReducerEvent.Reducer.ReducerName; - if (ReducerName == TEXT("delete_from_btree_u32")) + if (ReducerName == TEXT("delete_from_btree_u_32")) { FDeleteFromBtreeU32Args Args = ReducerEvent.Reducer.GetAsDeleteFromBtreeU32(); Reducers->InvokeDeleteFromBtreeU32WithArgs(Context, Args); @@ -11258,37 +9703,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeDeletePkConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i128")) + if (ReducerName == TEXT("delete_pk_i_128")) { FDeletePkI128Args Args = ReducerEvent.Reducer.GetAsDeletePkI128(); Reducers->InvokeDeletePkI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i16")) + if (ReducerName == TEXT("delete_pk_i_16")) { FDeletePkI16Args Args = ReducerEvent.Reducer.GetAsDeletePkI16(); Reducers->InvokeDeletePkI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i256")) + if (ReducerName == TEXT("delete_pk_i_256")) { FDeletePkI256Args Args = ReducerEvent.Reducer.GetAsDeletePkI256(); Reducers->InvokeDeletePkI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i32")) + if (ReducerName == TEXT("delete_pk_i_32")) { FDeletePkI32Args Args = ReducerEvent.Reducer.GetAsDeletePkI32(); Reducers->InvokeDeletePkI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i64")) + if (ReducerName == TEXT("delete_pk_i_64")) { FDeletePkI64Args Args = ReducerEvent.Reducer.GetAsDeletePkI64(); Reducers->InvokeDeletePkI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_i8")) + if (ReducerName == TEXT("delete_pk_i_8")) { FDeletePkI8Args Args = ReducerEvent.Reducer.GetAsDeletePkI8(); Reducers->InvokeDeletePkI8WithArgs(Context, Args); @@ -11306,49 +9751,49 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeDeletePkStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u128")) + if (ReducerName == TEXT("delete_pk_u_128")) { FDeletePkU128Args Args = ReducerEvent.Reducer.GetAsDeletePkU128(); Reducers->InvokeDeletePkU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u16")) + if (ReducerName == TEXT("delete_pk_u_16")) { FDeletePkU16Args Args = ReducerEvent.Reducer.GetAsDeletePkU16(); Reducers->InvokeDeletePkU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u256")) + if (ReducerName == TEXT("delete_pk_u_256")) { FDeletePkU256Args Args = ReducerEvent.Reducer.GetAsDeletePkU256(); Reducers->InvokeDeletePkU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u32")) + if (ReducerName == TEXT("delete_pk_u_32")) { FDeletePkU32Args Args = ReducerEvent.Reducer.GetAsDeletePkU32(); Reducers->InvokeDeletePkU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u32_insert_pk_u32_two")) + if (ReducerName == TEXT("delete_pk_u_32_insert_pk_u_32_two")) { FDeletePkU32InsertPkU32TwoArgs Args = ReducerEvent.Reducer.GetAsDeletePkU32InsertPkU32Two(); Reducers->InvokeDeletePkU32InsertPkU32TwoWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u32_two")) + if (ReducerName == TEXT("delete_pk_u_32_two")) { FDeletePkU32TwoArgs Args = ReducerEvent.Reducer.GetAsDeletePkU32Two(); Reducers->InvokeDeletePkU32TwoWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u64")) + if (ReducerName == TEXT("delete_pk_u_64")) { FDeletePkU64Args Args = ReducerEvent.Reducer.GetAsDeletePkU64(); Reducers->InvokeDeletePkU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_pk_u8")) + if (ReducerName == TEXT("delete_pk_u_8")) { FDeletePkU8Args Args = ReducerEvent.Reducer.GetAsDeletePkU8(); Reducers->InvokeDeletePkU8WithArgs(Context, Args); @@ -11372,37 +9817,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeDeleteUniqueConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i128")) + if (ReducerName == TEXT("delete_unique_i_128")) { FDeleteUniqueI128Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI128(); Reducers->InvokeDeleteUniqueI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i16")) + if (ReducerName == TEXT("delete_unique_i_16")) { FDeleteUniqueI16Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI16(); Reducers->InvokeDeleteUniqueI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i256")) + if (ReducerName == TEXT("delete_unique_i_256")) { FDeleteUniqueI256Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI256(); Reducers->InvokeDeleteUniqueI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i32")) + if (ReducerName == TEXT("delete_unique_i_32")) { FDeleteUniqueI32Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI32(); Reducers->InvokeDeleteUniqueI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i64")) + if (ReducerName == TEXT("delete_unique_i_64")) { FDeleteUniqueI64Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI64(); Reducers->InvokeDeleteUniqueI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_i8")) + if (ReducerName == TEXT("delete_unique_i_8")) { FDeleteUniqueI8Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueI8(); Reducers->InvokeDeleteUniqueI8WithArgs(Context, Args); @@ -11420,37 +9865,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeDeleteUniqueStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u128")) + if (ReducerName == TEXT("delete_unique_u_128")) { FDeleteUniqueU128Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU128(); Reducers->InvokeDeleteUniqueU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u16")) + if (ReducerName == TEXT("delete_unique_u_16")) { FDeleteUniqueU16Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU16(); Reducers->InvokeDeleteUniqueU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u256")) + if (ReducerName == TEXT("delete_unique_u_256")) { FDeleteUniqueU256Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU256(); Reducers->InvokeDeleteUniqueU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u32")) + if (ReducerName == TEXT("delete_unique_u_32")) { FDeleteUniqueU32Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU32(); Reducers->InvokeDeleteUniqueU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u64")) + if (ReducerName == TEXT("delete_unique_u_64")) { FDeleteUniqueU64Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU64(); Reducers->InvokeDeleteUniqueU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("delete_unique_u8")) + if (ReducerName == TEXT("delete_unique_u_8")) { FDeleteUniqueU8Args Args = ReducerEvent.Reducer.GetAsDeleteUniqueU8(); Reducers->InvokeDeleteUniqueU8WithArgs(Context, Args); @@ -11468,13 +9913,13 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertCallTimestampWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_call_uuid_v4")) + if (ReducerName == TEXT("insert_call_uuid_v_4")) { FInsertCallUuidV4Args Args = ReducerEvent.Reducer.GetAsInsertCallUuidV4(); Reducers->InvokeInsertCallUuidV4WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_call_uuid_v7")) + if (ReducerName == TEXT("insert_call_uuid_v_7")) { FInsertCallUuidV7Args Args = ReducerEvent.Reducer.GetAsInsertCallUuidV7(); Reducers->InvokeInsertCallUuidV7WithArgs(Context, Args); @@ -11528,7 +9973,7 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertCallerVecIdentityWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_into_btree_u32")) + if (ReducerName == TEXT("insert_into_btree_u_32")) { FInsertIntoBtreeU32Args Args = ReducerEvent.Reducer.GetAsInsertIntoBtreeU32(); Reducers->InvokeInsertIntoBtreeU32WithArgs(Context, Args); @@ -11540,7 +9985,7 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertIntoIndexedSimpleEnumWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_into_pk_btree_u32")) + if (ReducerName == TEXT("insert_into_pk_btree_u_32")) { FInsertIntoPkBtreeU32Args Args = ReducerEvent.Reducer.GetAsInsertIntoPkBtreeU32(); Reducers->InvokeInsertIntoPkBtreeU32WithArgs(Context, Args); @@ -11588,49 +10033,49 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertOneEveryVecStructWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_f32")) + if (ReducerName == TEXT("insert_one_f_32")) { FInsertOneF32Args Args = ReducerEvent.Reducer.GetAsInsertOneF32(); Reducers->InvokeInsertOneF32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_f64")) + if (ReducerName == TEXT("insert_one_f_64")) { FInsertOneF64Args Args = ReducerEvent.Reducer.GetAsInsertOneF64(); Reducers->InvokeInsertOneF64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i128")) + if (ReducerName == TEXT("insert_one_i_128")) { FInsertOneI128Args Args = ReducerEvent.Reducer.GetAsInsertOneI128(); Reducers->InvokeInsertOneI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i16")) + if (ReducerName == TEXT("insert_one_i_16")) { FInsertOneI16Args Args = ReducerEvent.Reducer.GetAsInsertOneI16(); Reducers->InvokeInsertOneI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i256")) + if (ReducerName == TEXT("insert_one_i_256")) { FInsertOneI256Args Args = ReducerEvent.Reducer.GetAsInsertOneI256(); Reducers->InvokeInsertOneI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i32")) + if (ReducerName == TEXT("insert_one_i_32")) { FInsertOneI32Args Args = ReducerEvent.Reducer.GetAsInsertOneI32(); Reducers->InvokeInsertOneI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i64")) + if (ReducerName == TEXT("insert_one_i_64")) { FInsertOneI64Args Args = ReducerEvent.Reducer.GetAsInsertOneI64(); Reducers->InvokeInsertOneI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_i8")) + if (ReducerName == TEXT("insert_one_i_8")) { FInsertOneI8Args Args = ReducerEvent.Reducer.GetAsInsertOneI8(); Reducers->InvokeInsertOneI8WithArgs(Context, Args); @@ -11660,37 +10105,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertOneTimestampWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u128")) + if (ReducerName == TEXT("insert_one_u_128")) { FInsertOneU128Args Args = ReducerEvent.Reducer.GetAsInsertOneU128(); Reducers->InvokeInsertOneU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u16")) + if (ReducerName == TEXT("insert_one_u_16")) { FInsertOneU16Args Args = ReducerEvent.Reducer.GetAsInsertOneU16(); Reducers->InvokeInsertOneU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u256")) + if (ReducerName == TEXT("insert_one_u_256")) { FInsertOneU256Args Args = ReducerEvent.Reducer.GetAsInsertOneU256(); Reducers->InvokeInsertOneU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u32")) + if (ReducerName == TEXT("insert_one_u_32")) { FInsertOneU32Args Args = ReducerEvent.Reducer.GetAsInsertOneU32(); Reducers->InvokeInsertOneU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u64")) + if (ReducerName == TEXT("insert_one_u_64")) { FInsertOneU64Args Args = ReducerEvent.Reducer.GetAsInsertOneU64(); Reducers->InvokeInsertOneU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_one_u8")) + if (ReducerName == TEXT("insert_one_u_8")) { FInsertOneU8Args Args = ReducerEvent.Reducer.GetAsInsertOneU8(); Reducers->InvokeInsertOneU8WithArgs(Context, Args); @@ -11714,7 +10159,7 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertOptionEveryPrimitiveStructWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_option_i32")) + if (ReducerName == TEXT("insert_option_i_32")) { FInsertOptionI32Args Args = ReducerEvent.Reducer.GetAsInsertOptionI32(); Reducers->InvokeInsertOptionI32WithArgs(Context, Args); @@ -11744,7 +10189,7 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertOptionUuidWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_option_vec_option_i32")) + if (ReducerName == TEXT("insert_option_vec_option_i_32")) { FInsertOptionVecOptionI32Args Args = ReducerEvent.Reducer.GetAsInsertOptionVecOptionI32(); Reducers->InvokeInsertOptionVecOptionI32WithArgs(Context, Args); @@ -11762,37 +10207,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertPkConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i128")) + if (ReducerName == TEXT("insert_pk_i_128")) { FInsertPkI128Args Args = ReducerEvent.Reducer.GetAsInsertPkI128(); Reducers->InvokeInsertPkI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i16")) + if (ReducerName == TEXT("insert_pk_i_16")) { FInsertPkI16Args Args = ReducerEvent.Reducer.GetAsInsertPkI16(); Reducers->InvokeInsertPkI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i256")) + if (ReducerName == TEXT("insert_pk_i_256")) { FInsertPkI256Args Args = ReducerEvent.Reducer.GetAsInsertPkI256(); Reducers->InvokeInsertPkI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i32")) + if (ReducerName == TEXT("insert_pk_i_32")) { FInsertPkI32Args Args = ReducerEvent.Reducer.GetAsInsertPkI32(); Reducers->InvokeInsertPkI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i64")) + if (ReducerName == TEXT("insert_pk_i_64")) { FInsertPkI64Args Args = ReducerEvent.Reducer.GetAsInsertPkI64(); Reducers->InvokeInsertPkI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_i8")) + if (ReducerName == TEXT("insert_pk_i_8")) { FInsertPkI8Args Args = ReducerEvent.Reducer.GetAsInsertPkI8(); Reducers->InvokeInsertPkI8WithArgs(Context, Args); @@ -11816,43 +10261,43 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertPkStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u128")) + if (ReducerName == TEXT("insert_pk_u_128")) { FInsertPkU128Args Args = ReducerEvent.Reducer.GetAsInsertPkU128(); Reducers->InvokeInsertPkU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u16")) + if (ReducerName == TEXT("insert_pk_u_16")) { FInsertPkU16Args Args = ReducerEvent.Reducer.GetAsInsertPkU16(); Reducers->InvokeInsertPkU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u256")) + if (ReducerName == TEXT("insert_pk_u_256")) { FInsertPkU256Args Args = ReducerEvent.Reducer.GetAsInsertPkU256(); Reducers->InvokeInsertPkU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u32")) + if (ReducerName == TEXT("insert_pk_u_32")) { FInsertPkU32Args Args = ReducerEvent.Reducer.GetAsInsertPkU32(); Reducers->InvokeInsertPkU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u32_two")) + if (ReducerName == TEXT("insert_pk_u_32_two")) { FInsertPkU32TwoArgs Args = ReducerEvent.Reducer.GetAsInsertPkU32Two(); Reducers->InvokeInsertPkU32TwoWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u64")) + if (ReducerName == TEXT("insert_pk_u_64")) { FInsertPkU64Args Args = ReducerEvent.Reducer.GetAsInsertPkU64(); Reducers->InvokeInsertPkU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_pk_u8")) + if (ReducerName == TEXT("insert_pk_u_8")) { FInsertPkU8Args Args = ReducerEvent.Reducer.GetAsInsertPkU8(); Reducers->InvokeInsertPkU8WithArgs(Context, Args); @@ -11876,7 +10321,7 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertResultEveryPrimitiveStructStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_result_i32_string")) + if (ReducerName == TEXT("insert_result_i_32_string")) { FInsertResultI32StringArgs Args = ReducerEvent.Reducer.GetAsInsertResultI32String(); Reducers->InvokeInsertResultI32StringWithArgs(Context, Args); @@ -11888,19 +10333,19 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertResultIdentityStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_result_simple_enum_i32")) + if (ReducerName == TEXT("insert_result_simple_enum_i_32")) { FInsertResultSimpleEnumI32Args Args = ReducerEvent.Reducer.GetAsInsertResultSimpleEnumI32(); Reducers->InvokeInsertResultSimpleEnumI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_result_string_i32")) + if (ReducerName == TEXT("insert_result_string_i_32")) { FInsertResultStringI32Args Args = ReducerEvent.Reducer.GetAsInsertResultStringI32(); Reducers->InvokeInsertResultStringI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_result_vec_i32_string")) + if (ReducerName == TEXT("insert_result_vec_i_32_string")) { FInsertResultVecI32StringArgs Args = ReducerEvent.Reducer.GetAsInsertResultVecI32String(); Reducers->InvokeInsertResultVecI32StringWithArgs(Context, Args); @@ -11924,37 +10369,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertUniqueConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i128")) + if (ReducerName == TEXT("insert_unique_i_128")) { FInsertUniqueI128Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI128(); Reducers->InvokeInsertUniqueI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i16")) + if (ReducerName == TEXT("insert_unique_i_16")) { FInsertUniqueI16Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI16(); Reducers->InvokeInsertUniqueI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i256")) + if (ReducerName == TEXT("insert_unique_i_256")) { FInsertUniqueI256Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI256(); Reducers->InvokeInsertUniqueI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i32")) + if (ReducerName == TEXT("insert_unique_i_32")) { FInsertUniqueI32Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI32(); Reducers->InvokeInsertUniqueI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i64")) + if (ReducerName == TEXT("insert_unique_i_64")) { FInsertUniqueI64Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI64(); Reducers->InvokeInsertUniqueI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_i8")) + if (ReducerName == TEXT("insert_unique_i_8")) { FInsertUniqueI8Args Args = ReducerEvent.Reducer.GetAsInsertUniqueI8(); Reducers->InvokeInsertUniqueI8WithArgs(Context, Args); @@ -11972,43 +10417,43 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertUniqueStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u128")) + if (ReducerName == TEXT("insert_unique_u_128")) { FInsertUniqueU128Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU128(); Reducers->InvokeInsertUniqueU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u16")) + if (ReducerName == TEXT("insert_unique_u_16")) { FInsertUniqueU16Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU16(); Reducers->InvokeInsertUniqueU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u256")) + if (ReducerName == TEXT("insert_unique_u_256")) { FInsertUniqueU256Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU256(); Reducers->InvokeInsertUniqueU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u32")) + if (ReducerName == TEXT("insert_unique_u_32")) { FInsertUniqueU32Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU32(); Reducers->InvokeInsertUniqueU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u32_update_pk_u32")) + if (ReducerName == TEXT("insert_unique_u_32_update_pk_u_32")) { FInsertUniqueU32UpdatePkU32Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU32UpdatePkU32(); Reducers->InvokeInsertUniqueU32UpdatePkU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u64")) + if (ReducerName == TEXT("insert_unique_u_64")) { FInsertUniqueU64Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU64(); Reducers->InvokeInsertUniqueU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_unique_u8")) + if (ReducerName == TEXT("insert_unique_u_8")) { FInsertUniqueU8Args Args = ReducerEvent.Reducer.GetAsInsertUniqueU8(); Reducers->InvokeInsertUniqueU8WithArgs(Context, Args); @@ -12062,49 +10507,49 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertVecEveryVecStructWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_f32")) + if (ReducerName == TEXT("insert_vec_f_32")) { FInsertVecF32Args Args = ReducerEvent.Reducer.GetAsInsertVecF32(); Reducers->InvokeInsertVecF32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_f64")) + if (ReducerName == TEXT("insert_vec_f_64")) { FInsertVecF64Args Args = ReducerEvent.Reducer.GetAsInsertVecF64(); Reducers->InvokeInsertVecF64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i128")) + if (ReducerName == TEXT("insert_vec_i_128")) { FInsertVecI128Args Args = ReducerEvent.Reducer.GetAsInsertVecI128(); Reducers->InvokeInsertVecI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i16")) + if (ReducerName == TEXT("insert_vec_i_16")) { FInsertVecI16Args Args = ReducerEvent.Reducer.GetAsInsertVecI16(); Reducers->InvokeInsertVecI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i256")) + if (ReducerName == TEXT("insert_vec_i_256")) { FInsertVecI256Args Args = ReducerEvent.Reducer.GetAsInsertVecI256(); Reducers->InvokeInsertVecI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i32")) + if (ReducerName == TEXT("insert_vec_i_32")) { FInsertVecI32Args Args = ReducerEvent.Reducer.GetAsInsertVecI32(); Reducers->InvokeInsertVecI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i64")) + if (ReducerName == TEXT("insert_vec_i_64")) { FInsertVecI64Args Args = ReducerEvent.Reducer.GetAsInsertVecI64(); Reducers->InvokeInsertVecI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_i8")) + if (ReducerName == TEXT("insert_vec_i_8")) { FInsertVecI8Args Args = ReducerEvent.Reducer.GetAsInsertVecI8(); Reducers->InvokeInsertVecI8WithArgs(Context, Args); @@ -12134,37 +10579,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeInsertVecTimestampWithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u128")) + if (ReducerName == TEXT("insert_vec_u_128")) { FInsertVecU128Args Args = ReducerEvent.Reducer.GetAsInsertVecU128(); Reducers->InvokeInsertVecU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u16")) + if (ReducerName == TEXT("insert_vec_u_16")) { FInsertVecU16Args Args = ReducerEvent.Reducer.GetAsInsertVecU16(); Reducers->InvokeInsertVecU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u256")) + if (ReducerName == TEXT("insert_vec_u_256")) { FInsertVecU256Args Args = ReducerEvent.Reducer.GetAsInsertVecU256(); Reducers->InvokeInsertVecU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u32")) + if (ReducerName == TEXT("insert_vec_u_32")) { FInsertVecU32Args Args = ReducerEvent.Reducer.GetAsInsertVecU32(); Reducers->InvokeInsertVecU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u64")) + if (ReducerName == TEXT("insert_vec_u_64")) { FInsertVecU64Args Args = ReducerEvent.Reducer.GetAsInsertVecU64(); Reducers->InvokeInsertVecU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("insert_vec_u8")) + if (ReducerName == TEXT("insert_vec_u_8")) { FInsertVecU8Args Args = ReducerEvent.Reducer.GetAsInsertVecU8(); Reducers->InvokeInsertVecU8WithArgs(Context, Args); @@ -12212,37 +10657,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeUpdatePkConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i128")) + if (ReducerName == TEXT("update_pk_i_128")) { FUpdatePkI128Args Args = ReducerEvent.Reducer.GetAsUpdatePkI128(); Reducers->InvokeUpdatePkI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i16")) + if (ReducerName == TEXT("update_pk_i_16")) { FUpdatePkI16Args Args = ReducerEvent.Reducer.GetAsUpdatePkI16(); Reducers->InvokeUpdatePkI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i256")) + if (ReducerName == TEXT("update_pk_i_256")) { FUpdatePkI256Args Args = ReducerEvent.Reducer.GetAsUpdatePkI256(); Reducers->InvokeUpdatePkI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i32")) + if (ReducerName == TEXT("update_pk_i_32")) { FUpdatePkI32Args Args = ReducerEvent.Reducer.GetAsUpdatePkI32(); Reducers->InvokeUpdatePkI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i64")) + if (ReducerName == TEXT("update_pk_i_64")) { FUpdatePkI64Args Args = ReducerEvent.Reducer.GetAsUpdatePkI64(); Reducers->InvokeUpdatePkI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_i8")) + if (ReducerName == TEXT("update_pk_i_8")) { FUpdatePkI8Args Args = ReducerEvent.Reducer.GetAsUpdatePkI8(); Reducers->InvokeUpdatePkI8WithArgs(Context, Args); @@ -12266,43 +10711,43 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeUpdatePkStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u128")) + if (ReducerName == TEXT("update_pk_u_128")) { FUpdatePkU128Args Args = ReducerEvent.Reducer.GetAsUpdatePkU128(); Reducers->InvokeUpdatePkU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u16")) + if (ReducerName == TEXT("update_pk_u_16")) { FUpdatePkU16Args Args = ReducerEvent.Reducer.GetAsUpdatePkU16(); Reducers->InvokeUpdatePkU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u256")) + if (ReducerName == TEXT("update_pk_u_256")) { FUpdatePkU256Args Args = ReducerEvent.Reducer.GetAsUpdatePkU256(); Reducers->InvokeUpdatePkU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u32")) + if (ReducerName == TEXT("update_pk_u_32")) { FUpdatePkU32Args Args = ReducerEvent.Reducer.GetAsUpdatePkU32(); Reducers->InvokeUpdatePkU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u32_two")) + if (ReducerName == TEXT("update_pk_u_32_two")) { FUpdatePkU32TwoArgs Args = ReducerEvent.Reducer.GetAsUpdatePkU32Two(); Reducers->InvokeUpdatePkU32TwoWithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u64")) + if (ReducerName == TEXT("update_pk_u_64")) { FUpdatePkU64Args Args = ReducerEvent.Reducer.GetAsUpdatePkU64(); Reducers->InvokeUpdatePkU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_pk_u8")) + if (ReducerName == TEXT("update_pk_u_8")) { FUpdatePkU8Args Args = ReducerEvent.Reducer.GetAsUpdatePkU8(); Reducers->InvokeUpdatePkU8WithArgs(Context, Args); @@ -12326,37 +10771,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeUpdateUniqueConnectionIdWithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i128")) + if (ReducerName == TEXT("update_unique_i_128")) { FUpdateUniqueI128Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI128(); Reducers->InvokeUpdateUniqueI128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i16")) + if (ReducerName == TEXT("update_unique_i_16")) { FUpdateUniqueI16Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI16(); Reducers->InvokeUpdateUniqueI16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i256")) + if (ReducerName == TEXT("update_unique_i_256")) { FUpdateUniqueI256Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI256(); Reducers->InvokeUpdateUniqueI256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i32")) + if (ReducerName == TEXT("update_unique_i_32")) { FUpdateUniqueI32Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI32(); Reducers->InvokeUpdateUniqueI32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i64")) + if (ReducerName == TEXT("update_unique_i_64")) { FUpdateUniqueI64Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI64(); Reducers->InvokeUpdateUniqueI64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_i8")) + if (ReducerName == TEXT("update_unique_i_8")) { FUpdateUniqueI8Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueI8(); Reducers->InvokeUpdateUniqueI8WithArgs(Context, Args); @@ -12374,37 +10819,37 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) Reducers->InvokeUpdateUniqueStringWithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u128")) + if (ReducerName == TEXT("update_unique_u_128")) { FUpdateUniqueU128Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU128(); Reducers->InvokeUpdateUniqueU128WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u16")) + if (ReducerName == TEXT("update_unique_u_16")) { FUpdateUniqueU16Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU16(); Reducers->InvokeUpdateUniqueU16WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u256")) + if (ReducerName == TEXT("update_unique_u_256")) { FUpdateUniqueU256Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU256(); Reducers->InvokeUpdateUniqueU256WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u32")) + if (ReducerName == TEXT("update_unique_u_32")) { FUpdateUniqueU32Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU32(); Reducers->InvokeUpdateUniqueU32WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u64")) + if (ReducerName == TEXT("update_unique_u_64")) { FUpdateUniqueU64Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU64(); Reducers->InvokeUpdateUniqueU64WithArgs(Context, Args); return; } - if (ReducerName == TEXT("update_unique_u8")) + if (ReducerName == TEXT("update_unique_u_8")) { FUpdateUniqueU8Args Args = ReducerEvent.Reducer.GetAsUpdateUniqueU8(); Reducers->InvokeUpdateUniqueU8WithArgs(Context, Args); @@ -12591,6 +11036,7 @@ void UDbConnection::ForwardOnConnect(UDbConnectionBase* BaseConnection, FSpaceti } void UDbConnection::ForwardOnDisconnect(UDbConnectionBase* BaseConnection, const FString& Error) { + PendingTypedReducers.Empty(); if (OnDisconnectDelegate.IsBound()) { OnDisconnectDelegate.Execute(this, Error); @@ -12608,7 +11054,13 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime case ESpacetimeDBEventTag::Reducer: { FReducerEvent ReducerEvent = Event.GetAsReducer(); - FReducer Reducer = DecodeReducer(ReducerEvent); + FReducer Reducer; + if (!TryGetPendingTypedReducer(ReducerEvent.RequestId, Reducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), ReducerEvent.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } BaseEvent = FTestClientEvent::Reducer(Reducer); break; } @@ -12625,6 +11077,10 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime BaseEvent = FTestClientEvent::Disconnected(Event.GetAsDisconnected()); break; + case ESpacetimeDBEventTag::Transaction: + BaseEvent = FTestClientEvent::Transaction(Event.GetAsTransaction()); + break; + case ESpacetimeDBEventTag::SubscribeError: BaseEvent = FTestClientEvent::SubscribeError(Event.GetAsSubscribeError()); break; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Private/Tests/CommonTestFunctions.cpp b/sdks/unreal/tests/TestClient/Source/TestClient/Private/Tests/CommonTestFunctions.cpp index b7805effb9a..a7b5faea2fb 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Private/Tests/CommonTestFunctions.cpp +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Private/Tests/CommonTestFunctions.cpp @@ -161,6 +161,7 @@ void SubscribeAllThen(UDbConnection* Conn, }; TestHelper->OnSubscriptionError = [](FErrorContext Ctx) { + UE_LOG(LogTemp, Error, TEXT("Subscription errored: %s"), *Ctx.Error); checkf(false, TEXT("Subscription errored: %s"), *Ctx.Error); }; @@ -190,6 +191,7 @@ void SubscribeTheseThen(UDbConnection* Conn, }; TestHelper->OnSubscriptionError = [](FErrorContext Ctx) { + UE_LOG(LogTemp, Error, TEXT("Subscription errored: %s"), *Ctx.Error); checkf(false, TEXT("Subscription errored: %s"), *Ctx.Error); }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalEveryPrimitiveStruct.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalEveryPrimitiveStruct.g.h index e012ce243d3..b7d5b704dce 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalEveryPrimitiveStruct.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalEveryPrimitiveStruct.g.h @@ -16,7 +16,7 @@ struct TESTCLIENT_API FTestClientOptionalEveryPrimitiveStruct bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FEveryPrimitiveStructType Value; + FEveryPrimitiveStructType Value = {}; FTestClientOptionalEveryPrimitiveStruct() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalIdentity.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalIdentity.g.h index aba5ea23570..c619be5a59d 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalIdentity.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalIdentity.g.h @@ -16,7 +16,7 @@ struct TESTCLIENT_API FTestClientOptionalIdentity bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FSpacetimeDBIdentity Value; + FSpacetimeDBIdentity Value = {}; FTestClientOptionalIdentity() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalInt32.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalInt32.g.h index 3fcc5bfdda0..174837ff6c2 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalInt32.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalInt32.g.h @@ -15,7 +15,7 @@ struct TESTCLIENT_API FTestClientOptionalInt32 bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - int32 Value; + int32 Value = {}; FTestClientOptionalInt32() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalSimpleEnum.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalSimpleEnum.g.h index 4889acee798..58fa60d6c70 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalSimpleEnum.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalSimpleEnum.g.h @@ -16,7 +16,7 @@ struct TESTCLIENT_API FTestClientOptionalSimpleEnum bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - ESimpleEnumType Value; + ESimpleEnumType Value = {}; FTestClientOptionalSimpleEnum() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalString.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalString.g.h index 39116b13c1f..410b852dcc0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalString.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalString.g.h @@ -15,7 +15,7 @@ struct TESTCLIENT_API FTestClientOptionalString bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FString Value; + FString Value = {}; FTestClientOptionalString() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalUuid.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalUuid.g.h index 64136bc683b..91a88e0fa19 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalUuid.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalUuid.g.h @@ -16,7 +16,7 @@ struct TESTCLIENT_API FTestClientOptionalUuid bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - FSpacetimeDBUuid Value; + FSpacetimeDBUuid Value = {}; FTestClientOptionalUuid() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalVecOptionalInt32.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalVecOptionalInt32.g.h index 5b896723bc1..f3a56a3481e 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalVecOptionalInt32.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Optionals/TestClientOptionalVecOptionalInt32.g.h @@ -15,7 +15,7 @@ struct TESTCLIENT_API FTestClientOptionalVecOptionalInt32 bool bHasValue = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bHasValue")) - TArray Value; + TArray Value = {}; FTestClientOptionalVecOptionalInt32() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultEveryPrimitiveStructString.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultEveryPrimitiveStructString.g.h index b70751e72ea..12d3ea7b444 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultEveryPrimitiveStructString.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultEveryPrimitiveStructString.g.h @@ -16,10 +16,10 @@ struct TESTCLIENT_API FTestClientResultEveryPrimitiveStructString bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - FEveryPrimitiveStructType OkValue; + FEveryPrimitiveStructType OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - FString ErrValue; + FString ErrValue = {}; FTestClientResultEveryPrimitiveStructString() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultIdentityString.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultIdentityString.g.h index d4fef91a60d..1b2d9768158 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultIdentityString.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultIdentityString.g.h @@ -16,10 +16,10 @@ struct TESTCLIENT_API FTestClientResultIdentityString bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - FSpacetimeDBIdentity OkValue; + FSpacetimeDBIdentity OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - FString ErrValue; + FString ErrValue = {}; FTestClientResultIdentityString() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultInt32String.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultInt32String.g.h index b8fc02c91e8..7e30c546452 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultInt32String.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultInt32String.g.h @@ -15,10 +15,10 @@ struct TESTCLIENT_API FTestClientResultInt32String bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - int32 OkValue; + int32 OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - FString ErrValue; + FString ErrValue = {}; FTestClientResultInt32String() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultSimpleEnumInt32.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultSimpleEnumInt32.g.h index 1f3a9fff848..52ecf52e3a8 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultSimpleEnumInt32.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultSimpleEnumInt32.g.h @@ -16,10 +16,10 @@ struct TESTCLIENT_API FTestClientResultSimpleEnumInt32 bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - ESimpleEnumType OkValue; + ESimpleEnumType OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - int32 ErrValue; + int32 ErrValue = {}; FTestClientResultSimpleEnumInt32() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultStringInt32.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultStringInt32.g.h index b1df79a3245..382f37d16d4 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultStringInt32.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultStringInt32.g.h @@ -15,10 +15,10 @@ struct TESTCLIENT_API FTestClientResultStringInt32 bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - FString OkValue; + FString OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - int32 ErrValue; + int32 ErrValue = {}; FTestClientResultStringInt32() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultVecInt32String.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultVecInt32String.g.h index 92cc0108bd6..48707d44f45 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultVecInt32String.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Results/TestClientResultVecInt32String.g.h @@ -15,10 +15,10 @@ struct TESTCLIENT_API FTestClientResultVecInt32String bool bIsOk = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "bIsOk")) - TArray OkValue; + TArray OkValue = {}; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpacetimeDB", meta = (EditCondition = "!bIsOk")) - FString ErrValue; + FString ErrValue = {}; FTestClientResultVecInt32String() = default; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/SpacetimeDBClient.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/SpacetimeDBClient.g.h index 29874d776ae..1fb7d093579 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/SpacetimeDBClient.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/SpacetimeDBClient.g.h @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 1.12.0 (commit 11e258c2f8c9de8f67098f65e3f6a9db32026768). +// This was generated using spacetimedb cli version 2.0.3 (commit b6045fcc908d2846f8fb26570c2f300f5d685996). #pragma once #include "CoreMinimal.h" @@ -9,7 +9,6 @@ #include "Connection/Callback.h" #include "Connection/DbConnectionBase.h" #include "Connection/DbConnectionBuilder.h" -#include "Connection/SetReducerFlags.h" #include "Connection/Subscription.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "ModuleBindings/Optionals/TestClientOptionalEveryPrimitiveStruct.g.h" @@ -376,7 +375,7 @@ struct TESTCLIENT_API FContextBase { GENERATED_BODY() - FContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Procedures(nullptr), Conn(nullptr) {}; + FContextBase() : Db(nullptr), Reducers(nullptr), Procedures(nullptr), Conn(nullptr) {}; FContextBase(UDbConnection* InConn); UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") @@ -385,9 +384,6 @@ struct TESTCLIENT_API FContextBase UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteProcedures* Procedures; @@ -415,9 +411,6 @@ class TESTCLIENT_API UContextBaseBpLib : public UBlueprintFunctionLibrary UFUNCTION(BlueprintPure, Category="SpacetimeDB") static URemoteReducers* GetReducers(const FContextBase& Ctx) { return Ctx.Reducers; } - UFUNCTION(BlueprintPure, Category="SpacetimeDB") - static USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) { return Ctx.SetReducerFlags; } - static URemoteProcedures* GetProcedures(const FContextBase& Ctx) { return Ctx.Procedures; } UFUNCTION(BlueprintPure, Category="SpacetimeDB") @@ -648,7 +641,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteFromBtreeU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_from_btree_u32"); + Out.ReducerName = TEXT("delete_from_btree_u_32"); return Out; } @@ -712,7 +705,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i128"); + Out.ReducerName = TEXT("delete_pk_i_128"); return Out; } @@ -728,7 +721,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i16"); + Out.ReducerName = TEXT("delete_pk_i_16"); return Out; } @@ -744,7 +737,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i256"); + Out.ReducerName = TEXT("delete_pk_i_256"); return Out; } @@ -760,7 +753,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i32"); + Out.ReducerName = TEXT("delete_pk_i_32"); return Out; } @@ -776,7 +769,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i64"); + Out.ReducerName = TEXT("delete_pk_i_64"); return Out; } @@ -792,7 +785,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_i8"); + Out.ReducerName = TEXT("delete_pk_i_8"); return Out; } @@ -840,7 +833,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u128"); + Out.ReducerName = TEXT("delete_pk_u_128"); return Out; } @@ -856,7 +849,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u16"); + Out.ReducerName = TEXT("delete_pk_u_16"); return Out; } @@ -872,7 +865,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u256"); + Out.ReducerName = TEXT("delete_pk_u_256"); return Out; } @@ -888,7 +881,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u32"); + Out.ReducerName = TEXT("delete_pk_u_32"); return Out; } @@ -904,7 +897,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU32InsertPkU32Two; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u32_insert_pk_u32_two"); + Out.ReducerName = TEXT("delete_pk_u_32_insert_pk_u_32_two"); return Out; } @@ -920,7 +913,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU32Two; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u32_two"); + Out.ReducerName = TEXT("delete_pk_u_32_two"); return Out; } @@ -936,7 +929,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u64"); + Out.ReducerName = TEXT("delete_pk_u_64"); return Out; } @@ -952,7 +945,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeletePkU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_pk_u8"); + Out.ReducerName = TEXT("delete_pk_u_8"); return Out; } @@ -1016,7 +1009,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i128"); + Out.ReducerName = TEXT("delete_unique_i_128"); return Out; } @@ -1032,7 +1025,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i16"); + Out.ReducerName = TEXT("delete_unique_i_16"); return Out; } @@ -1048,7 +1041,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i256"); + Out.ReducerName = TEXT("delete_unique_i_256"); return Out; } @@ -1064,7 +1057,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i32"); + Out.ReducerName = TEXT("delete_unique_i_32"); return Out; } @@ -1080,7 +1073,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i64"); + Out.ReducerName = TEXT("delete_unique_i_64"); return Out; } @@ -1096,7 +1089,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_i8"); + Out.ReducerName = TEXT("delete_unique_i_8"); return Out; } @@ -1144,7 +1137,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u128"); + Out.ReducerName = TEXT("delete_unique_u_128"); return Out; } @@ -1160,7 +1153,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u16"); + Out.ReducerName = TEXT("delete_unique_u_16"); return Out; } @@ -1176,7 +1169,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u256"); + Out.ReducerName = TEXT("delete_unique_u_256"); return Out; } @@ -1192,7 +1185,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u32"); + Out.ReducerName = TEXT("delete_unique_u_32"); return Out; } @@ -1208,7 +1201,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u64"); + Out.ReducerName = TEXT("delete_unique_u_64"); return Out; } @@ -1224,7 +1217,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::DeleteUniqueU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("delete_unique_u8"); + Out.ReducerName = TEXT("delete_unique_u_8"); return Out; } @@ -1272,7 +1265,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertCallUuidV4; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_call_uuid_v4"); + Out.ReducerName = TEXT("insert_call_uuid_v_4"); return Out; } @@ -1288,7 +1281,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertCallUuidV7; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_call_uuid_v7"); + Out.ReducerName = TEXT("insert_call_uuid_v_7"); return Out; } @@ -1432,7 +1425,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertIntoBtreeU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_into_btree_u32"); + Out.ReducerName = TEXT("insert_into_btree_u_32"); return Out; } @@ -1464,7 +1457,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertIntoPkBtreeU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_into_pk_btree_u32"); + Out.ReducerName = TEXT("insert_into_pk_btree_u_32"); return Out; } @@ -1592,7 +1585,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneF32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_f32"); + Out.ReducerName = TEXT("insert_one_f_32"); return Out; } @@ -1608,7 +1601,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneF64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_f64"); + Out.ReducerName = TEXT("insert_one_f_64"); return Out; } @@ -1624,7 +1617,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i128"); + Out.ReducerName = TEXT("insert_one_i_128"); return Out; } @@ -1640,7 +1633,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i16"); + Out.ReducerName = TEXT("insert_one_i_16"); return Out; } @@ -1656,7 +1649,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i256"); + Out.ReducerName = TEXT("insert_one_i_256"); return Out; } @@ -1672,7 +1665,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i32"); + Out.ReducerName = TEXT("insert_one_i_32"); return Out; } @@ -1688,7 +1681,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i64"); + Out.ReducerName = TEXT("insert_one_i_64"); return Out; } @@ -1704,7 +1697,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_i8"); + Out.ReducerName = TEXT("insert_one_i_8"); return Out; } @@ -1784,7 +1777,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u128"); + Out.ReducerName = TEXT("insert_one_u_128"); return Out; } @@ -1800,7 +1793,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u16"); + Out.ReducerName = TEXT("insert_one_u_16"); return Out; } @@ -1816,7 +1809,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u256"); + Out.ReducerName = TEXT("insert_one_u_256"); return Out; } @@ -1832,7 +1825,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u32"); + Out.ReducerName = TEXT("insert_one_u_32"); return Out; } @@ -1848,7 +1841,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u64"); + Out.ReducerName = TEXT("insert_one_u_64"); return Out; } @@ -1864,7 +1857,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOneU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_one_u8"); + Out.ReducerName = TEXT("insert_one_u_8"); return Out; } @@ -1928,7 +1921,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOptionI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_option_i32"); + Out.ReducerName = TEXT("insert_option_i_32"); return Out; } @@ -2008,7 +2001,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertOptionVecOptionI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_option_vec_option_i32"); + Out.ReducerName = TEXT("insert_option_vec_option_i_32"); return Out; } @@ -2056,7 +2049,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i128"); + Out.ReducerName = TEXT("insert_pk_i_128"); return Out; } @@ -2072,7 +2065,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i16"); + Out.ReducerName = TEXT("insert_pk_i_16"); return Out; } @@ -2088,7 +2081,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i256"); + Out.ReducerName = TEXT("insert_pk_i_256"); return Out; } @@ -2104,7 +2097,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i32"); + Out.ReducerName = TEXT("insert_pk_i_32"); return Out; } @@ -2120,7 +2113,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i64"); + Out.ReducerName = TEXT("insert_pk_i_64"); return Out; } @@ -2136,7 +2129,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_i8"); + Out.ReducerName = TEXT("insert_pk_i_8"); return Out; } @@ -2200,7 +2193,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u128"); + Out.ReducerName = TEXT("insert_pk_u_128"); return Out; } @@ -2216,7 +2209,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u16"); + Out.ReducerName = TEXT("insert_pk_u_16"); return Out; } @@ -2232,7 +2225,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u256"); + Out.ReducerName = TEXT("insert_pk_u_256"); return Out; } @@ -2248,7 +2241,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u32"); + Out.ReducerName = TEXT("insert_pk_u_32"); return Out; } @@ -2264,7 +2257,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU32Two; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u32_two"); + Out.ReducerName = TEXT("insert_pk_u_32_two"); return Out; } @@ -2280,7 +2273,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u64"); + Out.ReducerName = TEXT("insert_pk_u_64"); return Out; } @@ -2296,7 +2289,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertPkU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_pk_u8"); + Out.ReducerName = TEXT("insert_pk_u_8"); return Out; } @@ -2360,7 +2353,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertResultI32String; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_result_i32_string"); + Out.ReducerName = TEXT("insert_result_i_32_string"); return Out; } @@ -2392,7 +2385,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertResultSimpleEnumI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_result_simple_enum_i32"); + Out.ReducerName = TEXT("insert_result_simple_enum_i_32"); return Out; } @@ -2408,7 +2401,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertResultStringI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_result_string_i32"); + Out.ReducerName = TEXT("insert_result_string_i_32"); return Out; } @@ -2424,7 +2417,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertResultVecI32String; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_result_vec_i32_string"); + Out.ReducerName = TEXT("insert_result_vec_i_32_string"); return Out; } @@ -2488,7 +2481,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i128"); + Out.ReducerName = TEXT("insert_unique_i_128"); return Out; } @@ -2504,7 +2497,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i16"); + Out.ReducerName = TEXT("insert_unique_i_16"); return Out; } @@ -2520,7 +2513,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i256"); + Out.ReducerName = TEXT("insert_unique_i_256"); return Out; } @@ -2536,7 +2529,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i32"); + Out.ReducerName = TEXT("insert_unique_i_32"); return Out; } @@ -2552,7 +2545,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i64"); + Out.ReducerName = TEXT("insert_unique_i_64"); return Out; } @@ -2568,7 +2561,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_i8"); + Out.ReducerName = TEXT("insert_unique_i_8"); return Out; } @@ -2616,7 +2609,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u128"); + Out.ReducerName = TEXT("insert_unique_u_128"); return Out; } @@ -2632,7 +2625,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u16"); + Out.ReducerName = TEXT("insert_unique_u_16"); return Out; } @@ -2648,7 +2641,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u256"); + Out.ReducerName = TEXT("insert_unique_u_256"); return Out; } @@ -2664,7 +2657,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u32"); + Out.ReducerName = TEXT("insert_unique_u_32"); return Out; } @@ -2680,7 +2673,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU32UpdatePkU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u32_update_pk_u32"); + Out.ReducerName = TEXT("insert_unique_u_32_update_pk_u_32"); return Out; } @@ -2696,7 +2689,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u64"); + Out.ReducerName = TEXT("insert_unique_u_64"); return Out; } @@ -2712,7 +2705,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertUniqueU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_unique_u8"); + Out.ReducerName = TEXT("insert_unique_u_8"); return Out; } @@ -2856,7 +2849,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecF32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_f32"); + Out.ReducerName = TEXT("insert_vec_f_32"); return Out; } @@ -2872,7 +2865,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecF64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_f64"); + Out.ReducerName = TEXT("insert_vec_f_64"); return Out; } @@ -2888,7 +2881,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i128"); + Out.ReducerName = TEXT("insert_vec_i_128"); return Out; } @@ -2904,7 +2897,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i16"); + Out.ReducerName = TEXT("insert_vec_i_16"); return Out; } @@ -2920,7 +2913,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i256"); + Out.ReducerName = TEXT("insert_vec_i_256"); return Out; } @@ -2936,7 +2929,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i32"); + Out.ReducerName = TEXT("insert_vec_i_32"); return Out; } @@ -2952,7 +2945,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i64"); + Out.ReducerName = TEXT("insert_vec_i_64"); return Out; } @@ -2968,7 +2961,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_i8"); + Out.ReducerName = TEXT("insert_vec_i_8"); return Out; } @@ -3048,7 +3041,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u128"); + Out.ReducerName = TEXT("insert_vec_u_128"); return Out; } @@ -3064,7 +3057,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u16"); + Out.ReducerName = TEXT("insert_vec_u_16"); return Out; } @@ -3080,7 +3073,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u256"); + Out.ReducerName = TEXT("insert_vec_u_256"); return Out; } @@ -3096,7 +3089,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u32"); + Out.ReducerName = TEXT("insert_vec_u_32"); return Out; } @@ -3112,7 +3105,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u64"); + Out.ReducerName = TEXT("insert_vec_u_64"); return Out; } @@ -3128,7 +3121,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::InsertVecU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("insert_vec_u8"); + Out.ReducerName = TEXT("insert_vec_u_8"); return Out; } @@ -3256,7 +3249,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i128"); + Out.ReducerName = TEXT("update_pk_i_128"); return Out; } @@ -3272,7 +3265,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i16"); + Out.ReducerName = TEXT("update_pk_i_16"); return Out; } @@ -3288,7 +3281,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i256"); + Out.ReducerName = TEXT("update_pk_i_256"); return Out; } @@ -3304,7 +3297,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i32"); + Out.ReducerName = TEXT("update_pk_i_32"); return Out; } @@ -3320,7 +3313,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i64"); + Out.ReducerName = TEXT("update_pk_i_64"); return Out; } @@ -3336,7 +3329,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_i8"); + Out.ReducerName = TEXT("update_pk_i_8"); return Out; } @@ -3400,7 +3393,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u128"); + Out.ReducerName = TEXT("update_pk_u_128"); return Out; } @@ -3416,7 +3409,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u16"); + Out.ReducerName = TEXT("update_pk_u_16"); return Out; } @@ -3432,7 +3425,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u256"); + Out.ReducerName = TEXT("update_pk_u_256"); return Out; } @@ -3448,7 +3441,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u32"); + Out.ReducerName = TEXT("update_pk_u_32"); return Out; } @@ -3464,7 +3457,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU32Two; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u32_two"); + Out.ReducerName = TEXT("update_pk_u_32_two"); return Out; } @@ -3480,7 +3473,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u64"); + Out.ReducerName = TEXT("update_pk_u_64"); return Out; } @@ -3496,7 +3489,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdatePkU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_pk_u8"); + Out.ReducerName = TEXT("update_pk_u_8"); return Out; } @@ -3560,7 +3553,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI128; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i128"); + Out.ReducerName = TEXT("update_unique_i_128"); return Out; } @@ -3576,7 +3569,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI16; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i16"); + Out.ReducerName = TEXT("update_unique_i_16"); return Out; } @@ -3592,7 +3585,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI256; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i256"); + Out.ReducerName = TEXT("update_unique_i_256"); return Out; } @@ -3608,7 +3601,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI32; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i32"); + Out.ReducerName = TEXT("update_unique_i_32"); return Out; } @@ -3624,7 +3617,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI64; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i64"); + Out.ReducerName = TEXT("update_unique_i_64"); return Out; } @@ -3640,7 +3633,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueI8; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_i8"); + Out.ReducerName = TEXT("update_unique_i_8"); return Out; } @@ -3688,7 +3681,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU128; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u128"); + Out.ReducerName = TEXT("update_unique_u_128"); return Out; } @@ -3704,7 +3697,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU16; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u16"); + Out.ReducerName = TEXT("update_unique_u_16"); return Out; } @@ -3720,7 +3713,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU256; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u256"); + Out.ReducerName = TEXT("update_unique_u_256"); return Out; } @@ -3736,7 +3729,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU32; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u32"); + Out.ReducerName = TEXT("update_unique_u_32"); return Out; } @@ -3752,7 +3745,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU64; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u64"); + Out.ReducerName = TEXT("update_unique_u_64"); return Out; } @@ -3768,7 +3761,7 @@ struct TESTCLIENT_API FReducer FReducer Out; Out.Tag = EReducerTag::UpdateUniqueU8; Out.Data.Set(Value); - Out.ReducerName = TEXT("update_unique_u8"); + Out.ReducerName = TEXT("update_unique_u_8"); return Out; } @@ -6896,6 +6889,14 @@ struct TESTCLIENT_API FTestClientEvent return Obj; } + static FTestClientEvent Transaction(const FSpacetimeDBUnit& Value) + { + FTestClientEvent Obj; + Obj.Tag = ESpacetimeDBEventTag::Transaction; + Obj.MessageData.Set(Value); + return Obj; + } + static FTestClientEvent SubscribeError(const FString& Value) { FTestClientEvent Obj; @@ -6940,6 +6941,13 @@ struct TESTCLIENT_API FTestClientEvent return MessageData.Get(); } + FORCEINLINE bool IsTransaction() const { return Tag == ESpacetimeDBEventTag::Transaction; } + FORCEINLINE FSpacetimeDBUnit GetAsTransaction() const + { + ensureMsgf(IsTransaction(), TEXT("MessageData does not hold Transaction!")); + return MessageData.Get(); + } + FORCEINLINE bool IsSubscribeError() const { return Tag == ESpacetimeDBEventTag::SubscribeError; } FORCEINLINE FString GetAsSubscribeError() const { @@ -6963,6 +6971,7 @@ struct TESTCLIENT_API FTestClientEvent case ESpacetimeDBEventTag::SubscribeApplied: return GetAsSubscribeApplied() == Other.GetAsSubscribeApplied(); case ESpacetimeDBEventTag::UnsubscribeApplied: return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected(); + case ESpacetimeDBEventTag::Transaction: return GetAsTransaction() == Other.GetAsTransaction(); case ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError(); case ESpacetimeDBEventTag::UnknownTransaction: return GetAsUnknownTransaction() == Other.GetAsUnknownTransaction(); default: return false; @@ -7005,6 +7014,12 @@ class TESTCLIENT_API UTestClientEventBpLib : public UBlueprintFunctionLibrary return FTestClientEvent::Disconnected(InValue); } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TestClientEvent") + static FTestClientEvent Transaction(const FSpacetimeDBUnit& InValue) + { + return FTestClientEvent::Transaction(InValue); + } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TestClientEvent") static FTestClientEvent SubscribeError(const FString& InValue) { @@ -7029,6 +7044,9 @@ class TESTCLIENT_API UTestClientEventBpLib : public UBlueprintFunctionLibrary UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestClientEvent") static bool IsDisconnected(const FTestClientEvent& Event) { return Event.IsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestClientEvent") + static bool IsTransaction(const FTestClientEvent& Event) { return Event.IsTransaction(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestClientEvent") static bool IsSubscribeError(const FTestClientEvent& Event) { return Event.IsSubscribeError(); } @@ -7059,6 +7077,12 @@ class TESTCLIENT_API UTestClientEventBpLib : public UBlueprintFunctionLibrary return Event.GetAsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestClientEvent") + static FSpacetimeDBUnit GetAsTransaction(const FTestClientEvent& Event) + { + return Event.GetAsTransaction(); + } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestClientEvent") static FString GetAsSubscribeError(const FTestClientEvent& Event) { @@ -7141,409 +7165,6 @@ DECLARE_DYNAMIC_DELEGATE_OneParam( FOnSubscriptionError, FErrorContext, Context); -UCLASS(BlueprintType) -class TESTCLIENT_API USetReducerFlags : public USetReducerFlagsBase -{ - GENERATED_BODY() - -public: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteFromBtreeU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteLargeTable(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU32InsertPkU32Two(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU32Two(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeletePkUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void DeleteUniqueUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallTimestamp(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallUuidV4(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallUuidV7(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerOneConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerOneIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerPkConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerPkIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerUniqueConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerUniqueIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerVecConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertCallerVecIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertIntoBtreeU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertIntoIndexedSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertIntoPkBtreeU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertLargeTable(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneByteStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneEnumWithPayload(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneEveryPrimitiveStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneEveryVecStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneF32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneF64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneTimestamp(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneUnitStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOneUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionEveryPrimitiveStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertOptionVecOptionI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU32Two(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPkUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertPrimitivesAsStrings(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultEveryPrimitiveStructString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultI32String(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultIdentityString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultSimpleEnumI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultStringI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertResultVecI32String(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertTableHoldsTable(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU32UpdatePkU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUniqueUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertUser(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecByteStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecEnumWithPayload(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecEveryPrimitiveStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecEveryVecStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecF32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecF64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecTimestamp(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecUnitStruct(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void InsertVecUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void NoOpSucceeds(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void SortedUuidsInsert(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateIndexedSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkSimpleEnum(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU32Two(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdatePkUuid(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueBool(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueConnectionId(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueI8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueIdentity(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueString(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU128(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU16(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU256(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU32(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU64(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueU8(ECallReducerFlags Flag); - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void UpdateUniqueUuid(ECallReducerFlags Flag); - -}; - // RemoteTables class UCLASS(BlueprintType) class TESTCLIENT_API URemoteTables : public UObject @@ -10722,9 +10343,6 @@ class TESTCLIENT_API URemoteReducers : public UObject UPROPERTY() class UDbConnection* Conn; - - UPROPERTY() - USetReducerFlags* SetCallReducerFlags; }; // RemoteProcedures class @@ -10859,9 +10477,6 @@ class TESTCLIENT_API UDbConnection : public UDbConnectionBase UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteProcedures* Procedures; @@ -10873,7 +10488,7 @@ class TESTCLIENT_API UDbConnection : public UDbConnectionBase USubscriptionBuilder* SubscriptionBuilder(); /** Static entry point for constructing a connection. */ - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB Builder") + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB TestClient Builder") static UDbConnectionBuilder* Builder(); // Error handling @@ -10913,5 +10528,17 @@ class TESTCLIENT_API UDbConnection : public UDbConnectionBase virtual void ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage) override; // Override the procedure event failed handler virtual void ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) override; + + friend class USubscriptionBuilder; + friend class UDbConnectionBuilder; + friend class URemoteReducers; + + // Internal reducer correlation helpers (request_id -> typed reducer) + void RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer); + bool TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const; + bool TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer); + +private: + TMap PendingTypedReducers; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/BtreeU32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/BtreeU32Table.g.h index 067e94c0618..a335ae737f4 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/BtreeU32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/BtreeU32Table.g.h @@ -57,7 +57,7 @@ class TESTCLIENT_API UBtreeU32Table : public URemoteTable void PostInitialize(); - /** Update function for btree_u32 table*/ + /** Update function for btree_u_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -95,7 +95,7 @@ class TESTCLIENT_API UBtreeU32Table : public URemoteTable FOnBtreeU32Delete OnDelete; private: - const FString TableName = TEXT("btree_u32"); + const FString TableName = TEXT("btree_u_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF32Table.g.h index 789c5dafdc6..356a0a49cb1 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneF32Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_f32 table*/ + /** Update function for one_f_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneF32Table : public URemoteTable FOnOneF32Delete OnDelete; private: - const FString TableName = TEXT("one_f32"); + const FString TableName = TEXT("one_f_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF64Table.g.h index 3dfb09c8b20..fdc739700cf 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneF64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneF64Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_f64 table*/ + /** Update function for one_f_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneF64Table : public URemoteTable FOnOneF64Delete OnDelete; private: - const FString TableName = TEXT("one_f64"); + const FString TableName = TEXT("one_f_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI128Table.g.h index dc370d4929f..8d434832c4e 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI128Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI128Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i128 table*/ + /** Update function for one_i_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI128Table : public URemoteTable FOnOneI128Delete OnDelete; private: - const FString TableName = TEXT("one_i128"); + const FString TableName = TEXT("one_i_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI16Table.g.h index 0f26c456dbf..d3a334476b0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI16Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI16Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i16 table*/ + /** Update function for one_i_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI16Table : public URemoteTable FOnOneI16Delete OnDelete; private: - const FString TableName = TEXT("one_i16"); + const FString TableName = TEXT("one_i_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI256Table.g.h index aee4aedfb92..b66a8445eb1 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI256Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI256Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i256 table*/ + /** Update function for one_i_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI256Table : public URemoteTable FOnOneI256Delete OnDelete; private: - const FString TableName = TEXT("one_i256"); + const FString TableName = TEXT("one_i_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI32Table.g.h index ed497686cd7..ca36ef53a53 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i32 table*/ + /** Update function for one_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI32Table : public URemoteTable FOnOneI32Delete OnDelete; private: - const FString TableName = TEXT("one_i32"); + const FString TableName = TEXT("one_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI64Table.g.h index dfb550e5662..6430333d295 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI64Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i64 table*/ + /** Update function for one_i_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI64Table : public URemoteTable FOnOneI64Delete OnDelete; private: - const FString TableName = TEXT("one_i64"); + const FString TableName = TEXT("one_i_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI8Table.g.h index f41b8bed6d5..aa035b2c9f1 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneI8Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneI8Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_i8 table*/ + /** Update function for one_i_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneI8Table : public URemoteTable FOnOneI8Delete OnDelete; private: - const FString TableName = TEXT("one_i8"); + const FString TableName = TEXT("one_i_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU128Table.g.h index 0ccaa72f21f..d3c4ec8db55 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU128Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU128Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u128 table*/ + /** Update function for one_u_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU128Table : public URemoteTable FOnOneU128Delete OnDelete; private: - const FString TableName = TEXT("one_u128"); + const FString TableName = TEXT("one_u_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU16Table.g.h index 4501b0e7d59..0039e4b851c 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU16Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU16Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u16 table*/ + /** Update function for one_u_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU16Table : public URemoteTable FOnOneU16Delete OnDelete; private: - const FString TableName = TEXT("one_u16"); + const FString TableName = TEXT("one_u_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU256Table.g.h index ad10a3b4727..35ba0eebb24 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU256Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU256Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u256 table*/ + /** Update function for one_u_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU256Table : public URemoteTable FOnOneU256Delete OnDelete; private: - const FString TableName = TEXT("one_u256"); + const FString TableName = TEXT("one_u_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU32Table.g.h index cbdecbcd491..b6c6c5ee232 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU32Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u32 table*/ + /** Update function for one_u_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU32Table : public URemoteTable FOnOneU32Delete OnDelete; private: - const FString TableName = TEXT("one_u32"); + const FString TableName = TEXT("one_u_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU64Table.g.h index 14ce8017a71..adea19b3bf0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU64Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u64 table*/ + /** Update function for one_u_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU64Table : public URemoteTable FOnOneU64Delete OnDelete; private: - const FString TableName = TEXT("one_u64"); + const FString TableName = TEXT("one_u_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU8Table.g.h index 128f8eb24cb..26062a9d79d 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OneU8Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOneU8Table : public URemoteTable public: void PostInitialize(); - /** Update function for one_u8 table*/ + /** Update function for one_u_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOneU8Table : public URemoteTable FOnOneU8Delete OnDelete; private: - const FString TableName = TEXT("one_u8"); + const FString TableName = TEXT("one_u_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionI32Table.g.h index d404a836656..8807f71b633 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOptionI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for option_i32 table*/ + /** Update function for option_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOptionI32Table : public URemoteTable FOnOptionI32Delete OnDelete; private: - const FString TableName = TEXT("option_i32"); + const FString TableName = TEXT("option_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionVecOptionI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionVecOptionI32Table.g.h index be51577a72d..c36d54cc025 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionVecOptionI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/OptionVecOptionI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UOptionVecOptionI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for option_vec_option_i32 table*/ + /** Update function for option_vec_option_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UOptionVecOptionI32Table : public URemoteTable FOnOptionVecOptionI32Delete OnDelete; private: - const FString TableName = TEXT("option_vec_option_i32"); + const FString TableName = TEXT("option_vec_option_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI128Table.g.h index 0e1135a0b79..54351d3758a 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI128Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI128Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i128 table*/ + /** Update function for pk_i_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI128Table : public URemoteTable FOnPkI128Delete OnDelete; private: - const FString TableName = TEXT("pk_i128"); + const FString TableName = TEXT("pk_i_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI16Table.g.h index 11c67eb11e2..b4bc0a01602 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI16Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI16Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i16 table*/ + /** Update function for pk_i_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI16Table : public URemoteTable FOnPkI16Delete OnDelete; private: - const FString TableName = TEXT("pk_i16"); + const FString TableName = TEXT("pk_i_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI256Table.g.h index 54ac7cd2f4d..95c55e80bc3 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI256Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI256Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i256 table*/ + /** Update function for pk_i_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI256Table : public URemoteTable FOnPkI256Delete OnDelete; private: - const FString TableName = TEXT("pk_i256"); + const FString TableName = TEXT("pk_i_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI32Table.g.h index 6bfc39baee2..805711689ef 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI32Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI32Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i32 table*/ + /** Update function for pk_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI32Table : public URemoteTable FOnPkI32Delete OnDelete; private: - const FString TableName = TEXT("pk_i32"); + const FString TableName = TEXT("pk_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI64Table.g.h index c7fb8ceff7e..40e89be35b0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI64Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI64Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i64 table*/ + /** Update function for pk_i_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI64Table : public URemoteTable FOnPkI64Delete OnDelete; private: - const FString TableName = TEXT("pk_i64"); + const FString TableName = TEXT("pk_i_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI8Table.g.h index f33af5b4e60..8a03f4a049b 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkI8Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkI8Table : public URemoteTable void PostInitialize(); - /** Update function for pk_i8 table*/ + /** Update function for pk_i_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkI8Table : public URemoteTable FOnPkI8Delete OnDelete; private: - const FString TableName = TEXT("pk_i8"); + const FString TableName = TEXT("pk_i_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU128Table.g.h index 898f2e0f36b..069815b49d6 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU128Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU128Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u128 table*/ + /** Update function for pk_u_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU128Table : public URemoteTable FOnPkU128Delete OnDelete; private: - const FString TableName = TEXT("pk_u128"); + const FString TableName = TEXT("pk_u_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU16Table.g.h index bf84e9c983a..2ddeb4be777 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU16Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU16Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u16 table*/ + /** Update function for pk_u_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU16Table : public URemoteTable FOnPkU16Delete OnDelete; private: - const FString TableName = TEXT("pk_u16"); + const FString TableName = TEXT("pk_u_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU256Table.g.h index 08c20ff62c8..b1d09deed13 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU256Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU256Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u256 table*/ + /** Update function for pk_u_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU256Table : public URemoteTable FOnPkU256Delete OnDelete; private: - const FString TableName = TEXT("pk_u256"); + const FString TableName = TEXT("pk_u_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32Table.g.h index a789c124636..d982facd05e 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU32Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u32 table*/ + /** Update function for pk_u_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU32Table : public URemoteTable FOnPkU32Delete OnDelete; private: - const FString TableName = TEXT("pk_u32"); + const FString TableName = TEXT("pk_u_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32TwoTable.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32TwoTable.g.h index c339273c53f..c15593a2475 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32TwoTable.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU32TwoTable.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU32TwoTable : public URemoteTable void PostInitialize(); - /** Update function for pk_u32_two table*/ + /** Update function for pk_u_32_two table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU32TwoTable : public URemoteTable FOnPkU32TwoDelete OnDelete; private: - const FString TableName = TEXT("pk_u32_two"); + const FString TableName = TEXT("pk_u_32_two"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU64Table.g.h index 03b049c5649..d45897bb3ac 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU64Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU64Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u64 table*/ + /** Update function for pk_u_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU64Table : public URemoteTable FOnPkU64Delete OnDelete; private: - const FString TableName = TEXT("pk_u64"); + const FString TableName = TEXT("pk_u_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU8Table.g.h index be15b181216..d5dc231c9a2 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/PkU8Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UPkU8Table : public URemoteTable void PostInitialize(); - /** Update function for pk_u8 table*/ + /** Update function for pk_u_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UPkU8Table : public URemoteTable FOnPkU8Delete OnDelete; private: - const FString TableName = TEXT("pk_u8"); + const FString TableName = TEXT("pk_u_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultI32StringTable.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultI32StringTable.g.h index 89b91d58575..6db46f146eb 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultI32StringTable.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultI32StringTable.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UResultI32StringTable : public URemoteTable public: void PostInitialize(); - /** Update function for result_i32_string table*/ + /** Update function for result_i_32_string table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UResultI32StringTable : public URemoteTable FOnResultI32StringDelete OnDelete; private: - const FString TableName = TEXT("result_i32_string"); + const FString TableName = TEXT("result_i_32_string"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultSimpleEnumI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultSimpleEnumI32Table.g.h index 793cdb36fc6..4b96a95de3b 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultSimpleEnumI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultSimpleEnumI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UResultSimpleEnumI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for result_simple_enum_i32 table*/ + /** Update function for result_simple_enum_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UResultSimpleEnumI32Table : public URemoteTable FOnResultSimpleEnumI32Delete OnDelete; private: - const FString TableName = TEXT("result_simple_enum_i32"); + const FString TableName = TEXT("result_simple_enum_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultStringI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultStringI32Table.g.h index f1b5903f9e0..513f34fa5b9 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultStringI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultStringI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UResultStringI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for result_string_i32 table*/ + /** Update function for result_string_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UResultStringI32Table : public URemoteTable FOnResultStringI32Delete OnDelete; private: - const FString TableName = TEXT("result_string_i32"); + const FString TableName = TEXT("result_string_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultVecI32StringTable.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultVecI32StringTable.g.h index cfe2096b6ab..9bb989777c0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultVecI32StringTable.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/ResultVecI32StringTable.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UResultVecI32StringTable : public URemoteTable public: void PostInitialize(); - /** Update function for result_vec_i32_string table*/ + /** Update function for result_vec_i_32_string table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UResultVecI32StringTable : public URemoteTable FOnResultVecI32StringDelete OnDelete; private: - const FString TableName = TEXT("result_vec_i32_string"); + const FString TableName = TEXT("result_vec_i_32_string"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI128Table.g.h index 478c18396c4..69e8fa44459 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI128Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI128Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i128 table*/ + /** Update function for unique_i_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI128Table : public URemoteTable FOnUniqueI128Delete OnDelete; private: - const FString TableName = TEXT("unique_i128"); + const FString TableName = TEXT("unique_i_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI16Table.g.h index 19eed2f3e1f..089fd8288ed 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI16Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI16Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i16 table*/ + /** Update function for unique_i_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI16Table : public URemoteTable FOnUniqueI16Delete OnDelete; private: - const FString TableName = TEXT("unique_i16"); + const FString TableName = TEXT("unique_i_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI256Table.g.h index cd361f925f7..bade2cef4d8 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI256Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI256Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i256 table*/ + /** Update function for unique_i_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI256Table : public URemoteTable FOnUniqueI256Delete OnDelete; private: - const FString TableName = TEXT("unique_i256"); + const FString TableName = TEXT("unique_i_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI32Table.g.h index aada4f1ff3e..6422e86d25a 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI32Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI32Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i32 table*/ + /** Update function for unique_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI32Table : public URemoteTable FOnUniqueI32Delete OnDelete; private: - const FString TableName = TEXT("unique_i32"); + const FString TableName = TEXT("unique_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI64Table.g.h index 764acab9cc8..b59d8424587 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI64Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI64Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i64 table*/ + /** Update function for unique_i_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI64Table : public URemoteTable FOnUniqueI64Delete OnDelete; private: - const FString TableName = TEXT("unique_i64"); + const FString TableName = TEXT("unique_i_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI8Table.g.h index aa7727c19d5..9a062ac349a 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueI8Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueI8Table : public URemoteTable void PostInitialize(); - /** Update function for unique_i8 table*/ + /** Update function for unique_i_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueI8Table : public URemoteTable FOnUniqueI8Delete OnDelete; private: - const FString TableName = TEXT("unique_i8"); + const FString TableName = TEXT("unique_i_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU128Table.g.h index 2677d84d330..94d3264339d 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU128Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU128Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u128 table*/ + /** Update function for unique_u_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU128Table : public URemoteTable FOnUniqueU128Delete OnDelete; private: - const FString TableName = TEXT("unique_u128"); + const FString TableName = TEXT("unique_u_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU16Table.g.h index aea33985c3d..aff7315996c 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU16Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU16Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u16 table*/ + /** Update function for unique_u_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU16Table : public URemoteTable FOnUniqueU16Delete OnDelete; private: - const FString TableName = TEXT("unique_u16"); + const FString TableName = TEXT("unique_u_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU256Table.g.h index 21ddf618b21..c194b4419a7 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU256Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU256Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u256 table*/ + /** Update function for unique_u_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU256Table : public URemoteTable FOnUniqueU256Delete OnDelete; private: - const FString TableName = TEXT("unique_u256"); + const FString TableName = TEXT("unique_u_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU32Table.g.h index c79c59b8e88..7cd143b611d 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU32Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU32Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u32 table*/ + /** Update function for unique_u_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU32Table : public URemoteTable FOnUniqueU32Delete OnDelete; private: - const FString TableName = TEXT("unique_u32"); + const FString TableName = TEXT("unique_u_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU64Table.g.h index 3d022c15183..80cbcaebaa1 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU64Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU64Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u64 table*/ + /** Update function for unique_u_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU64Table : public URemoteTable FOnUniqueU64Delete OnDelete; private: - const FString TableName = TEXT("unique_u64"); + const FString TableName = TEXT("unique_u_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU8Table.g.h index e07ea119744..5e38895c5d2 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/UniqueU8Table.g.h @@ -60,7 +60,7 @@ class TESTCLIENT_API UUniqueU8Table : public URemoteTable void PostInitialize(); - /** Update function for unique_u8 table*/ + /** Update function for unique_u_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -98,7 +98,7 @@ class TESTCLIENT_API UUniqueU8Table : public URemoteTable FOnUniqueU8Delete OnDelete; private: - const FString TableName = TEXT("unique_u8"); + const FString TableName = TEXT("unique_u_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF32Table.g.h index fa09dc1ffa5..345cece0c99 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecF32Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_f32 table*/ + /** Update function for vec_f_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecF32Table : public URemoteTable FOnVecF32Delete OnDelete; private: - const FString TableName = TEXT("vec_f32"); + const FString TableName = TEXT("vec_f_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF64Table.g.h index 8eb0e28d7fd..4e0b736f6a7 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecF64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecF64Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_f64 table*/ + /** Update function for vec_f_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecF64Table : public URemoteTable FOnVecF64Delete OnDelete; private: - const FString TableName = TEXT("vec_f64"); + const FString TableName = TEXT("vec_f_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI128Table.g.h index 95485adaee0..882ed6b4883 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI128Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI128Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i128 table*/ + /** Update function for vec_i_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI128Table : public URemoteTable FOnVecI128Delete OnDelete; private: - const FString TableName = TEXT("vec_i128"); + const FString TableName = TEXT("vec_i_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI16Table.g.h index a793d1d42c1..5d50b9b67d0 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI16Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI16Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i16 table*/ + /** Update function for vec_i_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI16Table : public URemoteTable FOnVecI16Delete OnDelete; private: - const FString TableName = TEXT("vec_i16"); + const FString TableName = TEXT("vec_i_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI256Table.g.h index d61ef4e5ad5..2bf83deb384 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI256Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI256Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i256 table*/ + /** Update function for vec_i_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI256Table : public URemoteTable FOnVecI256Delete OnDelete; private: - const FString TableName = TEXT("vec_i256"); + const FString TableName = TEXT("vec_i_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI32Table.g.h index 7953feef881..2962afe1264 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI32Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i32 table*/ + /** Update function for vec_i_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI32Table : public URemoteTable FOnVecI32Delete OnDelete; private: - const FString TableName = TEXT("vec_i32"); + const FString TableName = TEXT("vec_i_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI64Table.g.h index 4493a09f494..d9f2401a3d5 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI64Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i64 table*/ + /** Update function for vec_i_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI64Table : public URemoteTable FOnVecI64Delete OnDelete; private: - const FString TableName = TEXT("vec_i64"); + const FString TableName = TEXT("vec_i_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI8Table.g.h index ea0d271ffe6..afb4c47813c 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecI8Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecI8Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_i8 table*/ + /** Update function for vec_i_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecI8Table : public URemoteTable FOnVecI8Delete OnDelete; private: - const FString TableName = TEXT("vec_i8"); + const FString TableName = TEXT("vec_i_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU128Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU128Table.g.h index 6ffec05f26e..6229d875c28 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU128Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU128Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU128Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u128 table*/ + /** Update function for vec_u_128 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU128Table : public URemoteTable FOnVecU128Delete OnDelete; private: - const FString TableName = TEXT("vec_u128"); + const FString TableName = TEXT("vec_u_128"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU16Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU16Table.g.h index c30d06a29b8..193a9682aa4 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU16Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU16Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU16Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u16 table*/ + /** Update function for vec_u_16 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU16Table : public URemoteTable FOnVecU16Delete OnDelete; private: - const FString TableName = TEXT("vec_u16"); + const FString TableName = TEXT("vec_u_16"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU256Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU256Table.g.h index 03939aceba1..873c966635e 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU256Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU256Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU256Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u256 table*/ + /** Update function for vec_u_256 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU256Table : public URemoteTable FOnVecU256Delete OnDelete; private: - const FString TableName = TEXT("vec_u256"); + const FString TableName = TEXT("vec_u_256"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU32Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU32Table.g.h index eac904322e1..075385b23f2 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU32Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU32Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU32Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u32 table*/ + /** Update function for vec_u_32 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU32Table : public URemoteTable FOnVecU32Delete OnDelete; private: - const FString TableName = TEXT("vec_u32"); + const FString TableName = TEXT("vec_u_32"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU64Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU64Table.g.h index c52cae6bb4d..6156442ba3b 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU64Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU64Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU64Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u64 table*/ + /** Update function for vec_u_64 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU64Table : public URemoteTable FOnVecU64Delete OnDelete; private: - const FString TableName = TEXT("vec_u64"); + const FString TableName = TEXT("vec_u_64"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU8Table.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU8Table.g.h index d3602f7adce..21c48b3f05f 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU8Table.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Tables/VecU8Table.g.h @@ -20,7 +20,7 @@ class TESTCLIENT_API UVecU8Table : public URemoteTable public: void PostInitialize(); - /** Update function for vec_u8 table*/ + /** Update function for vec_u_8 table*/ FTableAppliedDiff Update(TArray> InsertsRef, TArray> DeletesRef); /** Number of subscribed rows currently in the cache */ @@ -58,7 +58,7 @@ class TESTCLIENT_API UVecU8Table : public URemoteTable FOnVecU8Delete OnDelete; private: - const FString TableName = TEXT("vec_u8"); + const FString TableName = TEXT("vec_u_8"); TSharedPtr> Data; }; diff --git a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Types/EnumWithPayloadType.g.h b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Types/EnumWithPayloadType.g.h index 79eca6d6c3b..1c4ef086cf8 100644 --- a/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Types/EnumWithPayloadType.g.h +++ b/sdks/unreal/tests/TestClient/Source/TestClient/Public/ModuleBindings/Types/EnumWithPayloadType.g.h @@ -4,9 +4,9 @@ #pragma once #include "CoreMinimal.h" #include "BSATN/UESpacetimeDB.h" -#include "Types/Builtins.h" #include "ModuleBindings/Types/SimpleEnumType.g.h" #include "Kismet/BlueprintFunctionLibrary.h" +#include "Types/Builtins.h" #include "EnumWithPayloadType.g.generated.h" UENUM(BlueprintType) @@ -46,7 +46,7 @@ struct TESTCLIENT_API FEnumWithPayloadType public: FEnumWithPayloadType() = default; - TVariant, TArray, uint8, int16, TArray, FSpacetimeDBIdentity, FString, uint16, uint32, FSpacetimeDBUInt128, FSpacetimeDBInt128, FSpacetimeDBConnectionId, int8, TArray, double, int32, bool, FSpacetimeDBUInt256> MessageData; + TVariant, uint32, int16, uint8, FSpacetimeDBInt128, FString, int64, uint64, int32, double, FSpacetimeDBInt256, TArray, bool, int8, uint16, FSpacetimeDBUInt128, float, FSpacetimeDBUInt256, FSpacetimeDBConnectionId, TArray, TArray, FSpacetimeDBTimestamp> MessageData; UPROPERTY(BlueprintReadOnly) EEnumWithPayloadTag Tag = static_cast(0); diff --git a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp index a6fb7dbf8f0..e324c566449 100644 --- a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp +++ b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Private/ModuleBindings/SpacetimeDBClient.g.cpp @@ -8,28 +8,12 @@ #include "ModuleBindings/Tables/PkUuidTable.g.h" #include "ModuleBindings/Tables/ProcInsertsIntoTable.g.h" -static FReducer DecodeReducer(const FReducerEvent& Event) -{ - const FString& ReducerName = Event.ReducerCall.ReducerName; - - if (ReducerName == TEXT("schedule_proc")) - { - FScheduleProcArgs Args = UE::SpacetimeDB::Deserialize(Event.ReducerCall.Args); - return FReducer::ScheduleProc(Args); - } - - return FReducer(); -} - UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - SetReducerFlags = ObjectInitializer.CreateDefaultSubobject(this, TEXT("SetReducerFlags")); - Db = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteTables")); Db->Initialize(); Reducers = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteReducers")); - Reducers->SetCallReducerFlags = SetReducerFlags; Reducers->Conn = this; Procedures = ObjectInitializer.CreateDefaultSubobject(this, TEXT("RemoteProcedures")); @@ -44,7 +28,6 @@ FContextBase::FContextBase(UDbConnection* InConn) { Db = InConn->Db; Reducers = InConn->Reducers; - SetReducerFlags = InConn->SetReducerFlags; Procedures = InConn->Procedures; Conn = InConn; } @@ -85,11 +68,6 @@ void URemoteTables::Initialize() /**/ } -void USetReducerFlags::ScheduleProc(ECallReducerFlags Flag) -{ - FlagMap.Add("ScheduleProc", Flag); -} - void URemoteReducers::ScheduleProc() { if (!Conn) @@ -98,7 +76,9 @@ void URemoteReducers::ScheduleProc() return; } - Conn->CallReducerTyped(TEXT("schedule_proc"), FScheduleProcArgs(), SetCallReducerFlags); + FScheduleProcArgs ReducerArgs; + const uint32 RequestId = Conn->CallReducerTyped(TEXT("schedule_proc"), ReducerArgs); + if (RequestId != 0) { Conn->RegisterPendingTypedReducer(RequestId, FReducer::ScheduleProc(ReducerArgs)); } } bool URemoteReducers::InvokeScheduleProc(const FReducerEventContext& Context, const UScheduleProcReducer* Args) @@ -459,11 +439,44 @@ void UDbConnection::OnUnhandledProcedureErrorHandler(const FProcedureEventContex } } +void UDbConnection::RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer) +{ + Reducer.RequestId = RequestId; + PendingTypedReducers.Add(RequestId, MoveTemp(Reducer)); +} + +bool UDbConnection::TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const +{ + if (const FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + return true; + } + return false; +} + +bool UDbConnection::TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer) +{ + if (FReducer* Found = PendingTypedReducers.Find(RequestId)) + { + OutReducer = *Found; + PendingTypedReducers.Remove(RequestId); + return true; + } + return false; +} + void UDbConnection::ReducerEvent(const FReducerEvent& Event) { if (!Reducers) { return; } - FReducer DecodedReducer = DecodeReducer(Event); + FReducer DecodedReducer; + if (!TryTakePendingTypedReducer(Event.RequestId, DecodedReducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), Event.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } FTestProcClientReducerEvent ReducerEvent; ReducerEvent.CallerConnectionId = Event.CallerConnectionId; @@ -475,8 +488,8 @@ void UDbConnection::ReducerEvent(const FReducerEvent& Event) FReducerEventContext Context(this, ReducerEvent); - // Use hardcoded string matching for reducer dispatching - const FString& ReducerName = Event.ReducerCall.ReducerName; + // Dispatch by typed reducer metadata + const FString& ReducerName = ReducerEvent.Reducer.ReducerName; if (ReducerName == TEXT("schedule_proc")) { @@ -659,6 +672,7 @@ void UDbConnection::ForwardOnConnect(UDbConnectionBase* BaseConnection, FSpaceti } void UDbConnection::ForwardOnDisconnect(UDbConnectionBase* BaseConnection, const FString& Error) { + PendingTypedReducers.Empty(); if (OnDisconnectDelegate.IsBound()) { OnDisconnectDelegate.Execute(this, Error); @@ -676,7 +690,13 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime case ESpacetimeDBEventTag::Reducer: { FReducerEvent ReducerEvent = Event.GetAsReducer(); - FReducer Reducer = DecodeReducer(ReducerEvent); + FReducer Reducer; + if (!TryGetPendingTypedReducer(ReducerEvent.RequestId, Reducer)) + { + const FString ErrorMessage = FString::Printf(TEXT("Reducer result for unknown request_id %u"), ReducerEvent.RequestId); + HandleProtocolViolation(ErrorMessage); + return; + } BaseEvent = FTestProcClientEvent::Reducer(Reducer); break; } @@ -693,6 +713,10 @@ void UDbConnection::DbUpdate(const FDatabaseUpdateType& Update, const FSpacetime BaseEvent = FTestProcClientEvent::Disconnected(Event.GetAsDisconnected()); break; + case ESpacetimeDBEventTag::Transaction: + BaseEvent = FTestProcClientEvent::Transaction(Event.GetAsTransaction()); + break; + case ESpacetimeDBEventTag::SubscribeError: BaseEvent = FTestProcClientEvent::SubscribeError(Event.GetAsSubscribeError()); break; diff --git a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/SpacetimeDBClient.g.h b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/SpacetimeDBClient.g.h index ecfb5d2d4b3..c991307b61b 100644 --- a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/SpacetimeDBClient.g.h +++ b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/SpacetimeDBClient.g.h @@ -1,7 +1,7 @@ // THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE // WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. -// This was generated using spacetimedb cli version 1.12.0 (commit 11e258c2f8c9de8f67098f65e3f6a9db32026768). +// This was generated using spacetimedb cli version 2.0.3 (commit b6045fcc908d2846f8fb26570c2f300f5d685996). #pragma once #include "CoreMinimal.h" @@ -9,7 +9,6 @@ #include "Connection/Callback.h" #include "Connection/DbConnectionBase.h" #include "Connection/DbConnectionBuilder.h" -#include "Connection/SetReducerFlags.h" #include "Connection/Subscription.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "ModuleBindings/Procedures/InsertWithTxCommit.g.h" @@ -66,7 +65,7 @@ struct TESTPROCCLIENT_API FContextBase { GENERATED_BODY() - FContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Procedures(nullptr), Conn(nullptr) {}; + FContextBase() : Db(nullptr), Reducers(nullptr), Procedures(nullptr), Conn(nullptr) {}; FContextBase(UDbConnection* InConn); UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") @@ -75,9 +74,6 @@ struct TESTPROCCLIENT_API FContextBase UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB") URemoteProcedures* Procedures; @@ -105,9 +101,6 @@ class TESTPROCCLIENT_API UContextBaseBpLib : public UBlueprintFunctionLibrary UFUNCTION(BlueprintPure, Category="SpacetimeDB") static URemoteReducers* GetReducers(const FContextBase& Ctx) { return Ctx.Reducers; } - UFUNCTION(BlueprintPure, Category="SpacetimeDB") - static USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) { return Ctx.SetReducerFlags; } - static URemoteProcedures* GetProcedures(const FContextBase& Ctx) { return Ctx.Procedures; } UFUNCTION(BlueprintPure, Category="SpacetimeDB") @@ -674,6 +667,14 @@ struct TESTPROCCLIENT_API FTestProcClientEvent return Obj; } + static FTestProcClientEvent Transaction(const FSpacetimeDBUnit& Value) + { + FTestProcClientEvent Obj; + Obj.Tag = ESpacetimeDBEventTag::Transaction; + Obj.MessageData.Set(Value); + return Obj; + } + static FTestProcClientEvent SubscribeError(const FString& Value) { FTestProcClientEvent Obj; @@ -718,6 +719,13 @@ struct TESTPROCCLIENT_API FTestProcClientEvent return MessageData.Get(); } + FORCEINLINE bool IsTransaction() const { return Tag == ESpacetimeDBEventTag::Transaction; } + FORCEINLINE FSpacetimeDBUnit GetAsTransaction() const + { + ensureMsgf(IsTransaction(), TEXT("MessageData does not hold Transaction!")); + return MessageData.Get(); + } + FORCEINLINE bool IsSubscribeError() const { return Tag == ESpacetimeDBEventTag::SubscribeError; } FORCEINLINE FString GetAsSubscribeError() const { @@ -741,6 +749,7 @@ struct TESTPROCCLIENT_API FTestProcClientEvent case ESpacetimeDBEventTag::SubscribeApplied: return GetAsSubscribeApplied() == Other.GetAsSubscribeApplied(); case ESpacetimeDBEventTag::UnsubscribeApplied: return GetAsUnsubscribeApplied() == Other.GetAsUnsubscribeApplied(); case ESpacetimeDBEventTag::Disconnected: return GetAsDisconnected() == Other.GetAsDisconnected(); + case ESpacetimeDBEventTag::Transaction: return GetAsTransaction() == Other.GetAsTransaction(); case ESpacetimeDBEventTag::SubscribeError: return GetAsSubscribeError() == Other.GetAsSubscribeError(); case ESpacetimeDBEventTag::UnknownTransaction: return GetAsUnknownTransaction() == Other.GetAsUnknownTransaction(); default: return false; @@ -783,6 +792,12 @@ class TESTPROCCLIENT_API UTestProcClientEventBpLib : public UBlueprintFunctionLi return FTestProcClientEvent::Disconnected(InValue); } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TestProcClientEvent") + static FTestProcClientEvent Transaction(const FSpacetimeDBUnit& InValue) + { + return FTestProcClientEvent::Transaction(InValue); + } + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB|TestProcClientEvent") static FTestProcClientEvent SubscribeError(const FString& InValue) { @@ -807,6 +822,9 @@ class TESTPROCCLIENT_API UTestProcClientEventBpLib : public UBlueprintFunctionLi UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestProcClientEvent") static bool IsDisconnected(const FTestProcClientEvent& Event) { return Event.IsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestProcClientEvent") + static bool IsTransaction(const FTestProcClientEvent& Event) { return Event.IsTransaction(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestProcClientEvent") static bool IsSubscribeError(const FTestProcClientEvent& Event) { return Event.IsSubscribeError(); } @@ -837,6 +855,12 @@ class TESTPROCCLIENT_API UTestProcClientEventBpLib : public UBlueprintFunctionLi return Event.GetAsDisconnected(); } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestProcClientEvent") + static FSpacetimeDBUnit GetAsTransaction(const FTestProcClientEvent& Event) + { + return Event.GetAsTransaction(); + } + UFUNCTION(BlueprintPure, Category = "SpacetimeDB|TestProcClientEvent") static FString GetAsSubscribeError(const FTestProcClientEvent& Event) { @@ -919,17 +943,6 @@ DECLARE_DYNAMIC_DELEGATE_OneParam( FOnSubscriptionError, FErrorContext, Context); -UCLASS(BlueprintType) -class TESTPROCCLIENT_API USetReducerFlags : public USetReducerFlagsBase -{ - GENERATED_BODY() - -public: - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB") - void ScheduleProc(ECallReducerFlags Flag); - -}; - // RemoteTables class UCLASS(BlueprintType) class TESTPROCCLIENT_API URemoteTables : public UObject @@ -981,9 +994,6 @@ class TESTPROCCLIENT_API URemoteReducers : public UObject UPROPERTY() class UDbConnection* Conn; - - UPROPERTY() - USetReducerFlags* SetCallReducerFlags; }; DECLARE_DYNAMIC_DELEGATE_ThreeParams(FOnInsertWithTxCommitComplete, @@ -1209,9 +1219,6 @@ class TESTPROCCLIENT_API UDbConnection : public UDbConnectionBase UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteReducers* Reducers; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") - USetReducerFlags* SetReducerFlags; - UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB") URemoteProcedures* Procedures; @@ -1223,7 +1230,7 @@ class TESTPROCCLIENT_API UDbConnection : public UDbConnectionBase USubscriptionBuilder* SubscriptionBuilder(); /** Static entry point for constructing a connection. */ - UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB Builder") + UFUNCTION(BlueprintCallable, Category = "SpacetimeDB", DisplayName = "SpacetimeDB TestProcClient Builder") static UDbConnectionBuilder* Builder(); // Error handling @@ -1263,5 +1270,17 @@ class TESTPROCCLIENT_API UDbConnection : public UDbConnectionBase virtual void ReducerEventFailed(const FReducerEvent& Event, const FString ErrorMessage) override; // Override the procedure event failed handler virtual void ProcedureEventFailed(const FProcedureEvent& Event, const FString ErrorMessage) override; + + friend class USubscriptionBuilder; + friend class UDbConnectionBuilder; + friend class URemoteReducers; + + // Internal reducer correlation helpers (request_id -> typed reducer) + void RegisterPendingTypedReducer(uint32 RequestId, FReducer Reducer); + bool TryGetPendingTypedReducer(uint32 RequestId, FReducer& OutReducer) const; + bool TryTakePendingTypedReducer(uint32 RequestId, FReducer& OutReducer); + +private: + TMap PendingTypedReducers; }; diff --git a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/Types/ReturnEnumType.g.h b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/Types/ReturnEnumType.g.h index 14b4b797c33..a0235284c48 100644 --- a/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/Types/ReturnEnumType.g.h +++ b/sdks/unreal/tests/TestProcClient/Source/TestProcClient/Public/ModuleBindings/Types/ReturnEnumType.g.h @@ -22,7 +22,7 @@ struct TESTPROCCLIENT_API FReturnEnumType public: FReturnEnumType() = default; - TVariant MessageData; + TVariant MessageData; UPROPERTY(BlueprintReadOnly) EReturnEnumTag Tag = static_cast(0); diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 0d5c7904ce9..a7a6bc41d31 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -376,12 +376,6 @@ fn main() -> anyhow::Result<()> { )?; } if matches.get_flag("cpp") || matches.get_flag("all") { - // TODO(26-02-17 jlarabie): Keep C++ pinned to 1.12.x for the 2.0 release train. - // Re-enable this codepath when C++ 2.0 is ready and we're intentionally - // moving the C++ SDK/template versions forward. - eprintln!("Warning: Not bumping C++ version. See inline comment for details."); - return Ok(()); - #[allow(unreachable_code)] { rewrite_cmake_version_inplace("crates/bindings-cpp/CMakeLists.txt", &full_version)?;