diff --git a/TESTING.md b/TESTING.md index e18a2f4a38b..cf7c74c37ab 100644 --- a/TESTING.md +++ b/TESTING.md @@ -107,6 +107,9 @@ The namespace tests are integration tests, plus focused generator diagnostics: - `cargo test -p spacetimedb-testing --test standalone_integration_test namespace_csharp`: independent dependency publication, root export selection, and cross-namespace helper/HTTP calls, and runtime name conversion compared with host validation. + The nested fixture additionally checks repeated assembly instances, public + child promotion, deep writable/read-only access, per-instance dispatch and + transactions, and HTTP warnings at publication before any function calls. - `cargo test -p spacetimedb-testing --test environment namespace_csharp_environment_security`: root/public environment access, denial of namespaced host calls, and default namespace case conversion when `Name` is omitted. @@ -119,11 +122,26 @@ The namespace tests are integration tests, plus focused generator diagnostics: `Accessor = "MyAuth", Name = "auth_data"`. The existing `sdks/csharp/tools~/run-regression-tests.sh 8 10` harness includes it in the .NET 10 module pass while retaining .NET 8 regressions. +- The [nested client regression](sdks/csharp/examples~/regression-tests/nested-namespaces/README.md) + is included in the same harness. It runs C# 9 bindings on both .NET 8 and + .NET 10 against the .NET 10 nested module, including three-level canonical SQL, + independent caches, reducer/procedure results and errors, views, joins, and + unsubscribe cleanup. Use the local package setup in [DEVELOP.md](sdks/csharp/DEVELOP.md), not stale published NuGet packages, when exercising changed query/runtime code. Library-defined RLS inside named namespaces and cross-language module composition are unsupported, not integration cases awaiting a passing assertion. +The nested host fixture also executes instance-aware module query views, including +deep paths, filters, and both semijoin directions. Immediate reducer/procedure +scheduling targets repeated instances through selected contexts and uses their +canonical paths. Context-selection assertions in the same fixture cover all +context families, shared state, and cross-scope transaction rollback. See the +[module limitations](crates/bindings-csharp/README.md#nested-assemblies). + +For module performance comparisons, use the +[prebuilt-artifact benchmark](crates/bench/README.md#comparing-c-artifacts). +The circles integration test is a correctness smoke test, not a throughput result. ## Schema parity tests diff --git a/crates/bench/README.md b/crates/bench/README.md index 292793535bb..3a36bd660ad 100644 --- a/crates/bench/README.md +++ b/crates/bench/README.md @@ -115,6 +115,28 @@ cargo test --release --package spacetimedb-testing --test standalone_integration cargo test --release --package spacetimedb-testing --test standalone_integration_test test_calling_bench_db_circles -- --exact --nocapture ``` +## Comparing C# artifacts + +The `csharp_artifact` example accepts an already-built `benchmarks-cs` WASM module. +It measures empty reducer dispatch, a 10,000-row string-table scan, and the existing +circles cross-join workload (`initial_load = 100`). It uses the +same in-process host and excludes compilation and publication from measurements. + +Build each revision with the same .NET SDK, NativeAOT toolchain, and release CLI +settings in separate worktrees. Use the optimized `StdbModule.opt.wasm` artifacts +from the `native` output directory. Build the runner once, then run it directly: + +```sh +cargo build --release -p spacetimedb-bench --example csharp_artifact +CSHARP_BENCH_WASM=/absolute/path/to/before.wasm target/release/examples/csharp_artifact --bench --save-baseline before +CSHARP_BENCH_WASM=/absolute/path/to/after.wasm target/release/examples/csharp_artifact --bench --baseline before +``` + +Defaults are 30 samples, 3 seconds warmup, and 20 seconds measurement per workload. +Criterion options can override these. Do not run builds or other tests during +measurement; repeat in reverse order before attributing a small change to code. +This checks existing flat modules, not nested-instance startup cost or memory use. + ## Pretty report To generate a nicely formatted markdown report, you can use the "summarize" binary. This is used on CI (see [`../../.github/workflows/benchmarks.yml`](../../.github/workflows/benchmarks.yml)). @@ -220,4 +242,4 @@ You can generate flamegraphs using `flamegraph.sh` script: ```bash # ./flamegraph.sh BENCH_EXECUTABLE FILTER SVG_PATH ./flamegraph.sh generic stdb_raw/mem/insert_bulk/location/multi_index/load=0/count=100 result.svg" -``` \ No newline at end of file +``` diff --git a/crates/bench/examples/csharp_artifact.rs b/crates/bench/examples/csharp_artifact.rs new file mode 100644 index 00000000000..2a1ab9eda6a --- /dev/null +++ b/crates/bench/examples/csharp_artifact.rs @@ -0,0 +1,53 @@ +//! Compare prebuilt C# benchmark modules without rebuilding or changing the host. +use criterion::{async_executor::AsyncExecutor, Criterion}; +use spacetimedb_bench::{ + database::BenchDatabase, + schemas::{create_sequential, u32_u64_str, IndexStrategy}, + spacetime_module::SpacetimeModule, +}; +use spacetimedb_lib::sats::product; +use spacetimedb_testing::modules::{CompiledModule, ModuleLanguage}; +use std::{path::PathBuf, sync::OnceLock, time::Duration}; + +struct Artifact; + +impl ModuleLanguage for Artifact { + const NAME: &'static str = "csharp-artifact"; + + fn get_module() -> &'static CompiledModule { + static MODULE: OnceLock = OnceLock::new(); + MODULE.get_or_init(|| { + let path = PathBuf::from(std::env::var_os("CSHARP_BENCH_WASM").expect("set CSHARP_BENCH_WASM")); + CompiledModule::from_artifact("benchmarks-cs", spacetimedb::messages::control_db::HostType::Wasm, path) + }) + } +} + +fn main() { + let mut criterion = Criterion::default() + .sample_size(30) + .warm_up_time(Duration::from_secs(3)) + .measurement_time(Duration::from_secs(20)) + .configure_from_args(); + let mut db = SpacetimeModule::::build(true).unwrap(); + let table = db.create_table::(IndexStrategy::Unique0).unwrap(); + db.insert_bulk(&table, create_sequential::(0xdeadbeef, 10_000, 100)) + .unwrap(); + criterion.bench_function("csharp-artifact/empty", |b| b.iter(|| db.empty_transaction().unwrap())); + criterion.bench_function("csharp-artifact/scan-10000", |b| b.iter(|| db.iterate(&table).unwrap())); + (&db).block_on(async { + db.module + .call_reducer_binary("init_game_circles", &product![100u32]) + .await + .unwrap(); + }); + criterion.bench_function("csharp-artifact/circles-100", |b| { + b.to_async(&db).iter(|| async { + db.module + .call_reducer_binary("run_game_circles", &product![100u32]) + .await + .unwrap() + }); + }); + criterion.final_summary(); +} diff --git a/crates/bindings-csharp/BSATN.Codegen/Type.cs b/crates/bindings-csharp/BSATN.Codegen/Type.cs index f20655146dd..414eddbdc0e 100644 --- a/crates/bindings-csharp/BSATN.Codegen/Type.cs +++ b/crates/bindings-csharp/BSATN.Codegen/Type.cs @@ -694,6 +694,9 @@ public override string ToString() => extensions.Contents.Append( $$""" + #if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + #endif public void ReadFields(System.IO.BinaryReader reader) { {{string.Join( "\n", diff --git a/crates/bindings-csharp/BSATN.Runtime/QueryBuilder.cs b/crates/bindings-csharp/BSATN.Runtime/QueryBuilder.cs index 952c602f545..97e1f216cb6 100644 --- a/crates/bindings-csharp/BSATN.Runtime/QueryBuilder.cs +++ b/crates/bindings-csharp/BSATN.Runtime/QueryBuilder.cs @@ -2,10 +2,14 @@ namespace SpacetimeDB; using System; using System.Globalization; +using System.Linq; -/// A table identifier with a separately quoted optional namespace and local name. +/// A table identifier with separately quoted namespace segments and local name. public readonly struct SqlTableName { + private readonly string? quotedNamespace; + + /// The namespace path, without SQL quoting. public string? Namespace { get; } public string LocalName { get; } @@ -13,18 +17,32 @@ public SqlTableName(string localName) { LocalName = localName; Namespace = null; + quotedNamespace = null; } public SqlTableName(string @namespace, string localName) { Namespace = @namespace ?? throw new ArgumentNullException(nameof(@namespace)); LocalName = localName; + quotedNamespace = SqlFormat.QuoteIdent(@namespace); + } + + public SqlTableName(string[] namespaceSegments, string localName) + { + namespaceSegments = + namespaceSegments ?? throw new ArgumentNullException(nameof(namespaceSegments)); + Namespace = namespaceSegments.Length == 0 ? null : string.Join(".", namespaceSegments); + LocalName = localName; + quotedNamespace = + namespaceSegments.Length == 0 + ? null + : string.Join(".", namespaceSegments.Select(SqlFormat.QuoteIdent)); } public override string ToString() => - Namespace is null + quotedNamespace is null ? SqlFormat.QuoteIdent(LocalName) - : SqlFormat.QuoteIdent(Namespace) + "." + SqlFormat.QuoteIdent(LocalName); + : quotedNamespace + "." + SqlFormat.QuoteIdent(LocalName); } public readonly struct SqlLiteral diff --git a/crates/bindings-csharp/Codegen.Tests/Tests.cs b/crates/bindings-csharp/Codegen.Tests/Tests.cs index 5d24a28392b..e6ae6b21137 100644 --- a/crates/bindings-csharp/Codegen.Tests/Tests.cs +++ b/crates/bindings-csharp/Codegen.Tests/Tests.cs @@ -286,17 +286,30 @@ params MetadataReference[] references fixture.SampleCompilation.References.Concat(references), new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) ); - MetadataReference Dependency(string name) + MetadataReference Emit(Compilation compilation) + { + using var dll = new MemoryStream(); + var emitted = compilation.Emit(dll); + Assert.True(emitted.Success, string.Join("\n", emitted.Diagnostics)); + return MetadataReference.CreateFromImage(dll.ToArray()); + } + MetadataReference Dependency( + string name, + string mounts = "", + params MetadataReference[] references + ) { var compilation = Create( name, - $$""" - namespace {{name}} { - public class Marker { } - [SpacetimeDB.Table(Accessor = "{{name}}Row")] - public partial struct Row { public uint Id; } - } - """ + mounts + + $$""" + namespace {{name}} { + public class Marker { } + [SpacetimeDB.Table(Accessor = "{{name}}Row")] + public partial struct Row { public uint Id; } + } + """, + references ); var driver = CSharpGeneratorDriver.Create( [ @@ -312,10 +325,7 @@ public partial struct Row { public uint Id; } out var diagnostics ); Assert.Empty(diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error)); - using var dll = new MemoryStream(); - var emitted = output.Emit(dll); - Assert.True(emitted.Success, string.Join("\n", emitted.Diagnostics)); - return MetadataReference.CreateFromImage(dll.ToArray()); + return Emit(output); } var auth = Dependency("Auth"); var audit = Dependency("Audit"); @@ -377,13 +387,12 @@ .. driver Reject("[assembly: SpacetimeDB.Namespace(null)]", "marker type"); Reject(Mount("LocalMarker") + "public class LocalMarker { }", "cannot mount itself"); Reject(Mount("System.String"), "no discovered module descriptor"); - Reject(Mount() + Mount(accessor: "Other"), "only be mounted once"); Reject(Mount() + Mount("Audit.Marker", "MYAUTH"), "case-insensitive"); Reject(Mount() + Mount("Audit.Marker", "MyAuth"), "accessor 'MyAuth'"); Reject( Mount() + "[SpacetimeDB.Table(Accessor = \"MyAuth\")] public partial struct Row { public uint Id; }", - "root table accessor" + "table accessor" ); var oldLanguage = fixture.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp13); @@ -421,6 +430,168 @@ var source in new[] o => o.Reason == IncrementalStepRunReason.Modified ); } + + // Read declarations from emitted DLL metadata, not the dependency's source trees. + var parent = Dependency("Parent", Mount("Audit.Marker", "History", "audit_data"), audit); + var sibling = Dependency( + "Sibling", + Mount("Audit.Marker", "History", "sibling_data"), + audit + ); + var compilation = Create( + "Outer", + Mount("Parent.Marker", "Left") + Mount("Sibling.Marker", "Right"), + parent, + sibling, + auth, + audit + ); + var discoveryDriver = CSharpGeneratorDriver + .Create( + [new Module().AsSourceGenerator()], + parseOptions: fixture.ParseOptions, + driverOptions: new GeneratorDriverOptions( + IncrementalGeneratorOutputKind.None, + trackIncrementalGeneratorSteps: true + ) + ) + .RunGenerators(compilation); + + static T Property(object value, string name) => + (T)value.GetType().GetProperty(name)!.GetValue(value)!; + + static object Composition(GeneratorDriver driver) => + driver + .GetRunResult() + .Results.Single() + .TrackedSteps["SpacetimeDB.Composition.Build"] + .Single() + .Outputs.Single() + .Value; + static object[] Nodes(object composition) => + [.. Property(composition, "Nodes").Cast()]; + + var tree = Composition(discoveryDriver); + + // Names are checked within their declaring scope, not across sibling libraries. + Assert.Empty(discoveryDriver.GetRunResult().Diagnostics); + + var changedParent = Dependency( + "Parent", + Mount("Audit.Marker", "OtherHistory", "other_data"), + audit + ); + var changedDriver = discoveryDriver.RunGenerators( + compilation.ReplaceReference(parent, changedParent) + ); + Assert.Contains( + changedDriver + .GetRunResult() + .Results.Single() + .TrackedSteps["SpacetimeDB.Assembly.Discover"] + .SelectMany(step => step.Outputs), + output => output.Reason == IncrementalStepRunReason.Modified + ); + Assert.NotEqual(tree, Composition(changedDriver)); + + // Separate public contributors now share a scope: their identical History + // accessors conflict even though each dependency compiled independently. + var collision = discoveryDriver.RunGenerators(Create("Outer", "", parent, sibling, audit)); + Assert.Contains( + collision.GetRunResult().Diagnostics, + diagnostic => + diagnostic.GetMessage().Contains("scope 'public'") + && diagnostic.GetMessage().Contains("Parent,") + && diagnostic.GetMessage().Contains("Sibling,") + ); + var sameName = Dependency( + "Sibling", + Mount("Audit.Marker", "OtherHistory", "audit_data"), + audit + ); + var nameCollision = discoveryDriver.RunGenerators( + Create("Outer", "", parent, sameName, audit) + ); + Assert.Contains( + nameCollision.GetRunResult().Diagnostics, + diagnostic => diagnostic.GetMessage().Contains("explicit database name 'audit_data'") + ); + + var publicLeft = Dependency("PublicLeft", Mount("Audit.Marker", "public", "public"), audit); + var publicRight = Dependency( + "PublicRight", + Mount("Audit.Marker", "public", "public"), + audit + ); + var diamond = Composition( + discoveryDriver.RunGenerators(Create("Outer", "", publicLeft, publicRight, audit)) + ); + Assert.True(Property(diamond, "IsValid")); + var publicRoot = Assert.Single(Nodes(diamond)); + var contributors = Property(publicRoot, "Contributors") + .Cast() + .ToArray(); + Assert.Equal(4, contributors.Length); + Assert.Single(contributors, identity => identity.StartsWith("Audit,")); + + // Emit against an initial A, then replace it with an A that mounts B. + // This models a cycle in referenced metadata without recursively building projects. + MetadataReference Descriptor( + string name, + string mounts, + params MetadataReference[] references + ) => + Emit( + Create( + name, + mounts + + $$""" + [assembly: SpacetimeDB.ModuleDescriptor(typeof({{name}}.Descriptor))] + namespace {{name}} { + public class Marker { } + public static class Descriptor { } + } + """, + references + ) + ); + var initialA = Descriptor("CycleA", ""); + foreach (var accessor in new[] { "Child", "public" }) + { + var cycleB = Descriptor("CycleB", Mount("CycleA.Marker", accessor, accessor), initialA); + var cycleA = Descriptor("CycleA", Mount("CycleB.Marker", accessor, accessor), cycleB); + var cycle = discoveryDriver.RunGenerators(Create("Outer", "", cycleA, cycleB)); + Assert.Contains( + cycle.GetRunResult().Diagnostics, + diagnostic => + diagnostic.GetMessage().Contains("Namespace mount cycle:") + && diagnostic.GetMessage().Contains("CycleA,") + && diagnostic.GetMessage().Contains("CycleB,") + ); + } + + // Referenced attributes have no source location. Validate against their owner, + // not against the consuming root assembly. + var invalid = Emit( + Create( + "SelfMountingDependency", + """ + [assembly: SpacetimeDB.ModuleDescriptor(typeof(Descriptor))] + [assembly: SpacetimeDB.Namespace(typeof(Marker), Accessor = "Self")] + public class Marker { } + public static class Descriptor { } + """ + ) + ); + var invalidResult = discoveryDriver + .RunGenerators(Create("Outer", "", invalid)) + .GetRunResult(); + Assert.Contains( + invalidResult.Diagnostics, + diagnostic => + diagnostic.GetMessage().Contains("SelfMountingDependency") + && diagnostic.GetMessage().Contains("cannot mount itself") + ); } [Fact] @@ -522,6 +693,23 @@ public partial struct Row { [SpacetimeDB.Unique] public uint @class; } using var dll = new MemoryStream(); var emitted = valid.Emit(dll); Assert.True(emitted.Success, string.Join("\n", emitted.Diagnostics)); + + foreach (var name in new[] { "Get", "Create", "InstanceState" }) + { + foreach (var attribute in new[] { "PrimaryKey", "Unique", "Index.BTree" }) + { + var (output, diagnostics) = Generate( + $$""" + [SpacetimeDB.Table(Accessor = "User")] + public partial struct Row { [SpacetimeDB.{{attribute}}] public uint {{name}}; } + """ + ); + Assert.Empty(diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error)); + using var assembly = new MemoryStream(); + var result = output.Emit(assembly); + Assert.True(result.Success, string.Join("\n", result.Diagnostics)); + } + } } #endif @@ -540,8 +728,6 @@ public static async Task TypeGeneratorOnClient() #if NET10_0_OR_GREATER [Theory] [InlineData(false, false)] - [InlineData(true, false)] - [InlineData(false, true)] [InlineData(true, true)] public static async Task NamespaceDependenciesRegisterOnceInStableOrder( bool rootHasTable, @@ -654,18 +840,6 @@ .. Method(compilation, "Initialize") var expected = new[] { Descriptor(root) + ".Register" } .Concat(orderedDependencies.Select(c => Descriptor(c) + ".Register")) .ToArray(); - if (mounted) - { - var init = Method(root, "Initialize"); - var submodules = init.DescendantNodes() - .OfType() - .Where(call => call.Expression.ToString().EndsWith(".RegisterSubmodule")) - .ToArray(); - Assert.Equal( - ["\"Auth\"", "\"class\""], - submodules.Select(call => call.ArgumentList.Arguments[0].ToString()) - ); - } Assert.Equal(expected, Calls(root)); Assert.Equal(expected, Calls(reordered)); @@ -741,6 +915,18 @@ public static class NamingSettings { public const SpacetimeDB.CaseConversionPolicy Naming = SpacetimeDB.CaseConversionPolicy.{{policy}}; } """; + MetadataReference EmitRejected(CSharpCompilation input, string title) + { + var driver = CSharpGeneratorDriver.Create( + [new Module().AsSourceGenerator()], + parseOptions: fixture.ParseOptions + ); + driver.RunGeneratorsAndUpdateCompilation(input, out var output, out var diagnostics); + Assert.Contains(diagnostics, d => d.Descriptor.Title.ToString() == title); + // Model an already-built DLL: consumers must recheck its placements rather + // than trust that its own compilation ran the current generator's checks. + return Emit((CSharpCompilation)output); + } foreach ( var (rootPolicy, dependencyPolicy) in new (string?, string?)[] { @@ -800,29 +986,102 @@ [new Module().AsSourceGenerator()], } } - // An unrelated utility alone must not cause an otherwise empty module to register. - var plainUtility = Emit(Create("PlainUtility", "public class PlainUtility { }")); - var empty = Generate(Create("Empty", "", plainUtility)); - Assert.Empty(empty.GetSymbolsWithName("AssemblyDescriptor", SymbolFilter.Type)); - - var nested = Emit( - Generate( + // The same conflicting public contribution appears at two nested paths. + var policyLeaf = Emit(Generate(Create("PolicyLeaf", Policy("None") + Table("PolicyLeaf")))); + var policyParent = EmitRejected( + Create( + "PolicyParent", + "[assembly: SpacetimeDB.Namespace(typeof(PolicyLeaf.Sentinel), Accessor = \"public\")]\n" + + "public class PolicyParentMarker { }", + policyLeaf + ), + "Conflicting case conversion policies" + ); + var policyResult = CSharpGeneratorDriver + .Create([new Module().AsSourceGenerator()], parseOptions: fixture.ParseOptions) + .RunGenerators( Create( - "Nested", - "[assembly: SpacetimeDB.Namespace(typeof(Alpha.Sentinel), Accessor = \"Auth\")]", - alpha, - shared + "PolicyRoot", + """ + [assembly: SpacetimeDB.Namespace(typeof(PolicyParentMarker), Accessor = "Left")] + [assembly: SpacetimeDB.Namespace(typeof(PolicyParentMarker), Accessor = "Right")] + """, + policyParent, + policyLeaf ) ) - ); - var nestedResult = CSharpGeneratorDriver - .Create([new Module().AsSourceGenerator()], parseOptions: fixture.ParseOptions) - .RunGenerators(Create("Outer", "", nested, alpha, shared)) .GetRunResult(); - Assert.Contains( - nestedResult.Diagnostics, - diagnostic => diagnostic.GetMessage().Contains("Only the consuming root") - ); + foreach (var scope in new[] { "Left", "Right" }) + { + Assert.Contains( + policyResult.Diagnostics, + d => + d.Descriptor.Title.ToString() == "Conflicting case conversion policies" + && d.GetMessage().Contains($"scope '{scope}'") + && d.GetMessage().Contains("PolicyParent,") + && d.GetMessage().Contains("PolicyLeaf,") + ); + } + + void CheckNestedRootOnly(MetadataReference dependency, string marker, string declaration) + { + const string title = "Root-only declarations in mounted dependency"; + var bridge = Emit( + Generate( + Create( + "PublicBridge", + $"[assembly: SpacetimeDB.Namespace(typeof({marker}), Accessor = \"public\")]\n" + + "public class BridgeMarker { }", + dependency + ) + ) + ); + var parent = EmitRejected( + Create( + "RestrictedParent", + "[assembly: SpacetimeDB.Namespace(typeof(BridgeMarker), Accessor = \"Child\")]\n" + + "public class ParentMarker { }", + bridge, + dependency + ), + title + ); + var result = CSharpGeneratorDriver + .Create([new Module().AsSourceGenerator()], parseOptions: fixture.ParseOptions) + .RunGenerators( + Create( + "RestrictedRoot", + $$""" + [assembly: SpacetimeDB.Namespace(typeof(ParentMarker), Accessor = "Left")] + [assembly: SpacetimeDB.Namespace(typeof(ParentMarker), Accessor = "Right")] + [assembly: SpacetimeDB.Namespace(typeof({{marker}}), Accessor = "public")] + """, + parent, + bridge, + dependency + ) + ) + .GetRunResult(); + var errors = result + .Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error) + .ToArray(); + Assert.Equal(2, errors.Length); + foreach (var path in new[] { "Left.Child", "Right.Child" }) + { + Assert.Contains( + errors, + d => + d.Descriptor.Title.ToString() == title + && d.GetMessage().Contains($"namespace '{path}'") + && d.GetMessage().Contains(declaration) + ); + } + } + + // An unrelated utility alone must not cause an otherwise empty module to register. + var plainUtility = Emit(Create("PlainUtility", "public class PlainUtility { }")); + var empty = Generate(Create("Empty", "", plainUtility)); + Assert.Empty(empty.GetSymbolsWithName("AssemblyDescriptor", SymbolFilter.Type)); foreach (var kind in new[] { "Init", "ClientConnected", "ClientDisconnected" }) { @@ -840,25 +1099,7 @@ public static void Handle(SpacetimeDB.ReducerContext ctx) { } ) ) ); - var lifecycleResult = CSharpGeneratorDriver - .Create([new Module().AsSourceGenerator()], parseOptions: fixture.ParseOptions) - .RunGenerators( - Create( - "LifecycleConsumer", - "[assembly: SpacetimeDB.Namespace(typeof(Marker), Accessor = \"Auth\")]", - lifecycle - ) - ) - .GetRunResult(); - Assert.Contains( - lifecycleResult.Diagnostics, - diagnostic => - diagnostic.Severity == DiagnosticSeverity.Error - && diagnostic.Descriptor.Title.ToString() - == "Root-only declarations in mounted dependency" - && diagnostic.GetMessage().Contains("LifecycleFunctions.Handle (" + kind + ")") - && diagnostic.GetMessage().Contains("Auth") - ); + CheckNestedRootOnly(lifecycle, "Marker", "LifecycleFunctions.Handle (" + kind + ")"); // The same dependency can still be published alone or merged into the root scope. Generate(Create("FlatLifecycleConsumer", "", lifecycle)); Generate( @@ -897,6 +1138,7 @@ public static class Rules { ); var dependencyDescriptor = Descriptor(dependencyCompilation); var dependency = Emit(dependencyCompilation); + CheckNestedRootOnly(dependency, "Entry", declaration); if (declaration == "row-level security filters") { Assert.Contains( @@ -909,25 +1151,6 @@ public static class Rules { == "global::Rules.Visible" ); } - var result = CSharpGeneratorDriver - .Create([new Module().AsSourceGenerator()], parseOptions: fixture.ParseOptions) - .RunGenerators( - Create( - "RestrictedConsumer", - "[assembly: SpacetimeDB.Namespace(typeof(Entry), Accessor = \"Auth\")]", - dependency - ) - ) - .GetRunResult(); - Assert.Contains( - result.Diagnostics, - diagnostic => - diagnostic.Severity == DiagnosticSeverity.Error - && diagnostic.GetMessage().Contains("RestrictedDependency") - && diagnostic.GetMessage().Contains("'Auth'") - && diagnostic.GetMessage().Contains(declaration) - && diagnostic.GetMessage().Contains("root scope") - ); foreach ( var mount in new[] { diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomClass.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomClass.verified.cs index 6a49e167c71..38afdfea679 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomClass.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomClass.verified.cs @@ -4,6 +4,11 @@ partial struct CustomClass : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntField = BSATN.IntFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomStruct.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomStruct.verified.cs index 13ba4faad46..b5cc3f1c0e5 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomStruct.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomStruct.verified.cs @@ -6,6 +6,11 @@ partial struct CustomStruct : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntField = BSATN.IntFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#PublicTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#PublicTable.verified.cs index b5dc0fe4165..b78945a7fe6 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#PublicTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#PublicTable.verified.cs @@ -4,6 +4,11 @@ partial struct PublicTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.net10.verified.txt b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.net10.verified.txt index 9b9c4bb3da4..4f8472f717e 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.net10.verified.txt +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/ExtraCompilationErrors.net10.verified.txt @@ -253,12 +253,12 @@ public partial struct TestDefaultFieldValues } }, {/* - { - var tableName = TestDuplicateTableNameSqlNameCache.Name; - ^^^^ - return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + { + var names = TestDuplicateTableNameSqlNames; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if (names[contextInstance] is { } name) */ - Message: Ambiguity between 'AssemblyDescriptor.TestDuplicateTableNameSqlNameCache.Name' and 'AssemblyDescriptor.TestDuplicateTableNameSqlNameCache.Name', + Message: Ambiguity between 'AssemblyDescriptor.TestDuplicateTableNameSqlNames' and 'AssemblyDescriptor.TestDuplicateTableNameSqlNames', Severity: Error, Descriptor: { Id: CS0229, @@ -276,12 +276,12 @@ public partial struct TestDefaultFieldValues } }, {/* - { - var tableName = TestDuplicateTableNameSqlNameCache.Name; - ^^^^ - return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + { + var names = TestDuplicateTableNameSqlNames; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + if (names[contextInstance] is { } name) */ - Message: Ambiguity between 'AssemblyDescriptor.TestDuplicateTableNameSqlNameCache.Name' and 'AssemblyDescriptor.TestDuplicateTableNameSqlNameCache.Name', + Message: Ambiguity between 'AssemblyDescriptor.TestDuplicateTableNameSqlNames' and 'AssemblyDescriptor.TestDuplicateTableNameSqlNames', Severity: Error, Descriptor: { Id: CS0229, @@ -392,11 +392,11 @@ public partial struct TestDefaultFieldValues }, {/* { - public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); - ^^^^^^^^^^^^^^^^^^^^^^ + public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries(global::SpacetimeDB.Internal.Module.GetInstanceId(from)).TestDuplicateTableName(); + ^^^^^^^^^^^^^^^^^^^^^^ } */ - Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(813)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1035)]', + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(832)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1082)]', Severity: Error, Descriptor: { Id: CS0121, @@ -415,11 +415,149 @@ public partial struct TestDefaultFieldValues }, {/* { - public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); - ^^^^^^^^^^^^^^^^^^^^^^ + public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries(global::SpacetimeDB.Internal.Module.GetInstanceId(from)).TestDuplicateTableName(); + ^^^^^^^^^^^^^^^^^^^^^^ } */ - Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(813)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1035)]', + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(832)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Queries.TestDuplicateTableName() [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1082)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + { + var tableName = TestDuplicateTableNameSqlName(__instanceId); + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.TestDuplicateTableNameSqlName(int) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(817)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.TestDuplicateTableNameSqlName(int) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1067)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + { + var tableName = TestDuplicateTableNameSqlName(__instanceId); + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.TestDuplicateTableNameSqlName(int) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(817)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.TestDuplicateTableNameSqlName(int) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1067)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + var tableName = TestDuplicateTableNameSqlName(__instanceId); + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + } +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameCols.TestDuplicateTableNameCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(797)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameCols.TestDuplicateTableNameCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1047)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + var tableName = TestDuplicateTableNameSqlName(__instanceId); + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + } +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameCols.TestDuplicateTableNameCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(797)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameCols.TestDuplicateTableNameCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1047)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + var tableName = TestDuplicateTableNameSqlName(__instanceId); + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + } +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameIxCols.TestDuplicateTableNameIxCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(807)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameIxCols.TestDuplicateTableNameIxCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1057)]', + Severity: Error, + Descriptor: { + Id: CS0121, + Title: , + HelpLink: https://msdn.microsoft.com/query/roslyn.query?appId=roslyn&k=k(CS0121), + MessageFormat: The call is ambiguous between the following methods or properties: '{0}' and '{1}', + Category: Compiler, + DefaultSeverity: Error, + IsEnabledByDefault: true, + CustomTags: [ + Compiler, + Telemetry, + NotConfigurable + ] + } + }, + {/* + var tableName = TestDuplicateTableNameSqlName(__instanceId); + return new(tableName, new TestDuplicateTableNameCols(tableName), new TestDuplicateTableNameIxCols(tableName)); + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + } +*/ + Message: The call is ambiguous between the following methods or properties: 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameIxCols.TestDuplicateTableNameIxCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(807)]' and 'SpacetimeDB.Generated.diag_4F830E2879BB50E3.TestDuplicateTableNameIxCols.TestDuplicateTableNameIxCols(SpacetimeDB.SqlTableName) [{ProjectDirectory}fixtures/diag/SpacetimeDB.Codegen/SpacetimeDB.Codegen.Module/FFI.cs(1057)]', Severity: Error, Descriptor: { Id: CS0121, @@ -484,11 +622,11 @@ public partial struct TestDefaultFieldValues }, {/* { - private static class TestDuplicateTableNameSqlNameCache - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - { + private static global::SpacetimeDB.SqlTableName?[] TestDuplicateTableNameSqlNames => field ??= new global::SpacetimeDB.SqlTableName?[global::SpacetimeDB.Internal.Module.InstanceCount]; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + */ - Message: The type 'AssemblyDescriptor' already contains a definition for 'TestDuplicateTableNameSqlNameCache', + Message: The type 'AssemblyDescriptor' already contains a definition for 'TestDuplicateTableNameSqlNames', Severity: Error, Descriptor: { Id: CS0102, @@ -621,12 +759,12 @@ public partial struct TestDefaultFieldValues } }, {/* - // Prevent eager initialization before the root installs namespace placements. - static TestDuplicateTableNameSqlNameCache() { } - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - } + + private static global::SpacetimeDB.SqlTableName TestDuplicateTableNameSqlName(int contextInstance) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + { */ - Message: Type 'AssemblyDescriptor.TestDuplicateTableNameSqlNameCache' already defines a member called 'TestDuplicateTableNameSqlNameCache' with the same parameter types, + Message: Type 'AssemblyDescriptor' already defines a member called 'TestDuplicateTableNameSqlName' with the same parameter types, Severity: Error, Descriptor: { Id: CS0111, @@ -645,7 +783,7 @@ public partial struct TestDefaultFieldValues }, {/* { - public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); + public global::SpacetimeDB.Table TestDuplicateTableName() => new AssemblyDescriptor.Queries(global::SpacetimeDB.Internal.Module.GetInstanceId(from)).TestDuplicateTableName(); ^^^^^^^^^^^^^^^^^^^^^^ } */ diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index e05e7963849..2ff909bf5af 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -1177,16 +1177,31 @@ internal TestDuplicateTableNameIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDuplicateTableNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDuplicateTableNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDuplicateTableNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDuplicateTableNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDuplicateTableName" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDuplicateTableNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1197,7 +1212,7 @@ public readonly partial struct Queries TestDuplicateTableNameIxCols > TestDuplicateTableName() { - var tableName = TestDuplicateTableNameSqlNameCache.Name; + var tableName = TestDuplicateTableNameSqlName(__instanceId); return new( tableName, new TestDuplicateTableNameCols(tableName), @@ -1215,7 +1230,10 @@ public static partial class QueryTableExtensions global::InAnotherNamespace.TestDuplicateTableName, TestDuplicateTableNameCols, TestDuplicateTableNameIxCols - > TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); + > TestDuplicateTableName() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDuplicateTableName(); } } @@ -1239,23 +1257,33 @@ internal PlayerIxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class PlayerSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player" - ); + private static global::SpacetimeDB.SqlTableName?[] PlayerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PlayerSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PlayerSqlName(int contextInstance) + { + var names = PlayerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "Player"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries { public global::SpacetimeDB.Table Player() { - var tableName = PlayerSqlNameCache.Name; + var tableName = PlayerSqlName(__instanceId); return new(tableName, new PlayerCols(tableName), new PlayerIxCols(tableName)); } } @@ -1266,7 +1294,9 @@ public static partial class QueryTableExtensions extension(global::SpacetimeDB.QueryBuilder from) { public global::SpacetimeDB.Table Player() => - new AssemblyDescriptor.Queries().Player(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).Player(); } } @@ -1298,16 +1328,31 @@ internal TestAutoIncNotIntegerIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class TestAutoIncNotIntegerSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestAutoIncNotIntegerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestAutoIncNotIntegerSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestAutoIncNotIntegerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestAutoIncNotInteger" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestAutoIncNotIntegerSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1318,7 +1363,7 @@ public readonly partial struct Queries TestAutoIncNotIntegerIxCols > TestAutoIncNotInteger() { - var tableName = TestAutoIncNotIntegerSqlNameCache.Name; + var tableName = TestAutoIncNotIntegerSqlName(__instanceId); return new( tableName, new TestAutoIncNotIntegerCols(tableName), @@ -1336,7 +1381,10 @@ public static partial class QueryTableExtensions global::TestAutoIncNotInteger, TestAutoIncNotIntegerCols, TestAutoIncNotIntegerIxCols - > TestAutoIncNotInteger() => new AssemblyDescriptor.Queries().TestAutoIncNotInteger(); + > TestAutoIncNotInteger() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestAutoIncNotInteger(); } } @@ -1446,16 +1494,31 @@ internal TestDefaultFieldValuesIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDefaultFieldValuesSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDefaultFieldValuesSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDefaultFieldValuesSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDefaultFieldValuesSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDefaultFieldValues" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDefaultFieldValuesSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1466,7 +1529,7 @@ public readonly partial struct Queries TestDefaultFieldValuesIxCols > TestDefaultFieldValues() { - var tableName = TestDefaultFieldValuesSqlNameCache.Name; + var tableName = TestDefaultFieldValuesSqlName(__instanceId); return new( tableName, new TestDefaultFieldValuesCols(tableName), @@ -1484,7 +1547,10 @@ public static partial class QueryTableExtensions global::TestDefaultFieldValues, TestDefaultFieldValuesCols, TestDefaultFieldValuesIxCols - > TestDefaultFieldValues() => new AssemblyDescriptor.Queries().TestDefaultFieldValues(); + > TestDefaultFieldValues() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDefaultFieldValues(); } } @@ -1500,16 +1566,31 @@ internal TestDuplicateTableNameIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDuplicateTableNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDuplicateTableNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDuplicateTableNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDuplicateTableNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDuplicateTableName" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDuplicateTableNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1520,7 +1601,7 @@ public readonly partial struct Queries TestDuplicateTableNameIxCols > TestDuplicateTableName() { - var tableName = TestDuplicateTableNameSqlNameCache.Name; + var tableName = TestDuplicateTableNameSqlName(__instanceId); return new( tableName, new TestDuplicateTableNameCols(tableName), @@ -1538,7 +1619,10 @@ public static partial class QueryTableExtensions global::TestDuplicateTableName, TestDuplicateTableNameCols, TestDuplicateTableNameIxCols - > TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); + > TestDuplicateTableName() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDuplicateTableName(); } } @@ -1586,16 +1670,26 @@ internal TestIndexIssuesIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class TestIndexIssuesSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues" - ); + private static global::SpacetimeDB.SqlTableName?[] TestIndexIssuesSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static TestIndexIssuesSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName TestIndexIssuesSqlName(int contextInstance) + { + var names = TestIndexIssuesSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "TestIndexIssues"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1606,7 +1700,7 @@ public readonly partial struct Queries TestIndexIssuesIxCols > TestIndexIssues() { - var tableName = TestIndexIssuesSqlNameCache.Name; + var tableName = TestIndexIssuesSqlName(__instanceId); return new( tableName, new TestIndexIssuesCols(tableName), @@ -1624,7 +1718,10 @@ public static partial class QueryTableExtensions global::TestIndexIssues, TestIndexIssuesCols, TestIndexIssuesIxCols - > TestIndexIssues() => new AssemblyDescriptor.Queries().TestIndexIssues(); + > TestIndexIssues() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestIndexIssues(); } } @@ -1669,16 +1766,31 @@ internal TestScheduleWithoutPrimaryKeyIxCols(global::SpacetimeDB.SqlTableName ta public static partial class AssemblyDescriptor { - private static class TestScheduleWithoutPrimaryKeySqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithoutPrimaryKeySqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithoutPrimaryKeySqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithoutPrimaryKeySqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithoutPrimaryKey" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithoutPrimaryKeySqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1689,7 +1801,7 @@ public readonly partial struct Queries TestScheduleWithoutPrimaryKeyIxCols > TestScheduleWithoutPrimaryKey() { - var tableName = TestScheduleWithoutPrimaryKeySqlNameCache.Name; + var tableName = TestScheduleWithoutPrimaryKeySqlName(__instanceId); return new( tableName, new TestScheduleWithoutPrimaryKeyCols(tableName), @@ -1708,7 +1820,9 @@ public static partial class QueryTableExtensions TestScheduleWithoutPrimaryKeyCols, TestScheduleWithoutPrimaryKeyIxCols > TestScheduleWithoutPrimaryKey() => - new AssemblyDescriptor.Queries().TestScheduleWithoutPrimaryKey(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithoutPrimaryKey(); } } @@ -1763,16 +1877,31 @@ internal TestScheduleWithWrongPrimaryKeyTypeIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithWrongPrimaryKeyTypeSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithWrongPrimaryKeyTypeSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithWrongPrimaryKeyTypeSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithWrongPrimaryKeyTypeSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithWrongPrimaryKeyType" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithWrongPrimaryKeyTypeSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1783,7 +1912,7 @@ public readonly partial struct Queries TestScheduleWithWrongPrimaryKeyTypeIxCols > TestScheduleWithWrongPrimaryKeyType() { - var tableName = TestScheduleWithWrongPrimaryKeyTypeSqlNameCache.Name; + var tableName = TestScheduleWithWrongPrimaryKeyTypeSqlName(__instanceId); return new( tableName, new TestScheduleWithWrongPrimaryKeyTypeCols(tableName), @@ -1802,7 +1931,9 @@ public static partial class QueryTableExtensions TestScheduleWithWrongPrimaryKeyTypeCols, TestScheduleWithWrongPrimaryKeyTypeIxCols > TestScheduleWithWrongPrimaryKeyType() => - new AssemblyDescriptor.Queries().TestScheduleWithWrongPrimaryKeyType(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithWrongPrimaryKeyType(); } } @@ -1855,16 +1986,31 @@ internal TestScheduleWithoutScheduleAtIxCols(global::SpacetimeDB.SqlTableName ta public static partial class AssemblyDescriptor { - private static class TestScheduleWithoutScheduleAtSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithoutScheduleAtSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithoutScheduleAtSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithoutScheduleAtSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithoutScheduleAt" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithoutScheduleAtSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1875,7 +2021,7 @@ public readonly partial struct Queries TestScheduleWithoutScheduleAtIxCols > TestScheduleWithoutScheduleAt() { - var tableName = TestScheduleWithoutScheduleAtSqlNameCache.Name; + var tableName = TestScheduleWithoutScheduleAtSqlName(__instanceId); return new( tableName, new TestScheduleWithoutScheduleAtCols(tableName), @@ -1894,7 +2040,9 @@ public static partial class QueryTableExtensions TestScheduleWithoutScheduleAtCols, TestScheduleWithoutScheduleAtIxCols > TestScheduleWithoutScheduleAt() => - new AssemblyDescriptor.Queries().TestScheduleWithoutScheduleAt(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithoutScheduleAt(); } } @@ -1949,16 +2097,31 @@ internal TestScheduleWithWrongScheduleAtTypeIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithWrongScheduleAtTypeSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithWrongScheduleAtTypeSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithWrongScheduleAtTypeSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithWrongScheduleAtTypeSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithWrongScheduleAtType" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithWrongScheduleAtTypeSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1969,7 +2132,7 @@ public readonly partial struct Queries TestScheduleWithWrongScheduleAtTypeIxCols > TestScheduleWithWrongScheduleAtType() { - var tableName = TestScheduleWithWrongScheduleAtTypeSqlNameCache.Name; + var tableName = TestScheduleWithWrongScheduleAtTypeSqlName(__instanceId); return new( tableName, new TestScheduleWithWrongScheduleAtTypeCols(tableName), @@ -1988,7 +2151,9 @@ public static partial class QueryTableExtensions TestScheduleWithWrongScheduleAtTypeCols, TestScheduleWithWrongScheduleAtTypeIxCols > TestScheduleWithWrongScheduleAtType() => - new AssemblyDescriptor.Queries().TestScheduleWithWrongScheduleAtType(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithWrongScheduleAtType(); } } @@ -2037,16 +2202,31 @@ internal TestScheduleWithMissingScheduleAtFieldIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithMissingScheduleAtFieldSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithMissingScheduleAtFieldSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithMissingScheduleAtFieldSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithMissingScheduleAtFieldSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithMissingScheduleAtField" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithMissingScheduleAtFieldSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -2057,7 +2237,7 @@ public readonly partial struct Queries TestScheduleWithMissingScheduleAtFieldIxCols > TestScheduleWithMissingScheduleAtField() { - var tableName = TestScheduleWithMissingScheduleAtFieldSqlNameCache.Name; + var tableName = TestScheduleWithMissingScheduleAtFieldSqlName(__instanceId); return new( tableName, new TestScheduleWithMissingScheduleAtFieldCols(tableName), @@ -2076,7 +2256,9 @@ public static partial class QueryTableExtensions TestScheduleWithMissingScheduleAtFieldCols, TestScheduleWithMissingScheduleAtFieldIxCols > TestScheduleWithMissingScheduleAtField() => - new AssemblyDescriptor.Queries().TestScheduleWithMissingScheduleAtField(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithMissingScheduleAtField(); } } @@ -2119,16 +2301,31 @@ internal TestUniqueNotEquatableIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestUniqueNotEquatableSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestUniqueNotEquatableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestUniqueNotEquatableSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestUniqueNotEquatableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestUniqueNotEquatable" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUniqueNotEquatableSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -2139,7 +2336,7 @@ public readonly partial struct Queries TestUniqueNotEquatableIxCols > TestUniqueNotEquatable() { - var tableName = TestUniqueNotEquatableSqlNameCache.Name; + var tableName = TestUniqueNotEquatableSqlName(__instanceId); return new( tableName, new TestUniqueNotEquatableCols(tableName), @@ -2157,7 +2354,10 @@ public static partial class QueryTableExtensions global::TestUniqueNotEquatable, TestUniqueNotEquatableCols, TestUniqueNotEquatableIxCols - > TestUniqueNotEquatable() => new AssemblyDescriptor.Queries().TestUniqueNotEquatable(); + > TestUniqueNotEquatable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestUniqueNotEquatable(); } } } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#InAnotherNamespace.TestDuplicateTableName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#InAnotherNamespace.TestDuplicateTableName.verified.cs index 482455c6030..6b9b22be980 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#InAnotherNamespace.TestDuplicateTableName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#InAnotherNamespace.TestDuplicateTableName.verified.cs @@ -8,6 +8,11 @@ partial struct TestDuplicateTableName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#Player.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#Player.verified.cs index cc56e15d179..9faab7a8291 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#Player.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#Player.verified.cs @@ -4,6 +4,11 @@ partial struct Player : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Identity = BSATN.IdentityRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestAutoIncNotInteger.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestAutoIncNotInteger.verified.cs index 4ca65c38535..b282fdf2915 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestAutoIncNotInteger.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestAutoIncNotInteger.verified.cs @@ -6,6 +6,11 @@ partial struct TestAutoIncNotInteger : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { AutoIncField = BSATN.AutoIncFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDefaultFieldValues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDefaultFieldValues.verified.cs index a67e17e0b9f..688323cb2af 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDefaultFieldValues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDefaultFieldValues.verified.cs @@ -6,6 +6,11 @@ partial struct TestDefaultFieldValues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { UniqueField = BSATN.UniqueFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDuplicateTableName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDuplicateTableName.verified.cs index ae2c3d77112..c3623ec1190 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDuplicateTableName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDuplicateTableName.verified.cs @@ -6,6 +6,11 @@ partial struct TestDuplicateTableName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestIndexIssues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestIndexIssues.verified.cs index 15d297b7718..7d70fac6719 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestIndexIssues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestIndexIssues.verified.cs @@ -6,6 +6,11 @@ partial struct TestIndexIssues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { SelfIndexingColumn = BSATN.SelfIndexingColumnRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestScheduleIssues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestScheduleIssues.verified.cs index 0da56ed822b..722c33570ce 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestScheduleIssues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestScheduleIssues.verified.cs @@ -6,6 +6,11 @@ partial struct TestScheduleIssues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IdWrongType = BSATN.IdWrongTypeRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestUniqueNotEquatable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestUniqueNotEquatable.verified.cs index 7fa75d478b4..2823dcbeee5 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestUniqueNotEquatable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestUniqueNotEquatable.verified.cs @@ -6,6 +6,11 @@ partial struct TestUniqueNotEquatable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { UniqueField = BSATN.UniqueFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#FFI.verified.cs index b6059ec8772..81fb6875c71 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#FFI.verified.cs @@ -884,27 +884,49 @@ internal HandlerTxContext(Internal.TxContext inner) public sealed class Local : global::SpacetimeDB.LocalBase { public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } public sealed record ViewContext : DbContext, Internal.IViewContext @@ -958,7 +980,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink error + global::SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalReducer( id, @@ -970,7 +993,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - error + error, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalProcedure( @@ -983,7 +1007,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink result_sink + global::SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalProcedure( id, @@ -995,7 +1020,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - result_sink + result_sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalHttpHandler( @@ -1032,7 +1058,8 @@ public static partial class AssemblyDescriptor ulong sender_2, ulong sender_3, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalView( id, @@ -1041,71 +1068,139 @@ public static partial class AssemblyDescriptor sender_2, sender_3, args, - sink + sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink - ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink); + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 + ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink, instanceId); public static void Register(global::SpacetimeDB.Internal.ModuleBuilder builder) => global::ModuleRegistration.Register(builder); public readonly struct Tables { + private readonly int __instanceId; + + public Tables(int instanceId) + { + __instanceId = instanceId; + } + public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable.__GetInstance( + __instanceId + ); } public readonly struct ReadOnlyTables { + private readonly int __instanceId; + + public ReadOnlyTables(int instanceId) + { + __instanceId = instanceId; + } + public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly.__GetInstance( + __instanceId + ); } - public readonly partial struct Queries { } + public readonly partial struct Queries + { + private readonly int __instanceId; + + public Queries(int instanceId) + { + __instanceId = instanceId; + } + } } public static class LocalTableExtensions @@ -1113,27 +1208,49 @@ public static class LocalTableExtensions extension(global::SpacetimeDB.Local db) { public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.Player.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestAutoIncNotInteger.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDefaultFieldValues.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestDuplicateTableName.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestIndexIssues.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithMissingScheduleAtField.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutPrimaryKey.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithoutScheduleAt.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongPrimaryKeyType.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestScheduleWithWrongScheduleAtType.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles.TestUniqueNotEquatable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -1142,27 +1259,49 @@ public static class ReadOnlyTableExtensions extension(global::SpacetimeDB.Internal.LocalReadOnly db) { public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -1183,16 +1322,31 @@ internal TestDuplicateTableNameIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDuplicateTableNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDuplicateTableNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDuplicateTableNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDuplicateTableNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDuplicateTableName" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDuplicateTableNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1203,7 +1357,7 @@ public readonly partial struct Queries TestDuplicateTableNameIxCols > TestDuplicateTableName() { - var tableName = TestDuplicateTableNameSqlNameCache.Name; + var tableName = TestDuplicateTableNameSqlName(__instanceId); return new( tableName, new TestDuplicateTableNameCols(tableName), @@ -1221,7 +1375,10 @@ public static partial class QueryTableExtensions global::InAnotherNamespace.TestDuplicateTableName, TestDuplicateTableNameCols, TestDuplicateTableNameIxCols - > TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); + > TestDuplicateTableName() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDuplicateTableName(); } } @@ -1245,23 +1402,33 @@ internal PlayerIxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class PlayerSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player" - ); + private static global::SpacetimeDB.SqlTableName?[] PlayerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PlayerSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PlayerSqlName(int contextInstance) + { + var names = PlayerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "Player"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries { public global::SpacetimeDB.Table Player() { - var tableName = PlayerSqlNameCache.Name; + var tableName = PlayerSqlName(__instanceId); return new(tableName, new PlayerCols(tableName), new PlayerIxCols(tableName)); } } @@ -1272,7 +1439,9 @@ public static partial class QueryTableExtensions extension(global::SpacetimeDB.QueryBuilder from) { public global::SpacetimeDB.Table Player() => - new AssemblyDescriptor.Queries().Player(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).Player(); } } @@ -1304,16 +1473,31 @@ internal TestAutoIncNotIntegerIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class TestAutoIncNotIntegerSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestAutoIncNotIntegerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestAutoIncNotIntegerSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestAutoIncNotIntegerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestAutoIncNotInteger" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestAutoIncNotIntegerSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1324,7 +1508,7 @@ public readonly partial struct Queries TestAutoIncNotIntegerIxCols > TestAutoIncNotInteger() { - var tableName = TestAutoIncNotIntegerSqlNameCache.Name; + var tableName = TestAutoIncNotIntegerSqlName(__instanceId); return new( tableName, new TestAutoIncNotIntegerCols(tableName), @@ -1342,7 +1526,10 @@ public static partial class QueryTableExtensions global::TestAutoIncNotInteger, TestAutoIncNotIntegerCols, TestAutoIncNotIntegerIxCols - > TestAutoIncNotInteger() => new AssemblyDescriptor.Queries().TestAutoIncNotInteger(); + > TestAutoIncNotInteger() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestAutoIncNotInteger(); } } @@ -1452,16 +1639,31 @@ internal TestDefaultFieldValuesIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDefaultFieldValuesSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDefaultFieldValuesSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDefaultFieldValuesSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDefaultFieldValuesSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDefaultFieldValues" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDefaultFieldValuesSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1472,7 +1674,7 @@ public readonly partial struct Queries TestDefaultFieldValuesIxCols > TestDefaultFieldValues() { - var tableName = TestDefaultFieldValuesSqlNameCache.Name; + var tableName = TestDefaultFieldValuesSqlName(__instanceId); return new( tableName, new TestDefaultFieldValuesCols(tableName), @@ -1490,7 +1692,10 @@ public static partial class QueryTableExtensions global::TestDefaultFieldValues, TestDefaultFieldValuesCols, TestDefaultFieldValuesIxCols - > TestDefaultFieldValues() => new AssemblyDescriptor.Queries().TestDefaultFieldValues(); + > TestDefaultFieldValues() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDefaultFieldValues(); } } @@ -1506,16 +1711,31 @@ internal TestDuplicateTableNameIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestDuplicateTableNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestDuplicateTableNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestDuplicateTableNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestDuplicateTableNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestDuplicateTableName" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestDuplicateTableNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1526,7 +1746,7 @@ public readonly partial struct Queries TestDuplicateTableNameIxCols > TestDuplicateTableName() { - var tableName = TestDuplicateTableNameSqlNameCache.Name; + var tableName = TestDuplicateTableNameSqlName(__instanceId); return new( tableName, new TestDuplicateTableNameCols(tableName), @@ -1544,7 +1764,10 @@ public static partial class QueryTableExtensions global::TestDuplicateTableName, TestDuplicateTableNameCols, TestDuplicateTableNameIxCols - > TestDuplicateTableName() => new AssemblyDescriptor.Queries().TestDuplicateTableName(); + > TestDuplicateTableName() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestDuplicateTableName(); } } @@ -1592,16 +1815,26 @@ internal TestIndexIssuesIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class TestIndexIssuesSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues" - ); + private static global::SpacetimeDB.SqlTableName?[] TestIndexIssuesSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static TestIndexIssuesSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName TestIndexIssuesSqlName(int contextInstance) + { + var names = TestIndexIssuesSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "TestIndexIssues"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1612,7 +1845,7 @@ public readonly partial struct Queries TestIndexIssuesIxCols > TestIndexIssues() { - var tableName = TestIndexIssuesSqlNameCache.Name; + var tableName = TestIndexIssuesSqlName(__instanceId); return new( tableName, new TestIndexIssuesCols(tableName), @@ -1630,7 +1863,10 @@ public static partial class QueryTableExtensions global::TestIndexIssues, TestIndexIssuesCols, TestIndexIssuesIxCols - > TestIndexIssues() => new AssemblyDescriptor.Queries().TestIndexIssues(); + > TestIndexIssues() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestIndexIssues(); } } @@ -1675,16 +1911,31 @@ internal TestScheduleWithoutPrimaryKeyIxCols(global::SpacetimeDB.SqlTableName ta public static partial class AssemblyDescriptor { - private static class TestScheduleWithoutPrimaryKeySqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithoutPrimaryKeySqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithoutPrimaryKeySqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithoutPrimaryKeySqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithoutPrimaryKey" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithoutPrimaryKeySqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1695,7 +1946,7 @@ public readonly partial struct Queries TestScheduleWithoutPrimaryKeyIxCols > TestScheduleWithoutPrimaryKey() { - var tableName = TestScheduleWithoutPrimaryKeySqlNameCache.Name; + var tableName = TestScheduleWithoutPrimaryKeySqlName(__instanceId); return new( tableName, new TestScheduleWithoutPrimaryKeyCols(tableName), @@ -1714,7 +1965,9 @@ public static partial class QueryTableExtensions TestScheduleWithoutPrimaryKeyCols, TestScheduleWithoutPrimaryKeyIxCols > TestScheduleWithoutPrimaryKey() => - new AssemblyDescriptor.Queries().TestScheduleWithoutPrimaryKey(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithoutPrimaryKey(); } } @@ -1769,16 +2022,31 @@ internal TestScheduleWithWrongPrimaryKeyTypeIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithWrongPrimaryKeyTypeSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithWrongPrimaryKeyTypeSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithWrongPrimaryKeyTypeSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithWrongPrimaryKeyTypeSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithWrongPrimaryKeyType" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithWrongPrimaryKeyTypeSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1789,7 +2057,7 @@ public readonly partial struct Queries TestScheduleWithWrongPrimaryKeyTypeIxCols > TestScheduleWithWrongPrimaryKeyType() { - var tableName = TestScheduleWithWrongPrimaryKeyTypeSqlNameCache.Name; + var tableName = TestScheduleWithWrongPrimaryKeyTypeSqlName(__instanceId); return new( tableName, new TestScheduleWithWrongPrimaryKeyTypeCols(tableName), @@ -1808,7 +2076,9 @@ public static partial class QueryTableExtensions TestScheduleWithWrongPrimaryKeyTypeCols, TestScheduleWithWrongPrimaryKeyTypeIxCols > TestScheduleWithWrongPrimaryKeyType() => - new AssemblyDescriptor.Queries().TestScheduleWithWrongPrimaryKeyType(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithWrongPrimaryKeyType(); } } @@ -1861,16 +2131,31 @@ internal TestScheduleWithoutScheduleAtIxCols(global::SpacetimeDB.SqlTableName ta public static partial class AssemblyDescriptor { - private static class TestScheduleWithoutScheduleAtSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithoutScheduleAtSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithoutScheduleAtSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithoutScheduleAtSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithoutScheduleAt" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithoutScheduleAtSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1881,7 +2166,7 @@ public readonly partial struct Queries TestScheduleWithoutScheduleAtIxCols > TestScheduleWithoutScheduleAt() { - var tableName = TestScheduleWithoutScheduleAtSqlNameCache.Name; + var tableName = TestScheduleWithoutScheduleAtSqlName(__instanceId); return new( tableName, new TestScheduleWithoutScheduleAtCols(tableName), @@ -1900,7 +2185,9 @@ public static partial class QueryTableExtensions TestScheduleWithoutScheduleAtCols, TestScheduleWithoutScheduleAtIxCols > TestScheduleWithoutScheduleAt() => - new AssemblyDescriptor.Queries().TestScheduleWithoutScheduleAt(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithoutScheduleAt(); } } @@ -1955,16 +2242,31 @@ internal TestScheduleWithWrongScheduleAtTypeIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithWrongScheduleAtTypeSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithWrongScheduleAtTypeSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithWrongScheduleAtTypeSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithWrongScheduleAtTypeSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithWrongScheduleAtType" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithWrongScheduleAtTypeSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1975,7 +2277,7 @@ public readonly partial struct Queries TestScheduleWithWrongScheduleAtTypeIxCols > TestScheduleWithWrongScheduleAtType() { - var tableName = TestScheduleWithWrongScheduleAtTypeSqlNameCache.Name; + var tableName = TestScheduleWithWrongScheduleAtTypeSqlName(__instanceId); return new( tableName, new TestScheduleWithWrongScheduleAtTypeCols(tableName), @@ -1994,7 +2296,9 @@ public static partial class QueryTableExtensions TestScheduleWithWrongScheduleAtTypeCols, TestScheduleWithWrongScheduleAtTypeIxCols > TestScheduleWithWrongScheduleAtType() => - new AssemblyDescriptor.Queries().TestScheduleWithWrongScheduleAtType(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithWrongScheduleAtType(); } } @@ -2043,16 +2347,31 @@ internal TestScheduleWithMissingScheduleAtFieldIxCols( public static partial class AssemblyDescriptor { - private static class TestScheduleWithMissingScheduleAtFieldSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestScheduleWithMissingScheduleAtFieldSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestScheduleWithMissingScheduleAtFieldSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestScheduleWithMissingScheduleAtFieldSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestScheduleWithMissingScheduleAtField" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestScheduleWithMissingScheduleAtFieldSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -2063,7 +2382,7 @@ public readonly partial struct Queries TestScheduleWithMissingScheduleAtFieldIxCols > TestScheduleWithMissingScheduleAtField() { - var tableName = TestScheduleWithMissingScheduleAtFieldSqlNameCache.Name; + var tableName = TestScheduleWithMissingScheduleAtFieldSqlName(__instanceId); return new( tableName, new TestScheduleWithMissingScheduleAtFieldCols(tableName), @@ -2082,7 +2401,9 @@ public static partial class QueryTableExtensions TestScheduleWithMissingScheduleAtFieldCols, TestScheduleWithMissingScheduleAtFieldIxCols > TestScheduleWithMissingScheduleAtField() => - new AssemblyDescriptor.Queries().TestScheduleWithMissingScheduleAtField(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestScheduleWithMissingScheduleAtField(); } } @@ -2125,16 +2446,31 @@ internal TestUniqueNotEquatableIxCols(global::SpacetimeDB.SqlTableName tableName public static partial class AssemblyDescriptor { - private static class TestUniqueNotEquatableSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] TestUniqueNotEquatableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName TestUniqueNotEquatableSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = TestUniqueNotEquatableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestUniqueNotEquatable" ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUniqueNotEquatableSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -2145,7 +2481,7 @@ public readonly partial struct Queries TestUniqueNotEquatableIxCols > TestUniqueNotEquatable() { - var tableName = TestUniqueNotEquatableSqlNameCache.Name; + var tableName = TestUniqueNotEquatableSqlName(__instanceId); return new( tableName, new TestUniqueNotEquatableCols(tableName), @@ -2163,7 +2499,10 @@ public static partial class QueryTableExtensions global::TestUniqueNotEquatable, TestUniqueNotEquatableCols, TestUniqueNotEquatableIxCols - > TestUniqueNotEquatable() => new AssemblyDescriptor.Queries().TestUniqueNotEquatable(); + > TestUniqueNotEquatable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).TestUniqueNotEquatable(); } } } @@ -2173,11 +2512,44 @@ namespace SpacetimeDB.Generated.diag_4F830E2879BB50E3.TableHandles { public readonly struct Player : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "Player") + ) + { + internal readonly int InstanceId = instanceId; + internal IdentityUniqueIndex? __index_Identity; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static Player() { } + + public Player() + : this(__GetInstance(0).__state) { } + + private Player(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static Player __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::Player ReadGenFields( System.IO.BinaryReader reader, @@ -2225,19 +2597,19 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount(__state); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter(__state); public global::Player Insert(global::Player row) => - global::SpacetimeDB.Internal.ITableView.DoInsert(row); + global::SpacetimeDB.Internal.ITableView.DoInsert(row, __state); public bool Delete(global::Player row) => - global::SpacetimeDB.Internal.ITableView.DoDelete(row); + global::SpacetimeDB.Internal.ITableView.DoDelete(row, __state); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear(__state); public sealed class IdentityUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2247,17 +2619,13 @@ public sealed class IdentityUniqueIndex SpacetimeDB.Identity.BSATN > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player_Identity_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdentityUniqueIndex() { } - - internal IdentityUniqueIndex() - : base(__resolvedName) { } + internal IdentityUniqueIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "Player_Identity_idx_btree" + ) + ) { } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2265,8 +2633,7 @@ internal IdentityUniqueIndex() public global::Player? Find(SpacetimeDB.Identity key) => FindSingle(key); } - private static IdentityUniqueIndex? __Identity; - public IdentityUniqueIndex Identity => __Identity ??= new(); + public IdentityUniqueIndex Identity => __state.__index_Identity ??= new(__state.InstanceId); } public readonly struct TestAutoIncNotInteger @@ -2275,11 +2642,44 @@ public readonly struct TestAutoIncNotInteger global::TestAutoIncNotInteger > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestAutoIncNotInteger" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "TestAutoIncNotInteger") + ) + { + internal readonly int InstanceId = instanceId; + internal IdentityFieldUniqueIndex? __index_IdentityField; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestAutoIncNotInteger() { } + + public TestAutoIncNotInteger() + : this(__GetInstance(0).__state) { } + + private TestAutoIncNotInteger(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestAutoIncNotInteger __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestAutoIncNotInteger ReadGenFields( System.IO.BinaryReader reader, @@ -2351,31 +2751,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestAutoIncNotInteger, global::TestAutoIncNotInteger - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestAutoIncNotInteger, global::TestAutoIncNotInteger - >.DoIter(); + >.DoIter(__state); public global::TestAutoIncNotInteger Insert(global::TestAutoIncNotInteger row) => global::SpacetimeDB.Internal.ITableView< TestAutoIncNotInteger, global::TestAutoIncNotInteger - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestAutoIncNotInteger row) => global::SpacetimeDB.Internal.ITableView< TestAutoIncNotInteger, global::TestAutoIncNotInteger - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestAutoIncNotInteger, global::TestAutoIncNotInteger - >.DoClear(); + >.DoClear(__state); public sealed class IdentityFieldUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2385,17 +2785,13 @@ public sealed class IdentityFieldUniqueIndex SpacetimeDB.BSATN.String > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestAutoIncNotInteger_IdentityField_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdentityFieldUniqueIndex() { } - - internal IdentityFieldUniqueIndex() - : base(__resolvedName) { } + internal IdentityFieldUniqueIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestAutoIncNotInteger_IdentityField_idx_btree" + ) + ) { } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2403,8 +2799,8 @@ internal IdentityFieldUniqueIndex() public global::TestAutoIncNotInteger? Find(string key) => FindSingle(key); } - private static IdentityFieldUniqueIndex? __IdentityField; - public IdentityFieldUniqueIndex IdentityField => __IdentityField ??= new(); + public IdentityFieldUniqueIndex IdentityField => + __state.__index_IdentityField ??= new(__state.InstanceId); } public readonly struct TestDefaultFieldValues @@ -2413,11 +2809,46 @@ public readonly struct TestDefaultFieldValues global::TestDefaultFieldValues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestDefaultFieldValues" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestDefaultFieldValues" + ) + ) + { + internal readonly int InstanceId = instanceId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestDefaultFieldValues() { } + + public TestDefaultFieldValues() + : this(__GetInstance(0).__state) { } + + private TestDefaultFieldValues(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestDefaultFieldValues __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestDefaultFieldValues ReadGenFields( System.IO.BinaryReader reader, @@ -2469,31 +2900,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestDefaultFieldValues, global::TestDefaultFieldValues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestDefaultFieldValues, global::TestDefaultFieldValues - >.DoIter(); + >.DoIter(__state); public global::TestDefaultFieldValues Insert(global::TestDefaultFieldValues row) => global::SpacetimeDB.Internal.ITableView< TestDefaultFieldValues, global::TestDefaultFieldValues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestDefaultFieldValues row) => global::SpacetimeDB.Internal.ITableView< TestDefaultFieldValues, global::TestDefaultFieldValues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestDefaultFieldValues, global::TestDefaultFieldValues - >.DoClear(); + >.DoClear(__state); } public readonly struct TestDuplicateTableName @@ -2502,11 +2933,46 @@ public readonly struct TestDuplicateTableName global::TestDuplicateTableName > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestDuplicateTableName" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestDuplicateTableName" + ) + ) + { + internal readonly int InstanceId = instanceId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestDuplicateTableName() { } + + public TestDuplicateTableName() + : this(__GetInstance(0).__state) { } + + private TestDuplicateTableName(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestDuplicateTableName __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestDuplicateTableName ReadGenFields( System.IO.BinaryReader reader, @@ -2545,41 +3011,79 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestDuplicateTableName, global::TestDuplicateTableName - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestDuplicateTableName, global::TestDuplicateTableName - >.DoIter(); + >.DoIter(__state); public global::TestDuplicateTableName Insert(global::TestDuplicateTableName row) => global::SpacetimeDB.Internal.ITableView< TestDuplicateTableName, global::TestDuplicateTableName - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestDuplicateTableName row) => global::SpacetimeDB.Internal.ITableView< TestDuplicateTableName, global::TestDuplicateTableName - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestDuplicateTableName, global::TestDuplicateTableName - >.DoClear(); + >.DoClear(__state); } public readonly struct TestIndexIssues : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "TestIndexIssues") + ) + { + internal readonly int InstanceId = instanceId; + internal TestIndexWithoutColumnsIndex? __index_TestIndexWithoutColumns; + internal TestIndexWithEmptyColumnsIndex? __index_TestIndexWithEmptyColumns; + internal TestUnknownColumnsIndex? __index_TestUnknownColumns; + internal SelfIndexingColumnIndex? __index_SelfIndexingColumn; + internal SecondaryIndexingColumnIndex? __index_SecondaryIndexingColumn; + internal TestUnexpectedColumnsIndex? __index_TestUnexpectedColumns; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestIndexIssues() { } + + public TestIndexIssues() + : this(__GetInstance(0).__state) { } + + private TestIndexIssues(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestIndexIssues __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestIndexIssues ReadGenFields( System.IO.BinaryReader reader, @@ -2650,94 +3154,73 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestIndexIssues, global::TestIndexIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestIndexIssues, global::TestIndexIssues - >.DoIter(); + >.DoIter(__state); public global::TestIndexIssues Insert(global::TestIndexIssues row) => global::SpacetimeDB.Internal.ITableView< TestIndexIssues, global::TestIndexIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestIndexIssues row) => global::SpacetimeDB.Internal.ITableView< TestIndexIssues, global::TestIndexIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestIndexIssues, global::TestIndexIssues - >.DoClear(); + >.DoClear(__state); - public sealed class TestIndexWithoutColumnsIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class TestIndexWithoutColumnsIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestIndexWithoutColumnsIndex() { } - } + ) + ) { } - private static TestIndexWithoutColumnsIndex? __TestIndexWithoutColumns; public TestIndexWithoutColumnsIndex TestIndexWithoutColumns => - __TestIndexWithoutColumns ??= new(); + __state.__index_TestIndexWithoutColumns ??= new(__state.InstanceId); - public sealed class TestIndexWithEmptyColumnsIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class TestIndexWithEmptyColumnsIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestIndexWithEmptyColumnsIndex() { } - } + ) + ) { } - private static TestIndexWithEmptyColumnsIndex? __TestIndexWithEmptyColumns; public TestIndexWithEmptyColumnsIndex TestIndexWithEmptyColumns => - __TestIndexWithEmptyColumns ??= new(); + __state.__index_TestIndexWithEmptyColumns ??= new(__state.InstanceId); - public sealed class TestUnknownColumnsIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class TestUnknownColumnsIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUnknownColumnsIndex() { } - } + ) + ) { } - private static TestUnknownColumnsIndex? __TestUnknownColumns; - public TestUnknownColumnsIndex TestUnknownColumns => __TestUnknownColumns ??= new(); + public TestUnknownColumnsIndex TestUnknownColumns => + __state.__index_TestUnknownColumns ??= new(__state.InstanceId); - public sealed class SelfIndexingColumnIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class SelfIndexingColumnIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues_SelfIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static SelfIndexingColumnIndex() { } - + ) + ) + { public IEnumerable Filter(int SelfIndexingColumn) => DoFilter( new SpacetimeDB.Internal.BTreeIndexBounds( @@ -2769,21 +3252,17 @@ public ulong Delete(global::SpacetimeDB.Bound SelfIndexingColumn) => ); } - private static SelfIndexingColumnIndex? __SelfIndexingColumn; - public SelfIndexingColumnIndex SelfIndexingColumn => __SelfIndexingColumn ??= new(); + public SelfIndexingColumnIndex SelfIndexingColumn => + __state.__index_SelfIndexingColumn ??= new(__state.InstanceId); - public sealed class SecondaryIndexingColumnIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class SecondaryIndexingColumnIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues_SecondaryIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static SecondaryIndexingColumnIndex() { } - + ) + ) + { public IEnumerable Filter(int SecondaryIndexingColumn) => DoFilter( new SpacetimeDB.Internal.BTreeIndexBounds( @@ -2815,22 +3294,17 @@ public ulong Delete(global::SpacetimeDB.Bound SecondaryIndexingColumn) => ); } - private static SecondaryIndexingColumnIndex? __SecondaryIndexingColumn; public SecondaryIndexingColumnIndex SecondaryIndexingColumn => - __SecondaryIndexingColumn ??= new(); + __state.__index_SecondaryIndexingColumn ??= new(__state.InstanceId); - public sealed class TestUnexpectedColumnsIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class TestUnexpectedColumnsIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "TestIndexIssues_SelfIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUnexpectedColumnsIndex() { } - + ) + ) + { public IEnumerable Filter(int SelfIndexingColumn) => DoFilter( new SpacetimeDB.Internal.BTreeIndexBounds( @@ -2862,9 +3336,8 @@ public ulong Delete(global::SpacetimeDB.Bound SelfIndexingColumn) => ); } - private static TestUnexpectedColumnsIndex? __TestUnexpectedColumns; public TestUnexpectedColumnsIndex TestUnexpectedColumns => - __TestUnexpectedColumns ??= new(); + __state.__index_TestUnexpectedColumns ??= new(__state.InstanceId); } public readonly struct TestScheduleWithMissingScheduleAtField @@ -2873,11 +3346,46 @@ public readonly struct TestScheduleWithMissingScheduleAtField global::TestScheduleIssues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithMissingScheduleAtField" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithMissingScheduleAtField" + ) + ) + { + internal readonly int InstanceId = instanceId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestScheduleWithMissingScheduleAtField() { } + + public TestScheduleWithMissingScheduleAtField() + : this(__GetInstance(0).__state) { } + + private TestScheduleWithMissingScheduleAtField(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithMissingScheduleAtField __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestScheduleIssues ReadGenFields( System.IO.BinaryReader reader, @@ -2916,31 +3424,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestScheduleWithMissingScheduleAtField, global::TestScheduleIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithMissingScheduleAtField, global::TestScheduleIssues - >.DoIter(); + >.DoIter(__state); public global::TestScheduleIssues Insert(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithMissingScheduleAtField, global::TestScheduleIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithMissingScheduleAtField, global::TestScheduleIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithMissingScheduleAtField, global::TestScheduleIssues - >.DoClear(); + >.DoClear(__state); } public readonly struct TestScheduleWithoutPrimaryKey @@ -2949,11 +3457,46 @@ public readonly struct TestScheduleWithoutPrimaryKey global::TestScheduleIssues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutPrimaryKey" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutPrimaryKey" + ) + ) + { + internal readonly int InstanceId = instanceId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestScheduleWithoutPrimaryKey() { } + + public TestScheduleWithoutPrimaryKey() + : this(__GetInstance(0).__state) { } + + private TestScheduleWithoutPrimaryKey(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithoutPrimaryKey __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestScheduleIssues ReadGenFields( System.IO.BinaryReader reader, @@ -2996,31 +3539,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutPrimaryKey, global::TestScheduleIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutPrimaryKey, global::TestScheduleIssues - >.DoIter(); + >.DoIter(__state); public global::TestScheduleIssues Insert(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutPrimaryKey, global::TestScheduleIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutPrimaryKey, global::TestScheduleIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutPrimaryKey, global::TestScheduleIssues - >.DoClear(); + >.DoClear(__state); } public readonly struct TestScheduleWithoutScheduleAt @@ -3029,11 +3572,47 @@ public readonly struct TestScheduleWithoutScheduleAt global::TestScheduleIssues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutScheduleAt" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutScheduleAt" + ) + ) + { + internal readonly int InstanceId = instanceId; + internal IdCorrectTypeUniqueIndex? __index_IdCorrectType; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestScheduleWithoutScheduleAt() { } + + public TestScheduleWithoutScheduleAt() + : this(__GetInstance(0).__state) { } + + private TestScheduleWithoutScheduleAt(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithoutScheduleAt __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestScheduleIssues ReadGenFields( System.IO.BinaryReader reader, @@ -3085,31 +3664,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutScheduleAt, global::TestScheduleIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutScheduleAt, global::TestScheduleIssues - >.DoIter(); + >.DoIter(__state); public global::TestScheduleIssues Insert(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutScheduleAt, global::TestScheduleIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutScheduleAt, global::TestScheduleIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithoutScheduleAt, global::TestScheduleIssues - >.DoClear(); + >.DoClear(__state); public sealed class IdCorrectTypeUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -3119,17 +3698,21 @@ public sealed class IdCorrectTypeUniqueIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutScheduleAt_IdCorrectType_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdCorrectTypeUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal IdCorrectTypeUniqueIndex() - : base(__resolvedName) { } + internal IdCorrectTypeUniqueIndex( + int instanceId, + global::SpacetimeDB.Internal.TableHandle table + ) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutScheduleAt_IdCorrectType_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -3137,11 +3720,11 @@ internal IdCorrectTypeUniqueIndex() public global::TestScheduleIssues? Find(int key) => FindSingle(key); public global::TestScheduleIssues Update(global::TestScheduleIssues row) => - DoUpdate(row); + DoUpdate(row, __table); } - private static IdCorrectTypeUniqueIndex? __IdCorrectType; - public IdCorrectTypeUniqueIndex IdCorrectType => __IdCorrectType ??= new(); + public IdCorrectTypeUniqueIndex IdCorrectType => + __state.__index_IdCorrectType ??= new(__state.InstanceId, __state); } public readonly struct TestScheduleWithWrongPrimaryKeyType @@ -3150,11 +3733,47 @@ public readonly struct TestScheduleWithWrongPrimaryKeyType global::TestScheduleIssues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongPrimaryKeyType" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongPrimaryKeyType" + ) + ) + { + internal readonly int InstanceId = instanceId; + internal IdWrongTypeUniqueIndex? __index_IdWrongType; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestScheduleWithWrongPrimaryKeyType() { } + + public TestScheduleWithWrongPrimaryKeyType() + : this(__GetInstance(0).__state) { } + + private TestScheduleWithWrongPrimaryKeyType(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithWrongPrimaryKeyType __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestScheduleIssues ReadGenFields( System.IO.BinaryReader reader, @@ -3210,31 +3829,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongPrimaryKeyType, global::TestScheduleIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongPrimaryKeyType, global::TestScheduleIssues - >.DoIter(); + >.DoIter(__state); public global::TestScheduleIssues Insert(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongPrimaryKeyType, global::TestScheduleIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongPrimaryKeyType, global::TestScheduleIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongPrimaryKeyType, global::TestScheduleIssues - >.DoClear(); + >.DoClear(__state); public sealed class IdWrongTypeUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -3244,17 +3863,21 @@ public sealed class IdWrongTypeUniqueIndex SpacetimeDB.BSATN.String > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongPrimaryKeyType_IdWrongType_idx_btree" - ); + private readonly global::SpacetimeDB.Internal.TableHandle __table; - // Prevent eager initialization before the root installs namespace placements. - static IdWrongTypeUniqueIndex() { } - - internal IdWrongTypeUniqueIndex() - : base(__resolvedName) { } + internal IdWrongTypeUniqueIndex( + int instanceId, + global::SpacetimeDB.Internal.TableHandle table + ) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongPrimaryKeyType_IdWrongType_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -3262,11 +3885,11 @@ internal IdWrongTypeUniqueIndex() public global::TestScheduleIssues? Find(string key) => FindSingle(key); public global::TestScheduleIssues Update(global::TestScheduleIssues row) => - DoUpdate(row); + DoUpdate(row, __table); } - private static IdWrongTypeUniqueIndex? __IdWrongType; - public IdWrongTypeUniqueIndex IdWrongType => __IdWrongType ??= new(); + public IdWrongTypeUniqueIndex IdWrongType => + __state.__index_IdWrongType ??= new(__state.InstanceId, __state); } public readonly struct TestScheduleWithWrongScheduleAtType @@ -3275,11 +3898,47 @@ public readonly struct TestScheduleWithWrongScheduleAtType global::TestScheduleIssues > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongScheduleAtType" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongScheduleAtType" + ) + ) + { + internal readonly int InstanceId = instanceId; + internal IdCorrectTypeUniqueIndex? __index_IdCorrectType; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestScheduleWithWrongScheduleAtType() { } + + public TestScheduleWithWrongScheduleAtType() + : this(__GetInstance(0).__state) { } + + private TestScheduleWithWrongScheduleAtType(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithWrongScheduleAtType __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestScheduleIssues ReadGenFields( System.IO.BinaryReader reader, @@ -3335,31 +3994,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongScheduleAtType, global::TestScheduleIssues - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongScheduleAtType, global::TestScheduleIssues - >.DoIter(); + >.DoIter(__state); public global::TestScheduleIssues Insert(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongScheduleAtType, global::TestScheduleIssues - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestScheduleIssues row) => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongScheduleAtType, global::TestScheduleIssues - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestScheduleWithWrongScheduleAtType, global::TestScheduleIssues - >.DoClear(); + >.DoClear(__state); public sealed class IdCorrectTypeUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -3369,17 +4028,21 @@ public sealed class IdCorrectTypeUniqueIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongScheduleAtType_IdCorrectType_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdCorrectTypeUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal IdCorrectTypeUniqueIndex() - : base(__resolvedName) { } + internal IdCorrectTypeUniqueIndex( + int instanceId, + global::SpacetimeDB.Internal.TableHandle table + ) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongScheduleAtType_IdCorrectType_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -3387,11 +4050,11 @@ internal IdCorrectTypeUniqueIndex() public global::TestScheduleIssues? Find(int key) => FindSingle(key); public global::TestScheduleIssues Update(global::TestScheduleIssues row) => - DoUpdate(row); + DoUpdate(row, __table); } - private static IdCorrectTypeUniqueIndex? __IdCorrectType; - public IdCorrectTypeUniqueIndex IdCorrectType => __IdCorrectType ??= new(); + public IdCorrectTypeUniqueIndex IdCorrectType => + __state.__index_IdCorrectType ??= new(__state.InstanceId, __state); } public readonly struct TestUniqueNotEquatable @@ -3400,11 +4063,47 @@ public readonly struct TestUniqueNotEquatable global::TestUniqueNotEquatable > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestUniqueNotEquatable" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestUniqueNotEquatable" + ) + ) + { + internal readonly int InstanceId = instanceId; + internal PrimaryKeyFieldUniqueIndex? __index_PrimaryKeyField; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static TestUniqueNotEquatable() { } + + public TestUniqueNotEquatable() + : this(__GetInstance(0).__state) { } + + private TestUniqueNotEquatable(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestUniqueNotEquatable __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::TestUniqueNotEquatable ReadGenFields( System.IO.BinaryReader reader, @@ -3465,31 +4164,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< TestUniqueNotEquatable, global::TestUniqueNotEquatable - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< TestUniqueNotEquatable, global::TestUniqueNotEquatable - >.DoIter(); + >.DoIter(__state); public global::TestUniqueNotEquatable Insert(global::TestUniqueNotEquatable row) => global::SpacetimeDB.Internal.ITableView< TestUniqueNotEquatable, global::TestUniqueNotEquatable - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::TestUniqueNotEquatable row) => global::SpacetimeDB.Internal.ITableView< TestUniqueNotEquatable, global::TestUniqueNotEquatable - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< TestUniqueNotEquatable, global::TestUniqueNotEquatable - >.DoClear(); + >.DoClear(__state); public sealed class PrimaryKeyFieldUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -3499,17 +4198,21 @@ public sealed class PrimaryKeyFieldUniqueIndex SpacetimeDB.BSATN.Enum > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestUniqueNotEquatable_PrimaryKeyField_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static PrimaryKeyFieldUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal PrimaryKeyFieldUniqueIndex() - : base(__resolvedName) { } + internal PrimaryKeyFieldUniqueIndex( + int instanceId, + global::SpacetimeDB.Internal.TableHandle table + ) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestUniqueNotEquatable_PrimaryKeyField_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -3518,11 +4221,11 @@ internal PrimaryKeyFieldUniqueIndex() FindSingle(key); public global::TestUniqueNotEquatable Update(global::TestUniqueNotEquatable row) => - DoUpdate(row); + DoUpdate(row, __table); } - private static PrimaryKeyFieldUniqueIndex? __PrimaryKeyField; - public PrimaryKeyFieldUniqueIndex PrimaryKeyField => __PrimaryKeyField ??= new(); + public PrimaryKeyFieldUniqueIndex PrimaryKeyField => + __state.__index_PrimaryKeyField ??= new(__state.InstanceId, __state); } } @@ -4261,17 +4964,33 @@ namespace SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles public sealed class PlayerReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player" - ); + private static readonly PlayerReadOnly?[] __instances = new PlayerReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static PlayerReadOnly() { } - internal PlayerReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static PlayerReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static PlayerReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal PlayerReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "Player")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4289,39 +5008,52 @@ public sealed class IdentityIndex SpacetimeDB.Identity.BSATN > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "Player_Identity_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdentityIndex() { } - - internal IdentityIndex() - : base(__resolvedName) { } + internal IdentityIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "Player_Identity_idx_btree" + ) + ) { } public global::Player? Find(SpacetimeDB.Identity key) => FindSingle(key); } - private static IdentityIndex? __Identity; - public IdentityIndex Identity => __Identity ??= new(); + private IdentityIndex? __Identity; + public IdentityIndex Identity => __Identity ??= new(__instanceId); } public sealed class TestAutoIncNotIntegerReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestAutoIncNotInteger" - ); + private static readonly TestAutoIncNotIntegerReadOnly?[] __instances = + new TestAutoIncNotIntegerReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestAutoIncNotIntegerReadOnly() { } - internal TestAutoIncNotIntegerReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestAutoIncNotIntegerReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestAutoIncNotIntegerReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestAutoIncNotIntegerReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "TestAutoIncNotInteger") + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4339,39 +5071,55 @@ public sealed class IdentityFieldIndex SpacetimeDB.BSATN.String > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestAutoIncNotInteger_IdentityField_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdentityFieldIndex() { } - - internal IdentityFieldIndex() - : base(__resolvedName) { } + internal IdentityFieldIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestAutoIncNotInteger_IdentityField_idx_btree" + ) + ) { } public global::TestAutoIncNotInteger? Find(string key) => FindSingle(key); } - private static IdentityFieldIndex? __IdentityField; - public IdentityFieldIndex IdentityField => __IdentityField ??= new(); + private IdentityFieldIndex? __IdentityField; + public IdentityFieldIndex IdentityField => __IdentityField ??= new(__instanceId); } public sealed class TestDefaultFieldValuesReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestDefaultFieldValues" - ); + private static readonly TestDefaultFieldValuesReadOnly?[] __instances = + new TestDefaultFieldValuesReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestDefaultFieldValuesReadOnly() { } - internal TestDefaultFieldValuesReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestDefaultFieldValuesReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestDefaultFieldValuesReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestDefaultFieldValuesReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestDefaultFieldValues" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4385,17 +5133,37 @@ internal TestDefaultFieldValuesReadOnly() public sealed class TestDuplicateTableNameReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestDuplicateTableName" - ); + private static readonly TestDuplicateTableNameReadOnly?[] __instances = + new TestDuplicateTableNameReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestDuplicateTableNameReadOnly() { } - internal TestDuplicateTableNameReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestDuplicateTableNameReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestDuplicateTableNameReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestDuplicateTableNameReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestDuplicateTableName" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4409,17 +5177,32 @@ internal TestDuplicateTableNameReadOnly() public sealed class TestIndexIssuesReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues" - ); + private static readonly TestIndexIssuesReadOnly?[] __instances = + new TestIndexIssuesReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestIndexIssuesReadOnly() { } - internal TestIndexIssuesReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestIndexIssuesReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestIndexIssuesReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestIndexIssuesReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "TestIndexIssues")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4432,76 +5215,61 @@ internal TestIndexIssuesReadOnly() public sealed class TestIndexWithoutColumnsIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestIndexWithoutColumnsIndex() { } - - internal TestIndexWithoutColumnsIndex() - : base(__resolvedName) { } + internal TestIndexWithoutColumnsIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues__idx_btree" + ) + ) { } } - private static TestIndexWithoutColumnsIndex? __TestIndexWithoutColumns; + private TestIndexWithoutColumnsIndex? __TestIndexWithoutColumns; public TestIndexWithoutColumnsIndex TestIndexWithoutColumns => - __TestIndexWithoutColumns ??= new(); + __TestIndexWithoutColumns ??= new(__instanceId); public sealed class TestIndexWithEmptyColumnsIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestIndexWithEmptyColumnsIndex() { } - - internal TestIndexWithEmptyColumnsIndex() - : base(__resolvedName) { } + internal TestIndexWithEmptyColumnsIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues__idx_btree" + ) + ) { } } - private static TestIndexWithEmptyColumnsIndex? __TestIndexWithEmptyColumns; + private TestIndexWithEmptyColumnsIndex? __TestIndexWithEmptyColumns; public TestIndexWithEmptyColumnsIndex TestIndexWithEmptyColumns => - __TestIndexWithEmptyColumns ??= new(); + __TestIndexWithEmptyColumns ??= new(__instanceId); public sealed class TestUnknownColumnsIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues__idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUnknownColumnsIndex() { } - - internal TestUnknownColumnsIndex() - : base(__resolvedName) { } + internal TestUnknownColumnsIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues__idx_btree" + ) + ) { } } - private static TestUnknownColumnsIndex? __TestUnknownColumns; - public TestUnknownColumnsIndex TestUnknownColumns => __TestUnknownColumns ??= new(); + private TestUnknownColumnsIndex? __TestUnknownColumns; + public TestUnknownColumnsIndex TestUnknownColumns => + __TestUnknownColumns ??= new(__instanceId); public sealed class SelfIndexingColumnIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues_SelfIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static SelfIndexingColumnIndex() { } - - internal SelfIndexingColumnIndex() - : base(__resolvedName) { } + internal SelfIndexingColumnIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues_SelfIndexingColumn_idx_btree" + ) + ) { } public IEnumerable Filter(int SelfIndexingColumn) => DoFilter( @@ -4520,23 +5288,20 @@ internal SelfIndexingColumnIndex() ); } - private static SelfIndexingColumnIndex? __SelfIndexingColumn; - public SelfIndexingColumnIndex SelfIndexingColumn => __SelfIndexingColumn ??= new(); + private SelfIndexingColumnIndex? __SelfIndexingColumn; + public SelfIndexingColumnIndex SelfIndexingColumn => + __SelfIndexingColumn ??= new(__instanceId); public sealed class SecondaryIndexingColumnIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues_SecondaryIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static SecondaryIndexingColumnIndex() { } - - internal SecondaryIndexingColumnIndex() - : base(__resolvedName) { } + internal SecondaryIndexingColumnIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues_SecondaryIndexingColumn_idx_btree" + ) + ) { } public IEnumerable Filter(int SecondaryIndexingColumn) => DoFilter( @@ -4555,24 +5320,20 @@ internal SecondaryIndexingColumnIndex() ); } - private static SecondaryIndexingColumnIndex? __SecondaryIndexingColumn; + private SecondaryIndexingColumnIndex? __SecondaryIndexingColumn; public SecondaryIndexingColumnIndex SecondaryIndexingColumn => - __SecondaryIndexingColumn ??= new(); + __SecondaryIndexingColumn ??= new(__instanceId); public sealed class TestUnexpectedColumnsIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestIndexIssues_SelfIndexingColumn_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static TestUnexpectedColumnsIndex() { } - - internal TestUnexpectedColumnsIndex() - : base(__resolvedName) { } + internal TestUnexpectedColumnsIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestIndexIssues_SelfIndexingColumn_idx_btree" + ) + ) { } public IEnumerable Filter(int SelfIndexingColumn) => DoFilter( @@ -4591,25 +5352,50 @@ internal TestUnexpectedColumnsIndex() ); } - private static TestUnexpectedColumnsIndex? __TestUnexpectedColumns; + private TestUnexpectedColumnsIndex? __TestUnexpectedColumns; public TestUnexpectedColumnsIndex TestUnexpectedColumns => - __TestUnexpectedColumns ??= new(); + __TestUnexpectedColumns ??= new(__instanceId); } public sealed class TestScheduleWithMissingScheduleAtFieldReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithMissingScheduleAtField" - ); + private static readonly TestScheduleWithMissingScheduleAtFieldReadOnly?[] __instances = + new TestScheduleWithMissingScheduleAtFieldReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestScheduleWithMissingScheduleAtFieldReadOnly() { } - internal TestScheduleWithMissingScheduleAtFieldReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithMissingScheduleAtFieldReadOnly __GetInstance( + int contextInstance + ) => __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestScheduleWithMissingScheduleAtFieldReadOnly __CreateInstance( + int contextInstance + ) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestScheduleWithMissingScheduleAtFieldReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithMissingScheduleAtField" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4623,17 +5409,39 @@ internal TestScheduleWithMissingScheduleAtFieldReadOnly() public sealed class TestScheduleWithoutPrimaryKeyReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutPrimaryKey" - ); + private static readonly TestScheduleWithoutPrimaryKeyReadOnly?[] __instances = + new TestScheduleWithoutPrimaryKeyReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestScheduleWithoutPrimaryKeyReadOnly() { } - internal TestScheduleWithoutPrimaryKeyReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithoutPrimaryKeyReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestScheduleWithoutPrimaryKeyReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestScheduleWithoutPrimaryKeyReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutPrimaryKey" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4647,17 +5455,39 @@ internal TestScheduleWithoutPrimaryKeyReadOnly() public sealed class TestScheduleWithoutScheduleAtReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutScheduleAt" - ); + private static readonly TestScheduleWithoutScheduleAtReadOnly?[] __instances = + new TestScheduleWithoutScheduleAtReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestScheduleWithoutScheduleAtReadOnly() { } - internal TestScheduleWithoutScheduleAtReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithoutScheduleAtReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestScheduleWithoutScheduleAtReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestScheduleWithoutScheduleAtReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutScheduleAt" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4675,39 +5505,60 @@ public sealed class IdCorrectTypeIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithoutScheduleAt_IdCorrectType_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdCorrectTypeIndex() { } - - internal IdCorrectTypeIndex() - : base(__resolvedName) { } + internal IdCorrectTypeIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithoutScheduleAt_IdCorrectType_idx_btree" + ) + ) { } public global::TestScheduleIssues? Find(int key) => FindSingle(key); } - private static IdCorrectTypeIndex? __IdCorrectType; - public IdCorrectTypeIndex IdCorrectType => __IdCorrectType ??= new(); + private IdCorrectTypeIndex? __IdCorrectType; + public IdCorrectTypeIndex IdCorrectType => __IdCorrectType ??= new(__instanceId); } public sealed class TestScheduleWithWrongPrimaryKeyTypeReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongPrimaryKeyType" - ); + private static readonly TestScheduleWithWrongPrimaryKeyTypeReadOnly?[] __instances = + new TestScheduleWithWrongPrimaryKeyTypeReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestScheduleWithWrongPrimaryKeyTypeReadOnly() { } - internal TestScheduleWithWrongPrimaryKeyTypeReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithWrongPrimaryKeyTypeReadOnly __GetInstance( + int contextInstance + ) => __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestScheduleWithWrongPrimaryKeyTypeReadOnly __CreateInstance( + int contextInstance + ) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestScheduleWithWrongPrimaryKeyTypeReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongPrimaryKeyType" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4725,39 +5576,60 @@ public sealed class IdWrongTypeIndex SpacetimeDB.BSATN.String > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongPrimaryKeyType_IdWrongType_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdWrongTypeIndex() { } - - internal IdWrongTypeIndex() - : base(__resolvedName) { } + internal IdWrongTypeIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongPrimaryKeyType_IdWrongType_idx_btree" + ) + ) { } public global::TestScheduleIssues? Find(string key) => FindSingle(key); } - private static IdWrongTypeIndex? __IdWrongType; - public IdWrongTypeIndex IdWrongType => __IdWrongType ??= new(); + private IdWrongTypeIndex? __IdWrongType; + public IdWrongTypeIndex IdWrongType => __IdWrongType ??= new(__instanceId); } public sealed class TestScheduleWithWrongScheduleAtTypeReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongScheduleAtType" - ); + private static readonly TestScheduleWithWrongScheduleAtTypeReadOnly?[] __instances = + new TestScheduleWithWrongScheduleAtTypeReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestScheduleWithWrongScheduleAtTypeReadOnly() { } - internal TestScheduleWithWrongScheduleAtTypeReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestScheduleWithWrongScheduleAtTypeReadOnly __GetInstance( + int contextInstance + ) => __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestScheduleWithWrongScheduleAtTypeReadOnly __CreateInstance( + int contextInstance + ) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestScheduleWithWrongScheduleAtTypeReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongScheduleAtType" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4775,39 +5647,55 @@ public sealed class IdCorrectTypeIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestScheduleWithWrongScheduleAtType_IdCorrectType_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdCorrectTypeIndex() { } - - internal IdCorrectTypeIndex() - : base(__resolvedName) { } + internal IdCorrectTypeIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestScheduleWithWrongScheduleAtType_IdCorrectType_idx_btree" + ) + ) { } public global::TestScheduleIssues? Find(int key) => FindSingle(key); } - private static IdCorrectTypeIndex? __IdCorrectType; - public IdCorrectTypeIndex IdCorrectType => __IdCorrectType ??= new(); + private IdCorrectTypeIndex? __IdCorrectType; + public IdCorrectTypeIndex IdCorrectType => __IdCorrectType ??= new(__instanceId); } public sealed class TestUniqueNotEquatableReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestUniqueNotEquatable" - ); + private static readonly TestUniqueNotEquatableReadOnly?[] __instances = + new TestUniqueNotEquatableReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static TestUniqueNotEquatableReadOnly() { } - internal TestUniqueNotEquatableReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static TestUniqueNotEquatableReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static TestUniqueNotEquatableReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal TestUniqueNotEquatableReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestUniqueNotEquatable" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -4825,24 +5713,20 @@ public sealed class PrimaryKeyFieldIndex SpacetimeDB.BSATN.Enum > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "TestUniqueNotEquatable_PrimaryKeyField_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static PrimaryKeyFieldIndex() { } - - internal PrimaryKeyFieldIndex() - : base(__resolvedName) { } + internal PrimaryKeyFieldIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "TestUniqueNotEquatable_PrimaryKeyField_idx_btree" + ) + ) { } public global::TestUniqueNotEquatable? Find(TestEnumWithExplicitValues key) => FindSingle(key); } - private static PrimaryKeyFieldIndex? __PrimaryKeyField; - public PrimaryKeyFieldIndex PrimaryKeyField => __PrimaryKeyField ??= new(); + private PrimaryKeyFieldIndex? __PrimaryKeyField; + public PrimaryKeyFieldIndex PrimaryKeyField => __PrimaryKeyField ??= new(__instanceId); } } @@ -4852,27 +5736,49 @@ namespace SpacetimeDB.Internal public sealed partial class LocalReadOnly { public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly Player => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.PlayerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly TestAutoIncNotInteger => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestAutoIncNotIntegerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly TestDefaultFieldValues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDefaultFieldValuesReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly TestDuplicateTableName => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestDuplicateTableNameReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly TestIndexIssues => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestIndexIssuesReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly TestScheduleWithMissingScheduleAtField => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithMissingScheduleAtFieldReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly TestScheduleWithoutPrimaryKey => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutPrimaryKeyReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly TestScheduleWithoutScheduleAt => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithoutScheduleAtReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly TestScheduleWithWrongPrimaryKeyType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongPrimaryKeyTypeReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly TestScheduleWithWrongScheduleAtType => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestScheduleWithWrongScheduleAtTypeReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly TestUniqueNotEquatable => - new(); + global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.ViewHandles.TestUniqueNotEquatableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } #endif @@ -5106,9 +6012,19 @@ internal static void Initialize() #if NET10_0_OR_GREATER global::SpacetimeDB.Internal.Module.InstallNamespaces( new global::SpacetimeDB.Internal.NamespaceRegistry( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - global::SpacetimeDB.CaseConversionPolicy.SnakeCase, - new (string, string, string?, global::SpacetimeDB.CaseConversionPolicy)[] { } + new (int, string, string?, global::SpacetimeDB.CaseConversionPolicy, string[])[] + { + ( + -1, + "", + null, + global::SpacetimeDB.CaseConversionPolicy.SnakeCase, + new string[] + { + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + } + ), + } ) ); global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.Register( @@ -5380,7 +6296,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_0( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5392,7 +6309,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5418,7 +6336,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_1( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5430,7 +6349,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5456,7 +6376,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_2( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5468,7 +6389,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5494,7 +6416,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_3( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5506,7 +6429,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5532,7 +6456,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_4( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5544,7 +6469,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5570,7 +6496,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_5( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5582,7 +6509,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5608,7 +6536,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_6( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5620,7 +6549,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5646,7 +6576,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_7( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -5658,7 +6589,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -5681,7 +6613,8 @@ private static SpacetimeDB.Internal.Errno __call_view_0( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5690,7 +6623,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5711,7 +6645,8 @@ private static SpacetimeDB.Internal.Errno __call_view_1( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5720,7 +6655,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5741,7 +6677,8 @@ private static SpacetimeDB.Internal.Errno __call_view_2( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5750,7 +6687,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5771,7 +6709,8 @@ private static SpacetimeDB.Internal.Errno __call_view_3( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5780,7 +6719,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5801,7 +6741,8 @@ private static SpacetimeDB.Internal.Errno __call_view_4( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5810,7 +6751,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5831,7 +6773,8 @@ private static SpacetimeDB.Internal.Errno __call_view_5( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5840,7 +6783,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5861,7 +6805,8 @@ private static SpacetimeDB.Internal.Errno __call_view_6( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5870,7 +6815,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5891,7 +6837,8 @@ private static SpacetimeDB.Internal.Errno __call_view_7( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5900,7 +6847,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5921,7 +6869,8 @@ private static SpacetimeDB.Internal.Errno __call_view_8( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5930,7 +6879,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5951,7 +6901,8 @@ private static SpacetimeDB.Internal.Errno __call_view_9( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5960,7 +6911,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -5981,7 +6933,8 @@ private static SpacetimeDB.Internal.Errno __call_view_10( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -5990,7 +6943,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -6014,7 +6968,8 @@ private static SpacetimeDB.Internal.Errno __call_view_11( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -6023,7 +6978,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -6040,12 +6996,13 @@ SpacetimeDB.Internal.BytesSink sink private static SpacetimeDB.Internal.Errno __call_view_anon_0( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(instanceId); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, ref anonymousViewArgsBuffer @@ -6064,12 +7021,13 @@ ref anonymousViewArgsBuffer private static SpacetimeDB.Internal.Errno __call_view_anon_1( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(instanceId); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, ref anonymousViewArgsBuffer @@ -6088,12 +7046,13 @@ ref anonymousViewArgsBuffer private static SpacetimeDB.Internal.Errno __call_view_anon_2( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(instanceId); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, ref anonymousViewArgsBuffer @@ -6112,12 +7071,13 @@ ref anonymousViewArgsBuffer private static SpacetimeDB.Internal.Errno __call_view_anon_3( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(instanceId); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, ref anonymousViewArgsBuffer @@ -6174,7 +7134,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + 0 ); localId -= global::SpacetimeDB .Generated @@ -6211,7 +7172,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalReducer( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => id switch { @@ -6224,7 +7186,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 1 => __call_reducer_1( sender_0, @@ -6235,7 +7198,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 2 => __call_reducer_2( sender_0, @@ -6246,7 +7210,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 3 => __call_reducer_3( sender_0, @@ -6257,7 +7222,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 4 => __call_reducer_4( sender_0, @@ -6268,7 +7234,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 5 => __call_reducer_5( sender_0, @@ -6279,7 +7246,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 6 => __call_reducer_6( sender_0, @@ -6290,7 +7258,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 7 => __call_reducer_7( sender_0, @@ -6301,7 +7270,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), _ => SpacetimeDB.Internal.Module.WriteReducerError( error, @@ -6350,7 +7320,8 @@ SpacetimeDB.Internal.BytesSink result_sink conn_id_1, timestamp, args, - result_sink + result_sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -6384,7 +7355,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalProcedure( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => id switch { @@ -6515,7 +7487,8 @@ SpacetimeDB.Internal.BytesSink sink sender_2, sender_3, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.ViewCount; return UnknownViewId(id); @@ -6531,22 +7504,23 @@ internal static SpacetimeDB.Internal.Errno CallLocalView( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { - 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink), - 1 => __call_view_1(sender_0, sender_1, sender_2, sender_3, args, sink), - 2 => __call_view_2(sender_0, sender_1, sender_2, sender_3, args, sink), - 3 => __call_view_3(sender_0, sender_1, sender_2, sender_3, args, sink), - 4 => __call_view_4(sender_0, sender_1, sender_2, sender_3, args, sink), - 5 => __call_view_5(sender_0, sender_1, sender_2, sender_3, args, sink), - 6 => __call_view_6(sender_0, sender_1, sender_2, sender_3, args, sink), - 7 => __call_view_7(sender_0, sender_1, sender_2, sender_3, args, sink), - 8 => __call_view_8(sender_0, sender_1, sender_2, sender_3, args, sink), - 9 => __call_view_9(sender_0, sender_1, sender_2, sender_3, args, sink), - 10 => __call_view_10(sender_0, sender_1, sender_2, sender_3, args, sink), - 11 => __call_view_11(sender_0, sender_1, sender_2, sender_3, args, sink), + 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 1 => __call_view_1(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 2 => __call_view_2(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 3 => __call_view_3(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 4 => __call_view_4(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 5 => __call_view_5(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 6 => __call_view_6(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 7 => __call_view_7(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 8 => __call_view_8(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 9 => __call_view_9(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 10 => __call_view_10(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 11 => __call_view_11(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), _ => UnknownViewId(id), }; @@ -6577,7 +7551,8 @@ SpacetimeDB.Internal.BytesSink sink return global::SpacetimeDB.Generated.diag_4F830E2879BB50E3.AssemblyDescriptor.CallLocalAnonymousView( localId, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -6593,14 +7568,15 @@ SpacetimeDB.Internal.BytesSink sink internal static SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { - 0 => __call_view_anon_0(args, sink), - 1 => __call_view_anon_1(args, sink), - 2 => __call_view_anon_2(args, sink), - 3 => __call_view_anon_3(args, sink), + 0 => __call_view_anon_0(args, sink, instanceId), + 1 => __call_view_anon_1(args, sink, instanceId), + 2 => __call_view_anon_2(args, sink, instanceId), + 3 => __call_view_anon_3(args, sink, instanceId), _ => UnknownAnonymousViewId(id), }; diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#InAnotherNamespace.TestDuplicateTableName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#InAnotherNamespace.TestDuplicateTableName.verified.cs index 482455c6030..6b9b22be980 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#InAnotherNamespace.TestDuplicateTableName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#InAnotherNamespace.TestDuplicateTableName.verified.cs @@ -8,6 +8,11 @@ partial struct TestDuplicateTableName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Player.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Player.verified.cs index cc56e15d179..9faab7a8291 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Player.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Player.verified.cs @@ -4,6 +4,11 @@ partial struct Player : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Identity = BSATN.IdentityRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.InAnotherNamespace.TestDuplicateReducerName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.InAnotherNamespace.TestDuplicateReducerName.verified.cs index f8fde775eba..4a97809eda5 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.InAnotherNamespace.TestDuplicateReducerName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.InAnotherNamespace.TestDuplicateReducerName.verified.cs @@ -6,29 +6,58 @@ partial class Reducers { partial class InAnotherNamespace { - private static class __ScheduleTestDuplicateReducerNameName + private static string __ScheduleTestDuplicateReducerNameName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestDuplicateReducerName), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestDuplicateReducerNameName, + stream + ); + } + + private static string?[] __ScheduleTestDuplicateReducerNameNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestDuplicateReducerNameName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestDuplicateReducerNameNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestDuplicateReducerName), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestDuplicateReducerNameName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName() + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestDuplicateReducerNameName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestDuplicateReducerNameName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // InAnotherNamespace } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.OnReducerWithReservedPrefix.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.OnReducerWithReservedPrefix.verified.cs index 6a8071fa8dd..a38169db7ce 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.OnReducerWithReservedPrefix.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.OnReducerWithReservedPrefix.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleOnReducerWithReservedPrefixName + private static string __ScheduleOnReducerWithReservedPrefixName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(OnReducerWithReservedPrefix), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateOnReducerWithReservedPrefix() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleOnReducerWithReservedPrefixName, + stream + ); + } + + private static string?[] __ScheduleOnReducerWithReservedPrefixNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleOnReducerWithReservedPrefixName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleOnReducerWithReservedPrefixNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(OnReducerWithReservedPrefix), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleOnReducerWithReservedPrefixName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateOnReducerWithReservedPrefix() + public static void VolatileNonatomicScheduleImmediateOnReducerWithReservedPrefix<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleOnReducerWithReservedPrefixName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleOnReducerWithReservedPrefixName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind1.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind1.verified.cs index 05e5e398cba..1dab24730b9 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind1.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind1.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleTestDuplicateReducerKind1Name + private static string __ScheduleTestDuplicateReducerKind1Name => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestDuplicateReducerKind1), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind1() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestDuplicateReducerKind1Name, + stream + ); + } + + private static string?[] __ScheduleTestDuplicateReducerKind1Names => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestDuplicateReducerKind1Name(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestDuplicateReducerKind1Names; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestDuplicateReducerKind1), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestDuplicateReducerKind1Name() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind1() + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind1<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestDuplicateReducerKind1Name(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestDuplicateReducerKind1Name.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind2.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind2.verified.cs index b1779d73fd8..aa5305fc66f 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind2.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerKind2.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleTestDuplicateReducerKind2Name + private static string __ScheduleTestDuplicateReducerKind2Name => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestDuplicateReducerKind2), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind2() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestDuplicateReducerKind2Name, + stream + ); + } + + private static string?[] __ScheduleTestDuplicateReducerKind2Names => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestDuplicateReducerKind2Name(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestDuplicateReducerKind2Names; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestDuplicateReducerKind2), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestDuplicateReducerKind2Name() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind2() + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerKind2<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestDuplicateReducerKind2Name(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestDuplicateReducerKind2Name.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerName.verified.cs index 865a64341ea..568781b36a9 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestDuplicateReducerName.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleTestDuplicateReducerNameName + private static string __ScheduleTestDuplicateReducerNameName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestDuplicateReducerName), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestDuplicateReducerNameName, + stream + ); + } + + private static string?[] __ScheduleTestDuplicateReducerNameNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestDuplicateReducerNameName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestDuplicateReducerNameNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestDuplicateReducerName), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestDuplicateReducerNameName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName() + public static void VolatileNonatomicScheduleImmediateTestDuplicateReducerName<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestDuplicateReducerNameName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestDuplicateReducerNameName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerReturnType.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerReturnType.verified.cs index 1bd50b93319..5eb6e9614a8 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerReturnType.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerReturnType.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleTestReducerReturnTypeName + private static string __ScheduleTestReducerReturnTypeName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestReducerReturnType), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestReducerReturnType() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestReducerReturnTypeName, + stream + ); + } + + private static string?[] __ScheduleTestReducerReturnTypeNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestReducerReturnTypeName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestReducerReturnTypeNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestReducerReturnType), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestReducerReturnTypeName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestReducerReturnType() + public static void VolatileNonatomicScheduleImmediateTestReducerReturnType<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestReducerReturnTypeName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestReducerReturnTypeName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerWithoutContext.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerWithoutContext.verified.cs index e1c79a74513..a82a0042b32 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerWithoutContext.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.TestReducerWithoutContext.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleTestReducerWithoutContextName + private static string __ScheduleTestReducerWithoutContextName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(TestReducerWithoutContext), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateTestReducerWithoutContext() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleTestReducerWithoutContextName, + stream + ); + } + + private static string?[] __ScheduleTestReducerWithoutContextNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleTestReducerWithoutContextName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleTestReducerWithoutContextNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(TestReducerWithoutContext), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleTestReducerWithoutContextName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateTestReducerWithoutContext() + public static void VolatileNonatomicScheduleImmediateTestReducerWithoutContext<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleTestReducerWithoutContextName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleTestReducerWithoutContextName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.__ReducerWithReservedPrefix.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.__ReducerWithReservedPrefix.verified.cs index e6bc0fee962..fdbccab03cf 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.__ReducerWithReservedPrefix.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#Reducers.__ReducerWithReservedPrefix.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __Schedule__ReducerWithReservedPrefixName + private static string __Schedule__ReducerWithReservedPrefixName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(__ReducerWithReservedPrefix), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediate__ReducerWithReservedPrefix() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __Schedule__ReducerWithReservedPrefixName, + stream + ); + } + + private static string?[] __Schedule__ReducerWithReservedPrefixNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveSchedule__ReducerWithReservedPrefixName(int contextInstance) { - internal static readonly string Name = + var names = __Schedule__ReducerWithReservedPrefixNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(__ReducerWithReservedPrefix), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __Schedule__ReducerWithReservedPrefixName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediate__ReducerWithReservedPrefix() + public static void VolatileNonatomicScheduleImmediate__ReducerWithReservedPrefix<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveSchedule__ReducerWithReservedPrefixName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __Schedule__ReducerWithReservedPrefixName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestAutoIncNotInteger.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestAutoIncNotInteger.verified.cs index 4ca65c38535..b282fdf2915 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestAutoIncNotInteger.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestAutoIncNotInteger.verified.cs @@ -6,6 +6,11 @@ partial struct TestAutoIncNotInteger : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { AutoIncField = BSATN.AutoIncFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDefaultFieldValues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDefaultFieldValues.verified.cs index a67e17e0b9f..688323cb2af 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDefaultFieldValues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDefaultFieldValues.verified.cs @@ -6,6 +6,11 @@ partial struct TestDefaultFieldValues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { UniqueField = BSATN.UniqueFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDuplicateTableName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDuplicateTableName.verified.cs index ae2c3d77112..c3623ec1190 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDuplicateTableName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestDuplicateTableName.verified.cs @@ -6,6 +6,11 @@ partial struct TestDuplicateTableName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestIndexIssues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestIndexIssues.verified.cs index 15d297b7718..7d70fac6719 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestIndexIssues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestIndexIssues.verified.cs @@ -6,6 +6,11 @@ partial struct TestIndexIssues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { SelfIndexingColumn = BSATN.SelfIndexingColumnRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.DummyScheduledReducer.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.DummyScheduledReducer.verified.cs index 58d0fe081e9..7fbafd509d9 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.DummyScheduledReducer.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.DummyScheduledReducer.verified.cs @@ -4,30 +4,60 @@ partial struct TestScheduleIssues { - private static class __ScheduleDummyScheduledReducerName + private static string __ScheduleDummyScheduledReducerName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(DummyScheduledReducer), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateDummyScheduledReducer( + TestScheduleIssues table + ) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new TestScheduleIssues.BSATN().Write(writer, table); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleDummyScheduledReducerName, + stream + ); + } + + private static string?[] __ScheduleDummyScheduledReducerNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleDummyScheduledReducerName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleDummyScheduledReducerNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "diag, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(DummyScheduledReducer), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleDummyScheduledReducerName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateDummyScheduledReducer( + public static void VolatileNonatomicScheduleImmediateDummyScheduledReducer<__Context>( + __Context __context, TestScheduleIssues table ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleDummyScheduledReducerName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new TestScheduleIssues.BSATN().Write(writer, table); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleDummyScheduledReducerName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // TestScheduleIssues diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.verified.cs index 0da56ed822b..722c33570ce 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestScheduleIssues.verified.cs @@ -6,6 +6,11 @@ partial struct TestScheduleIssues : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IdWrongType = BSATN.IdWrongTypeRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestUniqueNotEquatable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestUniqueNotEquatable.verified.cs index 7fa75d478b4..2823dcbeee5 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestUniqueNotEquatable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module.net10#TestUniqueNotEquatable.verified.cs @@ -6,6 +6,11 @@ partial struct TestUniqueNotEquatable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { UniqueField = BSATN.UniqueFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#MyStruct.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#MyStruct.verified.cs index d41bd1df0bd..f75a0bcc61e 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#MyStruct.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#MyStruct.verified.cs @@ -4,6 +4,11 @@ partial struct MyStruct : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { x = BSATN.xRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKey.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKey.verified.cs index 3c5c4700782..0dabc3ad156 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKey.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKey.verified.cs @@ -6,6 +6,11 @@ partial struct NonEquatableViewPrimaryKey : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Value = BSATN.ValueRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKeyRow.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKeyRow.verified.cs index e4a37e29e26..4caac16ae4f 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKeyRow.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#NonEquatableViewPrimaryKeyRow.verified.cs @@ -6,6 +6,11 @@ partial struct NonEquatableViewPrimaryKeyRow : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Identity = BSATN.IdentityRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestTypeParams_T_.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestTypeParams_T_.verified.cs index 48ded971195..de44f1011df 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestTypeParams_T_.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestTypeParams_T_.verified.cs @@ -6,6 +6,11 @@ partial struct TestTypeParams : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Field = BSATN.FieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestUnsupportedType.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestUnsupportedType.verified.cs index 26f96aa523a..dded4e4a758 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestUnsupportedType.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#TestUnsupportedType.verified.cs @@ -6,6 +6,11 @@ partial struct TestUnsupportedType : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { UnsupportedSpecialType = BSATN.UnsupportedSpecialTypeRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyPartialRow.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyPartialRow.verified.cs index c00b86c2f7d..02583908a46 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyPartialRow.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyPartialRow.verified.cs @@ -6,6 +6,11 @@ partial class ViewPrimaryKeyPartialRow : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { DeclaredIdentity = BSATN.DeclaredIdentityRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyRenamedRow.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyRenamedRow.verified.cs index 26ce9b96b30..955b96b470f 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyRenamedRow.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Type#ViewPrimaryKeyRenamedRow.verified.cs @@ -6,6 +6,11 @@ partial struct ViewPrimaryKeyRenamedRow : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { RenamedIdentity = BSATN.RenamedIdentityRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#DemoTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#DemoTable.verified.cs index 70e83f0b277..ffb02368870 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#DemoTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#DemoTable.verified.cs @@ -4,6 +4,11 @@ partial struct DemoTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs index e8a1ccad5c7..4392b61b29a 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module#FFI.verified.cs @@ -491,16 +491,26 @@ internal DemoTableIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class DemoTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable" - ); + private static global::SpacetimeDB.SqlTableName?[] DemoTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static DemoTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName DemoTableSqlName(int contextInstance) + { + var names = DemoTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "DemoTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -511,7 +521,7 @@ public readonly partial struct Queries DemoTableIxCols > DemoTable() { - var tableName = DemoTableSqlNameCache.Name; + var tableName = DemoTableSqlName(__instanceId); return new(tableName, new DemoTableCols(tableName), new DemoTableIxCols(tableName)); } } @@ -525,7 +535,10 @@ public static partial class QueryTableExtensions global::DemoTable, DemoTableCols, DemoTableIxCols - > DemoTable() => new AssemblyDescriptor.Queries().DemoTable(); + > DemoTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).DemoTable(); } } } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#DemoTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#DemoTable.verified.cs index 70e83f0b277..ffb02368870 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#DemoTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#DemoTable.verified.cs @@ -4,6 +4,11 @@ partial struct DemoTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#FFI.verified.cs index b235a052d13..0cfc7d3e62d 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#FFI.verified.cs @@ -286,7 +286,9 @@ internal HandlerTxContext(Internal.TxContext inner) public sealed class Local : global::SpacetimeDB.LocalBase { public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } public sealed record ViewContext : DbContext, Internal.IViewContext @@ -339,7 +341,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink error + global::SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalReducer( id, @@ -351,7 +354,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - error + error, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalProcedure( @@ -364,7 +368,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink result_sink + global::SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalProcedure( id, @@ -376,7 +381,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - result_sink + result_sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalHttpHandler( @@ -413,7 +419,8 @@ public static partial class AssemblyDescriptor ulong sender_2, ulong sender_3, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalView( id, @@ -422,31 +429,59 @@ public static partial class AssemblyDescriptor sender_2, sender_3, args, - sink + sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink - ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink); + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 + ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink, instanceId); public static void Register(global::SpacetimeDB.Internal.ModuleBuilder builder) => global::ModuleRegistration.Register(builder); public readonly struct Tables { + private readonly int __instanceId; + + public Tables(int instanceId) + { + __instanceId = instanceId; + } + public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable.__GetInstance( + __instanceId + ); } public readonly struct ReadOnlyTables { + private readonly int __instanceId; + + public ReadOnlyTables(int instanceId) + { + __instanceId = instanceId; + } + public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly.__GetInstance( + __instanceId + ); } - public readonly partial struct Queries { } + public readonly partial struct Queries + { + private readonly int __instanceId; + + public Queries(int instanceId) + { + __instanceId = instanceId; + } + } } public static class LocalTableExtensions @@ -454,7 +489,9 @@ public static class LocalTableExtensions extension(global::SpacetimeDB.Local db) { public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles.DemoTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -463,7 +500,9 @@ public static class ReadOnlyTableExtensions extension(global::SpacetimeDB.Internal.LocalReadOnly db) { public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -496,16 +535,26 @@ internal DemoTableIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class DemoTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable" - ); + private static global::SpacetimeDB.SqlTableName?[] DemoTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static DemoTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName DemoTableSqlName(int contextInstance) + { + var names = DemoTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "DemoTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -516,7 +565,7 @@ public readonly partial struct Queries DemoTableIxCols > DemoTable() { - var tableName = DemoTableSqlNameCache.Name; + var tableName = DemoTableSqlName(__instanceId); return new(tableName, new DemoTableCols(tableName), new DemoTableIxCols(tableName)); } } @@ -530,7 +579,10 @@ public static partial class QueryTableExtensions global::DemoTable, DemoTableCols, DemoTableIxCols - > DemoTable() => new AssemblyDescriptor.Queries().DemoTable(); + > DemoTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).DemoTable(); } } } @@ -541,11 +593,45 @@ namespace SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.TableHandles public readonly struct DemoTable : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "DemoTable") + ) + { + internal readonly int InstanceId = instanceId; + internal IdUniqueIndex? __index_Id; + internal ByIdIndex? __index_ById; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static DemoTable() { } + + public DemoTable() + : this(__GetInstance(0).__state) { } + + private DemoTable(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static DemoTable __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::DemoTable ReadGenFields( System.IO.BinaryReader reader, @@ -599,19 +685,25 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount(__state); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter(__state); public global::DemoTable Insert(global::DemoTable row) => - global::SpacetimeDB.Internal.ITableView.DoInsert(row); + global::SpacetimeDB.Internal.ITableView.DoInsert( + row, + __state + ); public bool Delete(global::DemoTable row) => - global::SpacetimeDB.Internal.ITableView.DoDelete(row); + global::SpacetimeDB.Internal.ITableView.DoDelete( + row, + __state + ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear(__state); public sealed class IdUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -621,41 +713,37 @@ public sealed class IdUniqueIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable_Id_idx_btree" - ); + private readonly global::SpacetimeDB.Internal.TableHandle __table; - // Prevent eager initialization before the root installs namespace placements. - static IdUniqueIndex() { } - - internal IdUniqueIndex() - : base(__resolvedName) { } + internal IdUniqueIndex(int instanceId, global::SpacetimeDB.Internal.TableHandle table) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "DemoTable_Id_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public global::DemoTable? Find(int key) => FindSingle(key); - public global::DemoTable Update(global::DemoTable row) => DoUpdate(row); + public global::DemoTable Update(global::DemoTable row) => DoUpdate(row, __table); } - private static IdUniqueIndex? __Id; - public IdUniqueIndex Id => __Id ??= new(); + public IdUniqueIndex Id => __state.__index_Id ??= new(__state.InstanceId, __state); - public sealed class ByIdIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class ByIdIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "DemoTable_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static ByIdIndex() { } - + ) + ) + { public IEnumerable Filter(int Id) => DoFilter(new SpacetimeDB.Internal.BTreeIndexBounds(Id)); @@ -669,8 +757,7 @@ public ulong Delete(global::SpacetimeDB.Bound Id) => DoDelete(new SpacetimeDB.Internal.BTreeIndexBounds(Id)); } - private static ByIdIndex? __ById; - public ByIdIndex ById => __ById ??= new(); + public ByIdIndex ById => __state.__index_ById ??= new(__state.InstanceId); } } @@ -721,17 +808,33 @@ namespace SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles public sealed class DemoTableReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable" - ); + private static readonly DemoTableReadOnly?[] __instances = new DemoTableReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static DemoTableReadOnly() { } - internal DemoTableReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static DemoTableReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static DemoTableReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal DemoTableReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "DemoTable")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -749,38 +852,30 @@ public sealed class IdIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdIndex() { } - - internal IdIndex() - : base(__resolvedName) { } + internal IdIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "DemoTable_Id_idx_btree" + ) + ) { } public global::DemoTable? Find(int key) => FindSingle(key); } - private static IdIndex? __Id; - public IdIndex Id => __Id ??= new(); + private IdIndex? __Id; + public IdIndex Id => __Id ??= new(__instanceId); public sealed class ByIdIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "DemoTable_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static ByIdIndex() { } - - internal ByIdIndex() - : base(__resolvedName) { } + internal ByIdIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "DemoTable_Id_idx_btree" + ) + ) { } public IEnumerable Filter(int Id) => DoFilter( @@ -797,8 +892,8 @@ internal ByIdIndex() ); } - private static ByIdIndex? __ById; - public ByIdIndex ById => __ById ??= new(); + private ByIdIndex? __ById; + public ByIdIndex ById => __ById ??= new(__instanceId); } } @@ -808,7 +903,9 @@ namespace SpacetimeDB.Internal public sealed partial class LocalReadOnly { public global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly DemoTable => - new(); + global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.ViewHandles.DemoTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } #endif @@ -911,9 +1008,19 @@ internal static void Initialize() #if NET10_0_OR_GREATER global::SpacetimeDB.Internal.Module.InstallNamespaces( new global::SpacetimeDB.Internal.NamespaceRegistry( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - global::SpacetimeDB.CaseConversionPolicy.SnakeCase, - new (string, string, string?, global::SpacetimeDB.CaseConversionPolicy)[] { } + new (int, string, string?, global::SpacetimeDB.CaseConversionPolicy, string[])[] + { + ( + -1, + "", + null, + global::SpacetimeDB.CaseConversionPolicy.SnakeCase, + new string[] + { + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + } + ), + } ) ); global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.AssemblyDescriptor.Register( @@ -966,7 +1073,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_0( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -978,7 +1086,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -1004,7 +1113,8 @@ private static SpacetimeDB.Internal.Errno __call_procedure_0( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) { try @@ -1016,7 +1126,8 @@ SpacetimeDB.Internal.BytesSink result_sink sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -1041,7 +1152,8 @@ private static SpacetimeDB.Internal.Errno __call_view_0( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -1050,7 +1162,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -1109,7 +1222,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + 0 ); localId -= global::SpacetimeDB .Generated @@ -1146,7 +1260,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalReducer( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => id switch { @@ -1159,7 +1274,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), _ => SpacetimeDB.Internal.Module.WriteReducerError( error, @@ -1208,7 +1324,8 @@ SpacetimeDB.Internal.BytesSink result_sink conn_id_1, timestamp, args, - result_sink + result_sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -1242,7 +1359,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalProcedure( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => id switch { @@ -1255,7 +1373,8 @@ SpacetimeDB.Internal.BytesSink result_sink conn_id_1, timestamp, args, - result_sink + result_sink, + instanceId ), _ => throw new System.ArgumentOutOfRangeException( nameof(id), @@ -1389,7 +1508,8 @@ SpacetimeDB.Internal.BytesSink sink sender_2, sender_3, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -1409,11 +1529,12 @@ internal static SpacetimeDB.Internal.Errno CallLocalView( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { - 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink), + 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), _ => UnknownViewId(id), }; @@ -1444,7 +1565,8 @@ SpacetimeDB.Internal.BytesSink sink return global::SpacetimeDB.Generated.explicitnames_7C0F8C6449994F31.AssemblyDescriptor.CallLocalAnonymousView( localId, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -1460,7 +1582,8 @@ SpacetimeDB.Internal.BytesSink sink internal static SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoProcedure.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoProcedure.verified.cs index 4db9a55c612..5befcfbf24d 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoProcedure.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoProcedure.verified.cs @@ -4,28 +4,57 @@ partial class Reducers { - private static class __ScheduleDemoProcedureName + private static string __ScheduleDemoProcedureName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(DemoProcedure), + "canonical_procedure" + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateDemoProcedure() + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.ProcedureExtensions.VolatileNonatomicScheduleImmediate( + __ScheduleDemoProcedureName, + stream + ); + } + + private static string?[] __ScheduleDemoProcedureNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleDemoProcedureName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleDemoProcedureNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(DemoProcedure), "canonical_procedure" ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleDemoProcedureName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateDemoProcedure() + public static void VolatileNonatomicScheduleImmediateDemoProcedure<__Context>( + __Context __context + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleDemoProcedureName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); - SpacetimeDB.Internal.ProcedureExtensions.VolatileNonatomicScheduleImmediate( - __ScheduleDemoProcedureName.Name, - stream - ); + SpacetimeDB.Internal.ProcedureExtensions.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoReducer.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoReducer.verified.cs index 775f8b87ce6..db7c7d2f81c 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoReducer.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Module.net10#Reducers.DemoReducer.verified.cs @@ -4,28 +4,58 @@ partial class Reducers { - private static class __ScheduleDemoReducerName + private static string __ScheduleDemoReducerName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(DemoReducer), + "canonical_reducer" + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateDemoReducer(int value) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new SpacetimeDB.BSATN.I32().Write(writer, value); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleDemoReducerName, + stream + ); + } + + private static string?[] __ScheduleDemoReducerNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleDemoReducerName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleDemoReducerNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "explicitnames, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(DemoReducer), "canonical_reducer" ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleDemoReducerName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateDemoReducer(int value) + public static void VolatileNonatomicScheduleImmediateDemoReducer<__Context>( + __Context __context, + int value + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleDemoReducerName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new SpacetimeDB.BSATN.I32().Write(writer, value); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleDemoReducerName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Type#DemoType.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Type#DemoType.verified.cs index fc07188a018..2bc56c8ea19 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Type#DemoType.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/explicitnames/snapshots/Type#DemoType.verified.cs @@ -4,6 +4,11 @@ partial struct DemoType : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { A = BSATN.ARW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeMultiColumn.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeMultiColumn.verified.cs index 5d2f60ef5d0..7ac39a76e56 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeMultiColumn.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeMultiColumn.verified.cs @@ -6,6 +6,11 @@ partial struct BTreeMultiColumn : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { X = BSATN.XRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeViews.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeViews.verified.cs index a8484d534cd..02494efaa58 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeViews.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#BTreeViews.verified.cs @@ -4,6 +4,11 @@ partial struct BTreeViews : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index 28de19af09d..6f9d3e8fccc 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -999,16 +999,26 @@ internal BTreeMultiColumnIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class BTreeMultiColumnSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeMultiColumn" - ); + private static global::SpacetimeDB.SqlTableName?[] BTreeMultiColumnSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static BTreeMultiColumnSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName BTreeMultiColumnSqlName(int contextInstance) + { + var names = BTreeMultiColumnSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "BTreeMultiColumn"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1019,7 +1029,7 @@ public readonly partial struct Queries BTreeMultiColumnIxCols > BTreeMultiColumn() { - var tableName = BTreeMultiColumnSqlNameCache.Name; + var tableName = BTreeMultiColumnSqlName(__instanceId); return new( tableName, new BTreeMultiColumnCols(tableName), @@ -1037,7 +1047,10 @@ public static partial class QueryTableExtensions global::BTreeMultiColumn, BTreeMultiColumnCols, BTreeMultiColumnIxCols - > BTreeMultiColumn() => new AssemblyDescriptor.Queries().BTreeMultiColumn(); + > BTreeMultiColumn() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).BTreeMultiColumn(); } } @@ -1084,16 +1097,26 @@ internal BTreeViewsIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class BTreeViewsSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews" - ); + private static global::SpacetimeDB.SqlTableName?[] BTreeViewsSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static BTreeViewsSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName BTreeViewsSqlName(int contextInstance) + { + var names = BTreeViewsSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "BTreeViews"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1104,7 +1127,7 @@ public readonly partial struct Queries BTreeViewsIxCols > BTreeViews() { - var tableName = BTreeViewsSqlNameCache.Name; + var tableName = BTreeViewsSqlName(__instanceId); return new( tableName, new BTreeViewsCols(tableName), @@ -1122,7 +1145,10 @@ public static partial class QueryTableExtensions global::BTreeViews, BTreeViewsCols, BTreeViewsIxCols - > BTreeViews() => new AssemblyDescriptor.Queries().BTreeViews(); + > BTreeViews() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).BTreeViews(); } } @@ -1154,16 +1180,26 @@ internal MultiTable1IxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class MultiTable1SqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1" - ); + private static global::SpacetimeDB.SqlTableName?[] MultiTable1SqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static MultiTable1SqlNameCache() { } + private static global::SpacetimeDB.SqlTableName MultiTable1SqlName(int contextInstance) + { + var names = MultiTable1SqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "MultiTable1"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1174,7 +1210,7 @@ public readonly partial struct Queries MultiTable1IxCols > MultiTable1() { - var tableName = MultiTable1SqlNameCache.Name; + var tableName = MultiTable1SqlName(__instanceId); return new( tableName, new MultiTable1Cols(tableName), @@ -1192,7 +1228,10 @@ public static partial class QueryTableExtensions global::MultiTableRow, MultiTable1Cols, MultiTable1IxCols - > MultiTable1() => new AssemblyDescriptor.Queries().MultiTable1(); + > MultiTable1() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).MultiTable1(); } } @@ -1217,16 +1256,26 @@ internal MultiTable2IxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class MultiTable2SqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2" - ); + private static global::SpacetimeDB.SqlTableName?[] MultiTable2SqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static MultiTable2SqlNameCache() { } + private static global::SpacetimeDB.SqlTableName MultiTable2SqlName(int contextInstance) + { + var names = MultiTable2SqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "MultiTable2"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1237,7 +1286,7 @@ public readonly partial struct Queries MultiTable2IxCols > MultiTable2() { - var tableName = MultiTable2SqlNameCache.Name; + var tableName = MultiTable2SqlName(__instanceId); return new( tableName, new MultiTable2Cols(tableName), @@ -1255,7 +1304,10 @@ public static partial class QueryTableExtensions global::MultiTableRow, MultiTable2Cols, MultiTable2IxCols - > MultiTable2() => new AssemblyDescriptor.Queries().MultiTable2(); + > MultiTable2() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).MultiTable2(); } } @@ -1271,16 +1323,26 @@ internal PrivateTableIxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class PrivateTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PrivateTable" - ); + private static global::SpacetimeDB.SqlTableName?[] PrivateTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PrivateTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PrivateTableSqlName(int contextInstance) + { + var names = PrivateTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "PrivateTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1291,7 +1353,7 @@ public readonly partial struct Queries PrivateTableIxCols > PrivateTable() { - var tableName = PrivateTableSqlNameCache.Name; + var tableName = PrivateTableSqlName(__instanceId); return new( tableName, new PrivateTableCols(tableName), @@ -1309,7 +1371,10 @@ public static partial class QueryTableExtensions global::PrivateTable, PrivateTableCols, PrivateTableIxCols - > PrivateTable() => new AssemblyDescriptor.Queries().PrivateTable(); + > PrivateTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).PrivateTable(); } } @@ -1482,16 +1547,26 @@ internal PublicTableIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class PublicTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable" - ); + private static global::SpacetimeDB.SqlTableName?[] PublicTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PublicTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PublicTableSqlName(int contextInstance) + { + var names = PublicTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "PublicTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1502,7 +1577,7 @@ public readonly partial struct Queries PublicTableIxCols > PublicTable() { - var tableName = PublicTableSqlNameCache.Name; + var tableName = PublicTableSqlName(__instanceId); return new( tableName, new PublicTableCols(tableName), @@ -1520,7 +1595,10 @@ public static partial class QueryTableExtensions global::PublicTable, PublicTableCols, PublicTableIxCols - > PublicTable() => new AssemblyDescriptor.Queries().PublicTable(); + > PublicTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).PublicTable(); } } @@ -1559,16 +1637,31 @@ internal RegressionMultipleUniqueIndexesHadSameNameIxCols( public static partial class AssemblyDescriptor { - private static class RegressionMultipleUniqueIndexesHadSameNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] RegressionMultipleUniqueIndexesHadSameNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName RegressionMultipleUniqueIndexesHadSameNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = RegressionMultipleUniqueIndexesHadSameNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "RegressionMultipleUniqueIndexesHadSameName" ); - - // Prevent eager initialization before the root installs namespace placements. - static RegressionMultipleUniqueIndexesHadSameNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1579,7 +1672,7 @@ public readonly partial struct Queries RegressionMultipleUniqueIndexesHadSameNameIxCols > RegressionMultipleUniqueIndexesHadSameName() { - var tableName = RegressionMultipleUniqueIndexesHadSameNameSqlNameCache.Name; + var tableName = RegressionMultipleUniqueIndexesHadSameNameSqlName(__instanceId); return new( tableName, new RegressionMultipleUniqueIndexesHadSameNameCols(tableName), @@ -1598,7 +1691,9 @@ public static partial class QueryTableExtensions RegressionMultipleUniqueIndexesHadSameNameCols, RegressionMultipleUniqueIndexesHadSameNameIxCols > RegressionMultipleUniqueIndexesHadSameName() => - new AssemblyDescriptor.Queries().RegressionMultipleUniqueIndexesHadSameName(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).RegressionMultipleUniqueIndexesHadSameName(); } } @@ -1646,16 +1741,26 @@ internal SendMessageTimerIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class SendMessageTimerSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer" - ); + private static global::SpacetimeDB.SqlTableName?[] SendMessageTimerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static SendMessageTimerSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName SendMessageTimerSqlName(int contextInstance) + { + var names = SendMessageTimerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "SendMessageTimer"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1666,7 +1771,7 @@ public readonly partial struct Queries SendMessageTimerIxCols > SendMessageTimer() { - var tableName = SendMessageTimerSqlNameCache.Name; + var tableName = SendMessageTimerSqlName(__instanceId); return new( tableName, new SendMessageTimerCols(tableName), @@ -1684,7 +1789,10 @@ public static partial class QueryTableExtensions global::Timers.SendMessageTimer, SendMessageTimerCols, SendMessageTimerIxCols - > SendMessageTimer() => new AssemblyDescriptor.Queries().SendMessageTimer(); + > SendMessageTimer() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).SendMessageTimer(); } } } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#MultiTableRow.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#MultiTableRow.verified.cs index 6be9b6e344c..7d5502c57f7 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#MultiTableRow.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#MultiTableRow.verified.cs @@ -6,6 +6,11 @@ partial struct MultiTableRow : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Name = BSATN.NameRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PrivateTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PrivateTable.verified.cs index b05b2a0973f..50c222f060b 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PrivateTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PrivateTable.verified.cs @@ -4,6 +4,11 @@ partial class PrivateTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PublicTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PublicTable.verified.cs index 082565d5e11..6712b30caa1 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PublicTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#PublicTable.verified.cs @@ -4,6 +4,11 @@ partial struct PublicTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs index f06c4b9552c..f581dd3dff0 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#RegressionMultipleUniqueIndexesHadSameName.verified.cs @@ -6,6 +6,11 @@ partial struct RegressionMultipleUniqueIndexesHadSameName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Unique1 = BSATN.Unique1RW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#Timers.SendMessageTimer.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#Timers.SendMessageTimer.verified.cs index 2457217bd02..9b9097c1c97 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#Timers.SendMessageTimer.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#Timers.SendMessageTimer.verified.cs @@ -8,6 +8,11 @@ partial struct SendMessageTimer : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { ScheduledId = BSATN.ScheduledIdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeMultiColumn.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeMultiColumn.verified.cs index 5d2f60ef5d0..7ac39a76e56 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeMultiColumn.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeMultiColumn.verified.cs @@ -6,6 +6,11 @@ partial struct BTreeMultiColumn : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { X = BSATN.XRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeViews.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeViews.verified.cs index a8484d534cd..02494efaa58 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeViews.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#BTreeViews.verified.cs @@ -4,6 +4,11 @@ partial struct BTreeViews : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#FFI.verified.cs index 93a19e3ff69..5a3e74f8b8a 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#FFI.verified.cs @@ -728,21 +728,37 @@ internal HandlerTxContext(Internal.TxContext inner) public sealed class Local : global::SpacetimeDB.LocalBase { internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1 MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2 MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } public sealed record ViewContext : DbContext, Internal.IViewContext @@ -796,7 +812,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink error + global::SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalReducer( id, @@ -808,7 +825,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - error + error, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalProcedure( @@ -821,7 +839,8 @@ public static partial class AssemblyDescriptor ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink result_sink + global::SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalProcedure( id, @@ -833,7 +852,8 @@ public static partial class AssemblyDescriptor conn_id_1, timestamp, args, - result_sink + result_sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalHttpHandler( @@ -870,7 +890,8 @@ public static partial class AssemblyDescriptor ulong sender_2, ulong sender_3, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => global::ModuleRegistration.CallLocalView( id, @@ -879,59 +900,115 @@ public static partial class AssemblyDescriptor sender_2, sender_3, args, - sink + sink, + instanceId ); public static global::SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink - ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink); + global::SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 + ) => global::ModuleRegistration.CallLocalAnonymousView(id, args, sink, instanceId); public static void Register(global::SpacetimeDB.Internal.ModuleBuilder builder) => global::ModuleRegistration.Register(builder); public readonly struct Tables { + private readonly int __instanceId; + + public Tables(int instanceId) + { + __instanceId = instanceId; + } + internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn.__GetInstance( + __instanceId + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1 MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2 MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable.__GetInstance( + __instanceId + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer.__GetInstance( + __instanceId + ); } public readonly struct ReadOnlyTables { + private readonly int __instanceId; + + public ReadOnlyTables(int instanceId) + { + __instanceId = instanceId; + } + internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly.__GetInstance( + __instanceId + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly.__GetInstance( + __instanceId + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly.__GetInstance( + __instanceId + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly.__GetInstance( + __instanceId + ); } - public readonly partial struct Queries { } + public readonly partial struct Queries + { + private readonly int __instanceId; + + public Queries(int instanceId) + { + __instanceId = instanceId; + } + } } public static class LocalTableExtensions @@ -939,21 +1016,37 @@ public static class LocalTableExtensions extension(global::SpacetimeDB.Local db) { internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeMultiColumn.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.BTreeViews.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1 MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable1.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2 MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.MultiTable2.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PrivateTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.PublicTable.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.RegressionMultipleUniqueIndexesHadSameName.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles.SendMessageTimer.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -962,21 +1055,37 @@ public static class ReadOnlyTableExtensions extension(global::SpacetimeDB.Internal.LocalReadOnly db) { internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } @@ -1015,16 +1124,26 @@ internal BTreeMultiColumnIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class BTreeMultiColumnSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeMultiColumn" - ); + private static global::SpacetimeDB.SqlTableName?[] BTreeMultiColumnSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static BTreeMultiColumnSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName BTreeMultiColumnSqlName(int contextInstance) + { + var names = BTreeMultiColumnSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "BTreeMultiColumn"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1035,7 +1154,7 @@ public readonly partial struct Queries BTreeMultiColumnIxCols > BTreeMultiColumn() { - var tableName = BTreeMultiColumnSqlNameCache.Name; + var tableName = BTreeMultiColumnSqlName(__instanceId); return new( tableName, new BTreeMultiColumnCols(tableName), @@ -1053,7 +1172,10 @@ public static partial class QueryTableExtensions global::BTreeMultiColumn, BTreeMultiColumnCols, BTreeMultiColumnIxCols - > BTreeMultiColumn() => new AssemblyDescriptor.Queries().BTreeMultiColumn(); + > BTreeMultiColumn() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).BTreeMultiColumn(); } } @@ -1100,16 +1222,26 @@ internal BTreeViewsIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class BTreeViewsSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews" - ); + private static global::SpacetimeDB.SqlTableName?[] BTreeViewsSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static BTreeViewsSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName BTreeViewsSqlName(int contextInstance) + { + var names = BTreeViewsSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "BTreeViews"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1120,7 +1252,7 @@ public readonly partial struct Queries BTreeViewsIxCols > BTreeViews() { - var tableName = BTreeViewsSqlNameCache.Name; + var tableName = BTreeViewsSqlName(__instanceId); return new( tableName, new BTreeViewsCols(tableName), @@ -1138,7 +1270,10 @@ public static partial class QueryTableExtensions global::BTreeViews, BTreeViewsCols, BTreeViewsIxCols - > BTreeViews() => new AssemblyDescriptor.Queries().BTreeViews(); + > BTreeViews() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).BTreeViews(); } } @@ -1170,16 +1305,26 @@ internal MultiTable1IxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class MultiTable1SqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1" - ); + private static global::SpacetimeDB.SqlTableName?[] MultiTable1SqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static MultiTable1SqlNameCache() { } + private static global::SpacetimeDB.SqlTableName MultiTable1SqlName(int contextInstance) + { + var names = MultiTable1SqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "MultiTable1"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1190,7 +1335,7 @@ public readonly partial struct Queries MultiTable1IxCols > MultiTable1() { - var tableName = MultiTable1SqlNameCache.Name; + var tableName = MultiTable1SqlName(__instanceId); return new( tableName, new MultiTable1Cols(tableName), @@ -1208,7 +1353,10 @@ public static partial class QueryTableExtensions global::MultiTableRow, MultiTable1Cols, MultiTable1IxCols - > MultiTable1() => new AssemblyDescriptor.Queries().MultiTable1(); + > MultiTable1() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).MultiTable1(); } } @@ -1233,16 +1381,26 @@ internal MultiTable2IxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class MultiTable2SqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2" - ); + private static global::SpacetimeDB.SqlTableName?[] MultiTable2SqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static MultiTable2SqlNameCache() { } + private static global::SpacetimeDB.SqlTableName MultiTable2SqlName(int contextInstance) + { + var names = MultiTable2SqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "MultiTable2"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1253,7 +1411,7 @@ public readonly partial struct Queries MultiTable2IxCols > MultiTable2() { - var tableName = MultiTable2SqlNameCache.Name; + var tableName = MultiTable2SqlName(__instanceId); return new( tableName, new MultiTable2Cols(tableName), @@ -1271,7 +1429,10 @@ public static partial class QueryTableExtensions global::MultiTableRow, MultiTable2Cols, MultiTable2IxCols - > MultiTable2() => new AssemblyDescriptor.Queries().MultiTable2(); + > MultiTable2() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).MultiTable2(); } } @@ -1287,16 +1448,26 @@ internal PrivateTableIxCols(global::SpacetimeDB.SqlTableName tableName) { } public static partial class AssemblyDescriptor { - private static class PrivateTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PrivateTable" - ); + private static global::SpacetimeDB.SqlTableName?[] PrivateTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PrivateTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PrivateTableSqlName(int contextInstance) + { + var names = PrivateTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "PrivateTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1307,7 +1478,7 @@ public readonly partial struct Queries PrivateTableIxCols > PrivateTable() { - var tableName = PrivateTableSqlNameCache.Name; + var tableName = PrivateTableSqlName(__instanceId); return new( tableName, new PrivateTableCols(tableName), @@ -1325,7 +1496,10 @@ public static partial class QueryTableExtensions global::PrivateTable, PrivateTableCols, PrivateTableIxCols - > PrivateTable() => new AssemblyDescriptor.Queries().PrivateTable(); + > PrivateTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).PrivateTable(); } } @@ -1498,16 +1672,26 @@ internal PublicTableIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class PublicTableSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable" - ); + private static global::SpacetimeDB.SqlTableName?[] PublicTableSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static PublicTableSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName PublicTableSqlName(int contextInstance) + { + var names = PublicTableSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "PublicTable"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1518,7 +1702,7 @@ public readonly partial struct Queries PublicTableIxCols > PublicTable() { - var tableName = PublicTableSqlNameCache.Name; + var tableName = PublicTableSqlName(__instanceId); return new( tableName, new PublicTableCols(tableName), @@ -1536,7 +1720,10 @@ public static partial class QueryTableExtensions global::PublicTable, PublicTableCols, PublicTableIxCols - > PublicTable() => new AssemblyDescriptor.Queries().PublicTable(); + > PublicTable() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).PublicTable(); } } @@ -1575,16 +1762,31 @@ internal RegressionMultipleUniqueIndexesHadSameNameIxCols( public static partial class AssemblyDescriptor { - private static class RegressionMultipleUniqueIndexesHadSameNameSqlNameCache + private static global::SpacetimeDB.SqlTableName?[] RegressionMultipleUniqueIndexesHadSameNameSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + + private static global::SpacetimeDB.SqlTableName RegressionMultipleUniqueIndexesHadSameNameSqlName( + int contextInstance + ) { - internal static readonly global::SpacetimeDB.SqlTableName Name = + var names = RegressionMultipleUniqueIndexesHadSameNameSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "RegressionMultipleUniqueIndexesHadSameName" ); - - // Prevent eager initialization before the root installs namespace placements. - static RegressionMultipleUniqueIndexesHadSameNameSqlNameCache() { } + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1595,7 +1797,7 @@ public readonly partial struct Queries RegressionMultipleUniqueIndexesHadSameNameIxCols > RegressionMultipleUniqueIndexesHadSameName() { - var tableName = RegressionMultipleUniqueIndexesHadSameNameSqlNameCache.Name; + var tableName = RegressionMultipleUniqueIndexesHadSameNameSqlName(__instanceId); return new( tableName, new RegressionMultipleUniqueIndexesHadSameNameCols(tableName), @@ -1614,7 +1816,9 @@ public static partial class QueryTableExtensions RegressionMultipleUniqueIndexesHadSameNameCols, RegressionMultipleUniqueIndexesHadSameNameIxCols > RegressionMultipleUniqueIndexesHadSameName() => - new AssemblyDescriptor.Queries().RegressionMultipleUniqueIndexesHadSameName(); + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).RegressionMultipleUniqueIndexesHadSameName(); } } @@ -1662,16 +1866,26 @@ internal SendMessageTimerIxCols(global::SpacetimeDB.SqlTableName tableName) public static partial class AssemblyDescriptor { - private static class SendMessageTimerSqlNameCache - { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer" - ); + private static global::SpacetimeDB.SqlTableName?[] SendMessageTimerSqlNames => + field ??= new global::SpacetimeDB.SqlTableName?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; - // Prevent eager initialization before the root installs namespace placements. - static SendMessageTimerSqlNameCache() { } + private static global::SpacetimeDB.SqlTableName SendMessageTimerSqlName(int contextInstance) + { + var names = SendMessageTimerSqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + var resolvedName = names[instanceId] ??= + global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, "SendMessageTimer"); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries @@ -1682,7 +1896,7 @@ public readonly partial struct Queries SendMessageTimerIxCols > SendMessageTimer() { - var tableName = SendMessageTimerSqlNameCache.Name; + var tableName = SendMessageTimerSqlName(__instanceId); return new( tableName, new SendMessageTimerCols(tableName), @@ -1700,7 +1914,10 @@ public static partial class QueryTableExtensions global::Timers.SendMessageTimer, SendMessageTimerCols, SendMessageTimerIxCols - > SendMessageTimer() => new AssemblyDescriptor.Queries().SendMessageTimer(); + > SendMessageTimer() => + new AssemblyDescriptor.Queries( + global::SpacetimeDB.Internal.Module.GetInstanceId(from) + ).SendMessageTimer(); } } } @@ -1711,11 +1928,44 @@ namespace SpacetimeDB.Generated.server_D513E4815F57969C.TableHandles internal readonly struct BTreeMultiColumn : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeMultiColumn" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "BTreeMultiColumn") + ) + { + internal readonly int InstanceId = instanceId; + internal LocationIndex? __index_Location; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static BTreeMultiColumn() { } + + public BTreeMultiColumn() + : this(__GetInstance(0).__state) { } + + private BTreeMultiColumn(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static BTreeMultiColumn __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::BTreeMultiColumn ReadGenFields( System.IO.BinaryReader reader, @@ -1761,44 +2011,40 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< BTreeMultiColumn, global::BTreeMultiColumn - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< BTreeMultiColumn, global::BTreeMultiColumn - >.DoIter(); + >.DoIter(__state); public global::BTreeMultiColumn Insert(global::BTreeMultiColumn row) => global::SpacetimeDB.Internal.ITableView< BTreeMultiColumn, global::BTreeMultiColumn - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::BTreeMultiColumn row) => global::SpacetimeDB.Internal.ITableView< BTreeMultiColumn, global::BTreeMultiColumn - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< BTreeMultiColumn, global::BTreeMultiColumn - >.DoClear(); + >.DoClear(__state); - internal sealed class LocationIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + internal sealed class LocationIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "BTreeMultiColumn_X_Y_Z_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static LocationIndex() { } - + ) + ) + { public IEnumerable Filter(uint X) => DoFilter(new SpacetimeDB.Internal.BTreeIndexBounds(X)); @@ -1906,18 +2152,52 @@ public ulong Delete((uint X, uint Y, global::SpacetimeDB.Bound Z) f) => ); } - private static LocationIndex? __Location; - internal LocationIndex Location => __Location ??= new(); + internal LocationIndex Location => __state.__index_Location ??= new(__state.InstanceId); } internal readonly struct BTreeViews : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "BTreeViews") + ) + { + internal readonly int InstanceId = instanceId; + internal IdUniqueIndex? __index_Id; + internal LocationIndex? __index_Location; + internal FactionIndex? __index_Faction; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static BTreeViews() { } + + public BTreeViews() + : this(__GetInstance(0).__state) { } + + private BTreeViews(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static BTreeViews __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::BTreeViews ReadGenFields( System.IO.BinaryReader reader, @@ -1976,19 +2256,29 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount( + __state + ); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter(__state); public global::BTreeViews Insert(global::BTreeViews row) => - global::SpacetimeDB.Internal.ITableView.DoInsert(row); + global::SpacetimeDB.Internal.ITableView.DoInsert( + row, + __state + ); public bool Delete(global::BTreeViews row) => - global::SpacetimeDB.Internal.ITableView.DoDelete(row); + global::SpacetimeDB.Internal.ITableView.DoDelete( + row, + __state + ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear( + __state + ); internal sealed class IdUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -1998,41 +2288,37 @@ internal sealed class IdUniqueIndex SpacetimeDB.Identity.BSATN > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews_Id_idx_btree" - ); + private readonly global::SpacetimeDB.Internal.TableHandle __table; - // Prevent eager initialization before the root installs namespace placements. - static IdUniqueIndex() { } - - internal IdUniqueIndex() - : base(__resolvedName) { } + internal IdUniqueIndex(int instanceId, global::SpacetimeDB.Internal.TableHandle table) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "BTreeViews_Id_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public global::BTreeViews? Find(SpacetimeDB.Identity key) => FindSingle(key); - public global::BTreeViews Update(global::BTreeViews row) => DoUpdate(row); + public global::BTreeViews Update(global::BTreeViews row) => DoUpdate(row, __table); } - private static IdUniqueIndex? __Id; - internal IdUniqueIndex Id => __Id ??= new(); + internal IdUniqueIndex Id => __state.__index_Id ??= new(__state.InstanceId, __state); - internal sealed class LocationIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + internal sealed class LocationIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "BTreeViews_X_Y_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static LocationIndex() { } - + ) + ) + { public IEnumerable Filter(uint X) => DoFilter(new SpacetimeDB.Internal.BTreeIndexBounds(X)); @@ -2088,21 +2374,16 @@ public ulong Delete((uint X, global::SpacetimeDB.Bound Y) f) => ); } - private static LocationIndex? __Location; - internal LocationIndex Location => __Location ??= new(); + internal LocationIndex Location => __state.__index_Location ??= new(__state.InstanceId); - internal sealed class FactionIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + internal sealed class FactionIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "BTreeViews_Faction_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static FactionIndex() { } - + ) + ) + { public IEnumerable Filter(string Faction) => DoFilter( new SpacetimeDB.Internal.BTreeIndexBounds( @@ -2134,18 +2415,51 @@ public ulong Delete(global::SpacetimeDB.Bound Faction) => ); } - private static FactionIndex? __Faction; - internal FactionIndex Faction => __Faction ??= new(); + internal FactionIndex Faction => __state.__index_Faction ??= new(__state.InstanceId); } public readonly struct MultiTable1 : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "MultiTable1") + ) + { + internal readonly int InstanceId = instanceId; + internal FooUniqueIndex? __index_Foo; + internal NameIndex? __index_Name; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static MultiTable1() { } + + public MultiTable1() + : this(__GetInstance(0).__state) { } + + private MultiTable1(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static MultiTable1 __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::MultiTableRow ReadGenFields( System.IO.BinaryReader reader, @@ -2209,23 +2523,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount( + __state + ); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter( + __state + ); public global::MultiTableRow Insert(global::MultiTableRow row) => global::SpacetimeDB.Internal.ITableView.DoInsert( - row + row, + __state ); public bool Delete(global::MultiTableRow row) => global::SpacetimeDB.Internal.ITableView.DoDelete( - row + row, + __state ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear( + __state + ); public sealed class FooUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2235,41 +2557,38 @@ public sealed class FooUniqueIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1_Foo_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static FooUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal FooUniqueIndex() - : base(__resolvedName) { } + internal FooUniqueIndex(int instanceId, global::SpacetimeDB.Internal.TableHandle table) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "MultiTable1_Foo_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public global::MultiTableRow? Find(uint key) => FindSingle(key); - public global::MultiTableRow Update(global::MultiTableRow row) => DoUpdate(row); + public global::MultiTableRow Update(global::MultiTableRow row) => + DoUpdate(row, __table); } - private static FooUniqueIndex? __Foo; - public FooUniqueIndex Foo => __Foo ??= new(); + public FooUniqueIndex Foo => __state.__index_Foo ??= new(__state.InstanceId, __state); - public sealed class NameIndex() - : SpacetimeDB.Internal.IndexBase(__resolvedName) - { - private static readonly string __resolvedName = + public sealed class NameIndex(int instanceId) + : SpacetimeDB.Internal.IndexBase( global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instanceId, "MultiTable1_Name_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static NameIndex() { } - + ) + ) + { public IEnumerable Filter(string Name) => DoFilter( new SpacetimeDB.Internal.BTreeIndexBounds( @@ -2301,18 +2620,50 @@ public ulong Delete(global::SpacetimeDB.Bound Name) => ); } - private static NameIndex? __Name; - public NameIndex Name => __Name ??= new(); + public NameIndex Name => __state.__index_Name ??= new(__state.InstanceId); } public readonly struct MultiTable2 : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "MultiTable2") + ) + { + internal readonly int InstanceId = instanceId; + internal BarUniqueIndex? __index_Bar; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static MultiTable2() { } + + public MultiTable2() + : this(__GetInstance(0).__state) { } + + private MultiTable2(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static MultiTable2 __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::MultiTableRow ReadGenFields( System.IO.BinaryReader reader, @@ -2371,23 +2722,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount( + __state + ); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter( + __state + ); public global::MultiTableRow Insert(global::MultiTableRow row) => global::SpacetimeDB.Internal.ITableView.DoInsert( - row + row, + __state ); public bool Delete(global::MultiTableRow row) => global::SpacetimeDB.Internal.ITableView.DoDelete( - row + row, + __state ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear( + __state + ); public sealed class BarUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2397,17 +2756,13 @@ public sealed class BarUniqueIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2_Bar_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static BarUniqueIndex() { } - - internal BarUniqueIndex() - : base(__resolvedName) { } + internal BarUniqueIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "MultiTable2_Bar_idx_btree" + ) + ) { } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2415,18 +2770,49 @@ internal BarUniqueIndex() public global::MultiTableRow? Find(uint key) => FindSingle(key); } - private static BarUniqueIndex? __Bar; - public BarUniqueIndex Bar => __Bar ??= new(); + public BarUniqueIndex Bar => __state.__index_Bar ??= new(__state.InstanceId); } public readonly struct PrivateTable : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PrivateTable" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "PrivateTable") + ) + { + internal readonly int InstanceId = instanceId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static PrivateTable() { } + + public PrivateTable() + : this(__GetInstance(0).__state) { } + + private PrivateTable(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static PrivateTable __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::PrivateTable ReadGenFields( System.IO.BinaryReader reader, @@ -2462,33 +2848,74 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount( + __state + ); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter( + __state + ); public global::PrivateTable Insert(global::PrivateTable row) => global::SpacetimeDB.Internal.ITableView.DoInsert( - row + row, + __state ); public bool Delete(global::PrivateTable row) => global::SpacetimeDB.Internal.ITableView.DoDelete( - row + row, + __state ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear( + __state + ); } public readonly struct PublicTable : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "PublicTable") + ) + { + internal readonly int InstanceId = instanceId; + internal IdUniqueIndex? __index_Id; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static PublicTable() { } + + public PublicTable() + : this(__GetInstance(0).__state) { } + + private PublicTable(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static PublicTable __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::PublicTable ReadGenFields( System.IO.BinaryReader reader, @@ -2547,19 +2974,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar /// It also takes into account modifications by the current transaction. /// public ulong Count => - global::SpacetimeDB.Internal.ITableView.DoCount(); + global::SpacetimeDB.Internal.ITableView.DoCount( + __state + ); public IEnumerable Iter() => - global::SpacetimeDB.Internal.ITableView.DoIter(); + global::SpacetimeDB.Internal.ITableView.DoIter( + __state + ); public global::PublicTable Insert(global::PublicTable row) => - global::SpacetimeDB.Internal.ITableView.DoInsert(row); + global::SpacetimeDB.Internal.ITableView.DoInsert( + row, + __state + ); public bool Delete(global::PublicTable row) => - global::SpacetimeDB.Internal.ITableView.DoDelete(row); + global::SpacetimeDB.Internal.ITableView.DoDelete( + row, + __state + ); public ulong Clear() => - global::SpacetimeDB.Internal.ITableView.DoClear(); + global::SpacetimeDB.Internal.ITableView.DoClear( + __state + ); public sealed class IdUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2569,28 +3008,28 @@ public sealed class IdUniqueIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal IdUniqueIndex() - : base(__resolvedName) { } + internal IdUniqueIndex(int instanceId, global::SpacetimeDB.Internal.TableHandle table) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "PublicTable_Id_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public global::PublicTable? Find(int key) => FindSingle(key); - public global::PublicTable Update(global::PublicTable row) => DoUpdate(row); + public global::PublicTable Update(global::PublicTable row) => DoUpdate(row, __table); } - private static IdUniqueIndex? __Id; - public IdUniqueIndex Id => __Id ??= new(); + public IdUniqueIndex Id => __state.__index_Id ??= new(__state.InstanceId, __state); } internal readonly struct RegressionMultipleUniqueIndexesHadSameName @@ -2599,11 +3038,49 @@ internal readonly struct RegressionMultipleUniqueIndexesHadSameName global::RegressionMultipleUniqueIndexesHadSameName > { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName" + ) + ) + { + internal readonly int InstanceId = instanceId; + internal Unique1UniqueIndex? __index_Unique1; + internal Unique2UniqueIndex? __index_Unique2; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static RegressionMultipleUniqueIndexesHadSameName() { } + + public RegressionMultipleUniqueIndexesHadSameName() + : this(__GetInstance(0).__state) { } + + private RegressionMultipleUniqueIndexesHadSameName(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static RegressionMultipleUniqueIndexesHadSameName __GetInstance( + int contextInstance + ) => new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::RegressionMultipleUniqueIndexesHadSameName ReadGenFields( System.IO.BinaryReader reader, @@ -2666,13 +3143,13 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< RegressionMultipleUniqueIndexesHadSameName, global::RegressionMultipleUniqueIndexesHadSameName - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< RegressionMultipleUniqueIndexesHadSameName, global::RegressionMultipleUniqueIndexesHadSameName - >.DoIter(); + >.DoIter(__state); public global::RegressionMultipleUniqueIndexesHadSameName Insert( global::RegressionMultipleUniqueIndexesHadSameName row @@ -2680,19 +3157,19 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< RegressionMultipleUniqueIndexesHadSameName, global::RegressionMultipleUniqueIndexesHadSameName - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::RegressionMultipleUniqueIndexesHadSameName row) => global::SpacetimeDB.Internal.ITableView< RegressionMultipleUniqueIndexesHadSameName, global::RegressionMultipleUniqueIndexesHadSameName - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< RegressionMultipleUniqueIndexesHadSameName, global::RegressionMultipleUniqueIndexesHadSameName - >.DoClear(); + >.DoClear(__state); internal sealed class Unique1UniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2702,17 +3179,13 @@ internal sealed class Unique1UniqueIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName_Unique1_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static Unique1UniqueIndex() { } - - internal Unique1UniqueIndex() - : base(__resolvedName) { } + internal Unique1UniqueIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName_Unique1_idx_btree" + ) + ) { } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2721,8 +3194,7 @@ internal Unique1UniqueIndex() FindSingle(key); } - private static Unique1UniqueIndex? __Unique1; - internal Unique1UniqueIndex Unique1 => __Unique1 ??= new(); + internal Unique1UniqueIndex Unique1 => __state.__index_Unique1 ??= new(__state.InstanceId); internal sealed class Unique2UniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2732,17 +3204,13 @@ internal sealed class Unique2UniqueIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName_Unique2_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static Unique2UniqueIndex() { } - - internal Unique2UniqueIndex() - : base(__resolvedName) { } + internal Unique2UniqueIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName_Unique2_idx_btree" + ) + ) { } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2751,18 +3219,50 @@ internal Unique2UniqueIndex() FindSingle(key); } - private static Unique2UniqueIndex? __Unique2; - internal Unique2UniqueIndex Unique2 => __Unique2 ??= new(); + internal Unique2UniqueIndex Unique2 => __state.__index_Unique2 ??= new(__state.InstanceId); } public readonly struct SendMessageTimer : global::SpacetimeDB.Internal.ITableView { - public static string LookupName => - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer" + private sealed class __InstanceState(int instanceId) + : global::SpacetimeDB.Internal.TableHandle( + global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "SendMessageTimer") + ) + { + internal readonly int InstanceId = instanceId; + internal ScheduledIdUniqueIndex? __index_ScheduledId; + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly __InstanceState __state; + + static SendMessageTimer() { } + + public SendMessageTimer() + : this(__GetInstance(0).__state) { } + + private SendMessageTimer(__InstanceState state) + { + __state = state; + } + + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static SendMessageTimer __GetInstance(int contextInstance) => + new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" ); + return __instances[instanceId] ??= new(instanceId); + } public static global::Timers.SendMessageTimer ReadGenFields( System.IO.BinaryReader reader, @@ -2828,31 +3328,31 @@ SpacetimeDB.BSATN.ITypeRegistrar registrar global::SpacetimeDB.Internal.ITableView< SendMessageTimer, global::Timers.SendMessageTimer - >.DoCount(); + >.DoCount(__state); public IEnumerable Iter() => global::SpacetimeDB.Internal.ITableView< SendMessageTimer, global::Timers.SendMessageTimer - >.DoIter(); + >.DoIter(__state); public global::Timers.SendMessageTimer Insert(global::Timers.SendMessageTimer row) => global::SpacetimeDB.Internal.ITableView< SendMessageTimer, global::Timers.SendMessageTimer - >.DoInsert(row); + >.DoInsert(row, __state); public bool Delete(global::Timers.SendMessageTimer row) => global::SpacetimeDB.Internal.ITableView< SendMessageTimer, global::Timers.SendMessageTimer - >.DoDelete(row); + >.DoDelete(row, __state); public ulong Clear() => global::SpacetimeDB.Internal.ITableView< SendMessageTimer, global::Timers.SendMessageTimer - >.DoClear(); + >.DoClear(__state); public sealed class ScheduledIdUniqueIndex : global::SpacetimeDB.Internal.UniqueIndex< @@ -2862,17 +3362,21 @@ public sealed class ScheduledIdUniqueIndex SpacetimeDB.BSATN.U64 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer_ScheduledId_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static ScheduledIdUniqueIndex() { } + private readonly global::SpacetimeDB.Internal.TableHandle __table; - internal ScheduledIdUniqueIndex() - : base(__resolvedName) { } + internal ScheduledIdUniqueIndex( + int instanceId, + global::SpacetimeDB.Internal.TableHandle table + ) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "SendMessageTimer_ScheduledId_idx_btree" + ) + ) + { + __table = table; + } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based @@ -2880,11 +3384,11 @@ internal ScheduledIdUniqueIndex() public global::Timers.SendMessageTimer? Find(ulong key) => FindSingle(key); public global::Timers.SendMessageTimer Update(global::Timers.SendMessageTimer row) => - DoUpdate(row); + DoUpdate(row, __table); } - private static ScheduledIdUniqueIndex? __ScheduledId; - public ScheduledIdUniqueIndex ScheduledId => __ScheduledId ??= new(); + public ScheduledIdUniqueIndex ScheduledId => + __state.__index_ScheduledId ??= new(__state.InstanceId, __state); } } @@ -3029,17 +3533,32 @@ namespace SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles internal sealed class BTreeMultiColumnReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeMultiColumn" - ); + private static readonly BTreeMultiColumnReadOnly?[] __instances = + new BTreeMultiColumnReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static BTreeMultiColumnReadOnly() { } - internal BTreeMultiColumnReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static BTreeMultiColumnReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static BTreeMultiColumnReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal BTreeMultiColumnReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "BTreeMultiColumn")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3052,17 +3571,13 @@ internal BTreeMultiColumnReadOnly() public sealed class LocationIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeMultiColumn_X_Y_Z_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static LocationIndex() { } - - internal LocationIndex() - : base(__resolvedName) { } + internal LocationIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "BTreeMultiColumn_X_Y_Z_idx_btree" + ) + ) { } public IEnumerable Filter(uint X) => DoFilter( @@ -3129,24 +3644,40 @@ internal LocationIndex() ); } - private static LocationIndex? __Location; - internal LocationIndex Location => __Location ??= new(); + private LocationIndex? __Location; + internal LocationIndex Location => __Location ??= new(__instanceId); } internal sealed class BTreeViewsReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews" - ); + private static readonly BTreeViewsReadOnly?[] __instances = new BTreeViewsReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static BTreeViewsReadOnly() { } - internal BTreeViewsReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static BTreeViewsReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static BTreeViewsReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal BTreeViewsReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "BTreeViews")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3164,38 +3695,30 @@ public sealed class IdIndex SpacetimeDB.Identity.BSATN > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdIndex() { } - - internal IdIndex() - : base(__resolvedName) { } + internal IdIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "BTreeViews_Id_idx_btree" + ) + ) { } public global::BTreeViews? Find(SpacetimeDB.Identity key) => FindSingle(key); } - private static IdIndex? __Id; - public IdIndex Id => __Id ??= new(); + private IdIndex? __Id; + public IdIndex Id => __Id ??= new(__instanceId); public sealed class LocationIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews_X_Y_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static LocationIndex() { } - - internal LocationIndex() - : base(__resolvedName) { } + internal LocationIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "BTreeViews_X_Y_idx_btree" + ) + ) { } public IEnumerable Filter(uint X) => DoFilter( @@ -3234,23 +3757,19 @@ internal LocationIndex() ); } - private static LocationIndex? __Location; - internal LocationIndex Location => __Location ??= new(); + private LocationIndex? __Location; + internal LocationIndex Location => __Location ??= new(__instanceId); public sealed class FactionIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "BTreeViews_Faction_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static FactionIndex() { } - - internal FactionIndex() - : base(__resolvedName) { } + internal FactionIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "BTreeViews_Faction_idx_btree" + ) + ) { } public IEnumerable Filter(string Faction) => DoFilter( @@ -3271,24 +3790,40 @@ internal FactionIndex() ); } - private static FactionIndex? __Faction; - internal FactionIndex Faction => __Faction ??= new(); + private FactionIndex? __Faction; + internal FactionIndex Faction => __Faction ??= new(__instanceId); } public sealed class MultiTable1ReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1" - ); + private static readonly MultiTable1ReadOnly?[] __instances = new MultiTable1ReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static MultiTable1ReadOnly() { } - internal MultiTable1ReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static MultiTable1ReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static MultiTable1ReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal MultiTable1ReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "MultiTable1")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3306,38 +3841,30 @@ public sealed class FooIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1_Foo_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static FooIndex() { } - - internal FooIndex() - : base(__resolvedName) { } + internal FooIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "MultiTable1_Foo_idx_btree" + ) + ) { } public global::MultiTableRow? Find(uint key) => FindSingle(key); } - private static FooIndex? __Foo; - public FooIndex Foo => __Foo ??= new(); + private FooIndex? __Foo; + public FooIndex Foo => __Foo ??= new(__instanceId); public sealed class NameIndex : global::SpacetimeDB.Internal.ReadOnlyIndexBase { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable1_Name_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static NameIndex() { } - - internal NameIndex() - : base(__resolvedName) { } + internal NameIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "MultiTable1_Name_idx_btree" + ) + ) { } public IEnumerable Filter(string Name) => DoFilter( @@ -3358,24 +3885,40 @@ internal NameIndex() ); } - private static NameIndex? __Name; - public NameIndex Name => __Name ??= new(); + private NameIndex? __Name; + public NameIndex Name => __Name ??= new(__instanceId); } public sealed class MultiTable2ReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2" - ); + private static readonly MultiTable2ReadOnly?[] __instances = new MultiTable2ReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static MultiTable2ReadOnly() { } - internal MultiTable2ReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static MultiTable2ReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static MultiTable2ReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal MultiTable2ReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "MultiTable2")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3393,39 +3936,51 @@ public sealed class BarIndex SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "MultiTable2_Bar_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static BarIndex() { } - - internal BarIndex() - : base(__resolvedName) { } + internal BarIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "MultiTable2_Bar_idx_btree" + ) + ) { } public global::MultiTableRow? Find(uint key) => FindSingle(key); } - private static BarIndex? __Bar; - public BarIndex Bar => __Bar ??= new(); + private BarIndex? __Bar; + public BarIndex Bar => __Bar ??= new(__instanceId); } public sealed class PrivateTableReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PrivateTable" - ); + private static readonly PrivateTableReadOnly?[] __instances = new PrivateTableReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static PrivateTableReadOnly() { } - internal PrivateTableReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static PrivateTableReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static PrivateTableReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal PrivateTableReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "PrivateTable")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3439,17 +3994,33 @@ internal PrivateTableReadOnly() public sealed class PublicTableReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable" - ); + private static readonly PublicTableReadOnly?[] __instances = new PublicTableReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static PublicTableReadOnly() { } - internal PublicTableReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static PublicTableReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static PublicTableReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal PublicTableReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "PublicTable")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3467,39 +4038,60 @@ public sealed class IdIndex SpacetimeDB.BSATN.I32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "PublicTable_Id_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static IdIndex() { } - - internal IdIndex() - : base(__resolvedName) { } + internal IdIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "PublicTable_Id_idx_btree" + ) + ) { } public global::PublicTable? Find(int key) => FindSingle(key); } - private static IdIndex? __Id; - public IdIndex Id => __Id ??= new(); + private IdIndex? __Id; + public IdIndex Id => __Id ??= new(__instanceId); } internal sealed class RegressionMultipleUniqueIndexesHadSameNameReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName" - ); + private static readonly RegressionMultipleUniqueIndexesHadSameNameReadOnly?[] __instances = + new RegressionMultipleUniqueIndexesHadSameNameReadOnly?[ + global::SpacetimeDB.Internal.Module.InstanceCount + ]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static RegressionMultipleUniqueIndexesHadSameNameReadOnly() { } - internal RegressionMultipleUniqueIndexesHadSameNameReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static RegressionMultipleUniqueIndexesHadSameNameReadOnly __GetInstance( + int contextInstance + ) => __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static RegressionMultipleUniqueIndexesHadSameNameReadOnly __CreateInstance( + int contextInstance + ) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal RegressionMultipleUniqueIndexesHadSameNameReadOnly(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName" + ) + ) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3517,24 +4109,20 @@ public sealed class Unique1Index SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName_Unique1_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static Unique1Index() { } - - internal Unique1Index() - : base(__resolvedName) { } + internal Unique1Index(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName_Unique1_idx_btree" + ) + ) { } public global::RegressionMultipleUniqueIndexesHadSameName? Find(uint key) => FindSingle(key); } - private static Unique1Index? __Unique1; - public Unique1Index Unique1 => __Unique1 ??= new(); + private Unique1Index? __Unique1; + public Unique1Index Unique1 => __Unique1 ??= new(__instanceId); public sealed class Unique2Index : global::SpacetimeDB.Internal.ReadOnlyUniqueIndex< @@ -3544,40 +4132,51 @@ public sealed class Unique2Index SpacetimeDB.BSATN.U32 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "RegressionMultipleUniqueIndexesHadSameName_Unique2_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static Unique2Index() { } - - internal Unique2Index() - : base(__resolvedName) { } + internal Unique2Index(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "RegressionMultipleUniqueIndexesHadSameName_Unique2_idx_btree" + ) + ) { } public global::RegressionMultipleUniqueIndexesHadSameName? Find(uint key) => FindSingle(key); } - private static Unique2Index? __Unique2; - public Unique2Index Unique2 => __Unique2 ??= new(); + private Unique2Index? __Unique2; + public Unique2Index Unique2 => __Unique2 ??= new(__instanceId); } public sealed class SendMessageTimerReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer" - ); + private static readonly SendMessageTimerReadOnly?[] __instances = + new SendMessageTimerReadOnly?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; - // Prevent eager initialization before the root installs namespace placements. static SendMessageTimerReadOnly() { } - internal SendMessageTimerReadOnly() - : base(__resolvedName) { } + [global::System.Runtime.CompilerServices.MethodImpl( + global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] + public static SendMessageTimerReadOnly __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static SendMessageTimerReadOnly __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return __instances[instanceId] ??= new(instanceId); + } + + internal SendMessageTimerReadOnly(int instanceId) + : base(global::SpacetimeDB.Internal.Module.ResolveName(instanceId, "SendMessageTimer")) + { + __instanceId = instanceId; + } /// /// Returns the number of rows in this table. @@ -3595,23 +4194,19 @@ public sealed class ScheduledIdIndex SpacetimeDB.BSATN.U64 > { - private static readonly string __resolvedName = - global::SpacetimeDB.Internal.Module.ResolveName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - "SendMessageTimer_ScheduledId_idx_btree" - ); - - // Prevent eager initialization before the root installs namespace placements. - static ScheduledIdIndex() { } - - internal ScheduledIdIndex() - : base(__resolvedName) { } + internal ScheduledIdIndex(int instanceId) + : base( + global::SpacetimeDB.Internal.Module.ResolveName( + instanceId, + "SendMessageTimer_ScheduledId_idx_btree" + ) + ) { } public global::Timers.SendMessageTimer? Find(ulong key) => FindSingle(key); } - private static ScheduledIdIndex? __ScheduledId; - public ScheduledIdIndex ScheduledId => __ScheduledId ??= new(); + private ScheduledIdIndex? __ScheduledId; + public ScheduledIdIndex ScheduledId => __ScheduledId ??= new(__instanceId); } } @@ -3621,21 +4216,37 @@ namespace SpacetimeDB.Internal public sealed partial class LocalReadOnly { internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly BTreeMultiColumn => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeMultiColumnReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly BTreeViews => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.BTreeViewsReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly MultiTable1 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable1ReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly MultiTable2 => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.MultiTable2ReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly PrivateTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PrivateTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly PublicTable => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.PublicTableReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); internal global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly RegressionMultipleUniqueIndexesHadSameName => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.RegressionMultipleUniqueIndexesHadSameNameReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); public global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly SendMessageTimer => - new(); + global::SpacetimeDB.Generated.server_D513E4815F57969C.ViewHandles.SendMessageTimerReadOnly.__GetInstance( + global::SpacetimeDB.Internal.Module.GetInstanceId(db) + ); } } #endif @@ -3835,9 +4446,19 @@ internal static void Initialize() #if NET10_0_OR_GREATER global::SpacetimeDB.Internal.Module.InstallNamespaces( new global::SpacetimeDB.Internal.NamespaceRegistry( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - global::SpacetimeDB.CaseConversionPolicy.SnakeCase, - new (string, string, string?, global::SpacetimeDB.CaseConversionPolicy)[] { } + new (int, string, string?, global::SpacetimeDB.CaseConversionPolicy, string[])[] + { + ( + -1, + "", + null, + global::SpacetimeDB.CaseConversionPolicy.SnakeCase, + new string[] + { + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + } + ), + } ) ); global::SpacetimeDB.Generated.server_D513E4815F57969C.AssemblyDescriptor.Register( @@ -3939,7 +4560,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_0( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -3951,7 +4573,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -3977,7 +4600,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_1( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -3989,7 +4613,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -4015,7 +4640,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_2( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -4027,7 +4653,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -4053,7 +4680,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_3( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -4065,7 +4693,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -4091,7 +4720,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_4( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -4103,7 +4733,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -4129,7 +4760,8 @@ private static SpacetimeDB.Internal.Errno __call_reducer_5( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) { try @@ -4141,7 +4773,8 @@ SpacetimeDB.Internal.BytesSink error sender_3, conn_id_0, conn_id_1, - timestamp + timestamp, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, @@ -4164,7 +4797,8 @@ private static SpacetimeDB.Internal.Errno __call_view_0( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -4173,7 +4807,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -4194,7 +4829,8 @@ private static SpacetimeDB.Internal.Errno __call_view_1( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try @@ -4203,7 +4839,8 @@ SpacetimeDB.Internal.BytesSink sink sender_0, sender_1, sender_2, - sender_3 + sender_3, + instanceId ); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); @@ -4220,12 +4857,13 @@ SpacetimeDB.Internal.BytesSink sink private static SpacetimeDB.Internal.Errno __call_view_anon_0( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(instanceId); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes( args, ref anonymousViewArgsBuffer @@ -4286,7 +4924,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + 0 ); localId -= global::SpacetimeDB .Generated @@ -4323,7 +4962,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalReducer( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error, + int instanceId = 0 ) => id switch { @@ -4336,7 +4976,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 1 => __call_reducer_1( sender_0, @@ -4347,7 +4988,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 2 => __call_reducer_2( sender_0, @@ -4358,7 +5000,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 3 => __call_reducer_3( sender_0, @@ -4369,7 +5012,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 4 => __call_reducer_4( sender_0, @@ -4380,7 +5024,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), 5 => __call_reducer_5( sender_0, @@ -4391,7 +5036,8 @@ SpacetimeDB.Internal.BytesSink error conn_id_1, timestamp, args, - error + error, + instanceId ), _ => SpacetimeDB.Internal.Module.WriteReducerError( error, @@ -4440,7 +5086,8 @@ SpacetimeDB.Internal.BytesSink result_sink conn_id_1, timestamp, args, - result_sink + result_sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -4474,7 +5121,8 @@ internal static SpacetimeDB.Internal.Errno CallLocalProcedure( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink, + int instanceId = 0 ) => id switch { @@ -4606,7 +5254,8 @@ SpacetimeDB.Internal.BytesSink sink sender_2, sender_3, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -4626,12 +5275,13 @@ internal static SpacetimeDB.Internal.Errno CallLocalView( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { - 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink), - 1 => __call_view_1(sender_0, sender_1, sender_2, sender_3, args, sink), + 0 => __call_view_0(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), + 1 => __call_view_1(sender_0, sender_1, sender_2, sender_3, args, sink, instanceId), _ => UnknownViewId(id), }; @@ -4662,7 +5312,8 @@ SpacetimeDB.Internal.BytesSink sink return global::SpacetimeDB.Generated.server_D513E4815F57969C.AssemblyDescriptor.CallLocalAnonymousView( localId, args, - sink + sink, + 0 ); localId -= global::SpacetimeDB .Generated @@ -4678,11 +5329,12 @@ SpacetimeDB.Internal.BytesSink sink internal static SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink, + int instanceId = 0 ) => id switch { - 0 => __call_view_anon_0(args, sink), + 0 => __call_view_anon_0(args, sink, instanceId), _ => UnknownAnonymousViewId(id), }; diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.InsertMultiData.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.InsertMultiData.verified.cs index 5549aba2925..0238e2d01ab 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.InsertMultiData.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.InsertMultiData.verified.cs @@ -4,28 +4,58 @@ partial struct MultiTableRow { - private static class __ScheduleInsertMultiDataName + private static string __ScheduleInsertMultiDataName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(InsertMultiData), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateInsertMultiData(MultiTableRow data) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new MultiTableRow.BSATN().Write(writer, data); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleInsertMultiDataName, + stream + ); + } + + private static string?[] __ScheduleInsertMultiDataNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleInsertMultiDataName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleInsertMultiDataNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(InsertMultiData), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleInsertMultiDataName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateInsertMultiData(MultiTableRow data) + public static void VolatileNonatomicScheduleImmediateInsertMultiData<__Context>( + __Context __context, + MultiTableRow data + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleInsertMultiDataName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new MultiTableRow.BSATN().Write(writer, data); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleInsertMultiDataName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // MultiTableRow diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.verified.cs index 6be9b6e344c..7d5502c57f7 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#MultiTableRow.verified.cs @@ -6,6 +6,11 @@ partial struct MultiTableRow : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Name = BSATN.NameRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PrivateTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PrivateTable.verified.cs index b05b2a0973f..50c222f060b 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PrivateTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PrivateTable.verified.cs @@ -4,6 +4,11 @@ partial class PrivateTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PublicTable.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PublicTable.verified.cs index 082565d5e11..6712b30caa1 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PublicTable.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#PublicTable.verified.cs @@ -4,6 +4,11 @@ partial struct PublicTable : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Id = BSATN.IdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.InsertData.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.InsertData.verified.cs index 1e2eafd9af6..40f6d3d3af1 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.InsertData.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.InsertData.verified.cs @@ -4,28 +4,58 @@ partial class Reducers { - private static class __ScheduleInsertDataName + private static string __ScheduleInsertDataName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(InsertData), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateInsertData(PublicTable data) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new PublicTable.BSATN().Write(writer, data); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleInsertDataName, + stream + ); + } + + private static string?[] __ScheduleInsertDataNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleInsertDataName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleInsertDataNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(InsertData), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleInsertDataName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateInsertData(PublicTable data) + public static void VolatileNonatomicScheduleImmediateInsertData<__Context>( + __Context __context, + PublicTable data + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleInsertDataName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new PublicTable.BSATN().Write(writer, data); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleInsertDataName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.ScheduleImmediate.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.ScheduleImmediate.verified.cs index 0200ad976db..e5a187efa48 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.ScheduleImmediate.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Reducers.ScheduleImmediate.verified.cs @@ -4,28 +4,58 @@ partial class Reducers { - private static class __ScheduleScheduleImmediateName + private static string __ScheduleScheduleImmediateName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(ScheduleImmediate), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateScheduleImmediate(PublicTable data) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new PublicTable.BSATN().Write(writer, data); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleScheduleImmediateName, + stream + ); + } + + private static string?[] __ScheduleScheduleImmediateNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleScheduleImmediateName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleScheduleImmediateNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(ScheduleImmediate), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleScheduleImmediateName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateScheduleImmediate(PublicTable data) + public static void VolatileNonatomicScheduleImmediateScheduleImmediate<__Context>( + __Context __context, + PublicTable data + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleScheduleImmediateName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new PublicTable.BSATN().Write(writer, data); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleScheduleImmediateName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Reducers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#RegressionMultipleUniqueIndexesHadSameName.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#RegressionMultipleUniqueIndexesHadSameName.verified.cs index f06c4b9552c..f581dd3dff0 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#RegressionMultipleUniqueIndexesHadSameName.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#RegressionMultipleUniqueIndexesHadSameName.verified.cs @@ -6,6 +6,11 @@ partial struct RegressionMultipleUniqueIndexesHadSameName : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Unique1 = BSATN.Unique1RW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Test.NestingNamespaces.AndClasses.InsertData2.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Test.NestingNamespaces.AndClasses.InsertData2.verified.cs index 77fcaf513d2..9d9f135f351 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Test.NestingNamespaces.AndClasses.InsertData2.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Test.NestingNamespaces.AndClasses.InsertData2.verified.cs @@ -6,29 +6,59 @@ namespace Test.NestingNamespaces { partial class AndClasses { - private static class __ScheduleInsertData2Name + private static string __ScheduleInsertData2Name => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(InsertData2), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateInsertData2(PublicTable data) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new PublicTable.BSATN().Write(writer, data); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleInsertData2Name, + stream + ); + } + + private static string?[] __ScheduleInsertData2Names => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleInsertData2Name(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleInsertData2Names; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(InsertData2), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleInsertData2Name() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateInsertData2(PublicTable data) + public static void VolatileNonatomicScheduleImmediateInsertData2<__Context>( + __Context __context, + PublicTable data + ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleInsertData2Name(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new PublicTable.BSATN().Write(writer, data); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleInsertData2Name.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // AndClasses } // namespace diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.Init.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.Init.verified.cs index f313a9af2fd..16dd071c35d 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.Init.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.Init.verified.cs @@ -4,18 +4,12 @@ partial class Timers { - private static class __ScheduleInitName - { - internal static readonly string Name = - global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", - nameof(Init), - null - ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleInitName() { } - } + private static string __ScheduleInitName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(Init), + null + ); [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] public static void VolatileNonatomicScheduleImmediateInit() @@ -24,8 +18,37 @@ public static void VolatileNonatomicScheduleImmediateInit() using var writer = new BinaryWriter(stream); SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleInitName.Name, + __ScheduleInitName, stream ); } + + private static string?[] __ScheduleInitNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleInitName(int contextInstance) + { + var names = __ScheduleInitNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= + global::SpacetimeDB.Internal.Module.ResolveFunctionName(instance, nameof(Init), null); + } + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateInit<__Context>(__Context __context) + where __Context : global::SpacetimeDB.Internal.IModuleContext + { + var __name = __ResolveScheduleInitName(__context.InstanceId); + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); + } } // Timers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendMessageTimer.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendMessageTimer.verified.cs index 2457217bd02..9b9097c1c97 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendMessageTimer.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendMessageTimer.verified.cs @@ -8,6 +8,11 @@ partial struct SendMessageTimer : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { ScheduledId = BSATN.ScheduledIdRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendScheduledMessage.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendScheduledMessage.verified.cs index f6a1283b596..ca8463b13fd 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendScheduledMessage.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module.net10#Timers.SendScheduledMessage.verified.cs @@ -4,30 +4,60 @@ partial class Timers { - private static class __ScheduleSendScheduledMessageName + private static string __ScheduleSendScheduledMessageName => + field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + nameof(SendScheduledMessage), + null + ); + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediateSendScheduledMessage( + Timers.SendMessageTimer arg + ) + { + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + new Timers.SendMessageTimer.BSATN().Write(writer, arg); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( + __ScheduleSendScheduledMessageName, + stream + ); + } + + private static string?[] __ScheduleSendScheduledMessageNames => + field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string __ResolveScheduleSendScheduledMessageName(int contextInstance) { - internal static readonly string Name = + var names = __ScheduleSendScheduledMessageNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance( + contextInstance, + "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + ); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName( - "server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", + instance, nameof(SendScheduledMessage), null ); - - // Prevent eager initialization before the root installs namespace placements. - static __ScheduleSendScheduledMessageName() { } } [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] - public static void VolatileNonatomicScheduleImmediateSendScheduledMessage( + public static void VolatileNonatomicScheduleImmediateSendScheduledMessage<__Context>( + __Context __context, Timers.SendMessageTimer arg ) + where __Context : global::SpacetimeDB.Internal.IModuleContext { + var __name = __ResolveScheduleSendScheduledMessageName(__context.InstanceId); using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); new Timers.SendMessageTimer.BSATN().Write(writer, arg); - SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate( - __ScheduleSendScheduledMessageName.Name, - stream - ); + SpacetimeDB.Internal.IReducer.VolatileNonatomicScheduleImmediate(__name, stream); } } // Timers diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#ContainsNestedLists.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#ContainsNestedLists.verified.cs index df6c9b30997..40d93525a0a 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#ContainsNestedLists.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#ContainsNestedLists.verified.cs @@ -6,6 +6,11 @@ partial class ContainsNestedLists : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntList = BSATN.IntListRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomClass.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomClass.verified.cs index 7a4d3129a27..3c0a4471cce 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomClass.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomClass.verified.cs @@ -4,6 +4,11 @@ partial class CustomClass : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntField = BSATN.IntFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomNestedClass.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomNestedClass.verified.cs index 1f005bab05b..98ca4f69d5d 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomNestedClass.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomNestedClass.verified.cs @@ -6,6 +6,11 @@ partial class CustomNestedClass : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { NestedClass = BSATN.NestedClassRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomRecord.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomRecord.verified.cs index 450fe971051..0b25cd9e85e 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomRecord.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomRecord.verified.cs @@ -4,6 +4,11 @@ partial class CustomRecord : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntField = BSATN.IntFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomStruct.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomStruct.verified.cs index 91763f4a2f9..2c696399eb5 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomStruct.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#CustomStruct.verified.cs @@ -6,6 +6,11 @@ partial struct CustomStruct : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { IntField = BSATN.IntFieldRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyClass.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyClass.verified.cs index b4fabb48eba..006fafb6acf 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyClass.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyClass.verified.cs @@ -4,6 +4,11 @@ partial class EmptyClass : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyRecord.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyRecord.verified.cs index 1484d484567..ec0fec79f2f 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyRecord.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyRecord.verified.cs @@ -4,6 +4,11 @@ partial record EmptyRecord : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyStruct.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyStruct.verified.cs index 186bd5f4839..773f743094a 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyStruct.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#EmptyStruct.verified.cs @@ -4,6 +4,11 @@ partial struct EmptyStruct : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { } public void WriteFields(System.IO.BinaryWriter writer) { } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#FormerlyForbiddenFieldNames.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#FormerlyForbiddenFieldNames.verified.cs index 77e178d9bcf..4958a7e2f22 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#FormerlyForbiddenFieldNames.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Type#FormerlyForbiddenFieldNames.verified.cs @@ -6,6 +6,11 @@ partial struct FormerlyForbiddenFieldNames : System.IEquatable, SpacetimeDB.BSATN.IStructuralReadWrite { +#if NET10_0_OR_GREATER + [System.Runtime.CompilerServices.MethodImpl( + System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining + )] +#endif public void ReadFields(System.IO.BinaryReader reader) { Read = BSATN.ReadRW.Read(reader); diff --git a/crates/bindings-csharp/Codegen/Diag.cs b/crates/bindings-csharp/Codegen/Diag.cs index 4927b2e9d7f..c24d97cd811 100644 --- a/crates/bindings-csharp/Codegen/Diag.cs +++ b/crates/bindings-csharp/Codegen/Diag.cs @@ -379,14 +379,8 @@ string second _ => Location.None ); - public static readonly ErrorDescriptor DependencyNamespaceMounts = - new( - group, - "Dependency declares namespace mounts", - identity => - $"Dependency '{identity}' declares namespace mounts. Only the consuming root may choose dependency placement; move those declarations to the root.", - _ => Location.None - ); + public static readonly ErrorDescriptor InvalidNamespaceComposition = + new(group, "Invalid namespace composition", message => $"{message}", _ => Location.None); public static readonly ErrorDescriptor<( string assembly, @@ -397,7 +391,7 @@ string declarations group, "Root-only declarations in mounted dependency", ctx => - $"Dependency '{ctx.assembly}' mounted in namespace '{ctx.name}' declares {ctx.declarations}. These declarations are only supported in the root scope. Move them to the root, or omit the namespace declaration so the dependency registers automatically in public. Root-defined RLS may target namespace-qualified tables.", + $"Dependency '{ctx.assembly}' mounted in namespace '{ctx.name}' declares {ctx.declarations}. These declarations are only supported in the root scope. Move them to the root or register the dependency in the root's public scope. A public contribution inside a named submodule remains in that submodule's scope. Root-defined RLS may target namespace-qualified tables.", _ => Location.None ); @@ -417,8 +411,9 @@ string second ); public static readonly ErrorDescriptor<( - string root, - string rootPolicy, + string scope, + string owner, + string policy, string dependency, string dependencyPolicy )> ConflictingCaseConversionPolicies = @@ -426,7 +421,7 @@ string dependencyPolicy group, "Conflicting case conversion policies", ctx => - $"Root assembly '{ctx.root}' uses case conversion policy '{ctx.rootPolicy}', but dependency '{ctx.dependency}' declares '{ctx.dependencyPolicy}' in the shared public scope. Use the same policy, remove the dependency's setting to inherit the root policy, or mount the dependency in a distinct namespace.", + $"Assembly '{ctx.owner}' uses case conversion policy '{ctx.policy}' in scope '{ctx.scope}', but dependency '{ctx.dependency}' declares '{ctx.dependencyPolicy}' in the same scope. Use the same policy, remove the dependency's setting to inherit the containing scope's policy, or mount the dependency in a distinct namespace.", _ => Location.None ); } diff --git a/crates/bindings-csharp/Codegen/ImmediateSchedule.cs b/crates/bindings-csharp/Codegen/ImmediateSchedule.cs new file mode 100644 index 00000000000..2799fc380b8 --- /dev/null +++ b/crates/bindings-csharp/Codegen/ImmediateSchedule.cs @@ -0,0 +1,71 @@ +namespace SpacetimeDB.Codegen; + +using System.Linq; +using Microsoft.CodeAnalysis.CSharp; +using static Utils; + +internal static class ImmediateSchedule +{ + internal static string GenerateContextOverload( + string name, + string identifier, + string assembly, + string? canonicalName, + EquatableArray args, + string dispatcher + ) + { + var cache = $"__Schedule{name}Names"; + var resolve = $"__ResolveSchedule{name}Name"; + var contextType = UniqueName("__Context", args); + var context = UniqueName("__context", args); + var resolvedName = UniqueName("__name", args); + return $$""" + + private static string?[] {{cache}} => field ??= new string?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static string {{resolve}}(int contextInstance) + { + var names = {{cache}}; + if (names[contextInstance] is { } name) + { + return name; + } + var instance = global::SpacetimeDB.Internal.Module.ResolveInstance(contextInstance, {{SymbolDisplay.FormatLiteral( + assembly, + true + )}}); + return names[contextInstance] = names[instance] ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName(instance, nameof({{identifier}}), {{( + string.IsNullOrEmpty(canonicalName) + ? "null" + : SymbolDisplay.FormatLiteral(canonicalName!, true) + )}}); + } + + [System.Diagnostics.CodeAnalysis.Experimental("STDB_UNSTABLE")] + public static void VolatileNonatomicScheduleImmediate{{name}}<{{contextType}}>({{contextType}} {{context}}{{string.Concat( + args.Select(a => $", {a.Type.Name} {a.Identifier}") + )}}) + where {{contextType}} : global::SpacetimeDB.Internal.IModuleContext + { + var {{resolvedName}} = {{resolve}}({{context}}.InstanceId); + using var stream = new MemoryStream(); + using var writer = new BinaryWriter(stream); + {{string.Join( + "\n", + args.Select(a => $"new {a.Type.ToBSATNString()}().Write(writer, {a.Identifier});") + )}} + {{dispatcher}}.VolatileNonatomicScheduleImmediate({{resolvedName}}, stream); + } + """; + } + + private static string UniqueName(string name, EquatableArray args) + { + while (args.Select(arg => arg.Identifier.TrimStart('@')).Contains(name)) + { + name += "_"; + } + return name; + } +} diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index 2696bb3e262..e6544ed4bea 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -506,26 +506,64 @@ private string LookupName(string localName) => : SymbolDisplay.FormatLiteral(localName, true); private string HandleLookupName(string localName) => - sharedContexts ? "__resolvedName" : LookupName(localName); - - private string HandleLookupNameCache(string typeName, string localName) => sharedContexts - ? $$""" - private static readonly string __resolvedName = {{LookupName(localName)}}; - // Prevent eager initialization before the root installs namespace placements. - static {{typeName}}() { } - """ - : ""; + ? $"global::SpacetimeDB.Internal.Module.ResolveName(instanceId, {SymbolDisplay.FormatLiteral(localName, true)})" + : LookupName(localName); + + private string HandleCache(string typeName) => + $$""" + private static readonly {{typeName}}?[] __instances = new {{typeName}}?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly int __instanceId; + static {{typeName}}() { } + + [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + public static {{typeName}} __GetInstance(int contextInstance) => + __instances[contextInstance] ??= __CreateInstance(contextInstance); + + private static {{typeName}} __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance(contextInstance, {{SymbolDisplay.FormatLiteral( + assemblyIdentity, + true + )}}); + return __instances[instanceId] ??= new(instanceId); + } + """; private string IndexInstanceCache(string typeName, string identifier) => sharedContexts ? $$""" - private static {{typeName}}? __{{identifier.TrimStart('@')}}; + private {{typeName}}? __{{identifier.TrimStart('@')}}; """ : ""; - private string IndexInstance(string identifier) => - sharedContexts ? $"__{identifier.TrimStart('@')} ??= new()" : "new()"; + private string IndexInstance( + string identifier, + bool writable = false, + bool primaryKey = false + ) => + sharedContexts + ? writable + ? $"__state.__index_{identifier.TrimStart('@')} ??= new(__state.InstanceId{(primaryKey ? ", __state" : "")})" + : $"__{identifier.TrimStart('@')} ??= new(__instanceId)" + : "new()"; + + private IEnumerable WritableIndexCaches(TableAccessor table) + { + foreach ( + var constraint in GetConstraints(table, ColumnAttrs.Unique) + .Where(c => c.Col.IsEquatable) + ) + { + var identifier = constraint.Col.Identifier; + yield return $"internal {identifier}UniqueIndex? __index_{identifier.TrimStart('@')};"; + } + foreach (var index in GetIndexes(table).Where(i => i.AccessorName.Length != 0)) + { + var identifier = index.AccessorIdentifier; + yield return $"internal {identifier}Index? __index_{identifier.TrimStart('@')};"; + } + } public int? GetColumnIndex(AttributeData attrContext, string name, DiagReporter diag) { @@ -628,10 +666,26 @@ var member in new[] "Insert", "Delete", "Clear", + "__GetInstance", + "__CreateInstance", + "__instances", + "__instanceId", + "__state", + "__InstanceState", } ) names.Add(writable, member, "generated table member"); - foreach (var member in new[] { "__resolvedName", "Count", "Iter" }) + foreach ( + var member in new[] + { + "__GetInstance", + "__CreateInstance", + "__instances", + "__instanceId", + "Count", + "Iter", + } + ) names.Add(readOnly, member, "generated read-only table member"); void Index(string identifier, bool unique, string contributor) @@ -640,8 +694,8 @@ void Index(string identifier, bool unique, string contributor) { names.Add(scope, identifier, contributor); names.Add( - scope, - "__" + identifier.TrimStart('@'), + scope == writable ? writable + ".__InstanceState" : scope, + (scope == writable ? "__index_" : "__") + identifier.TrimStart('@'), $"cache field for {contributor}" ); names.Add( @@ -671,6 +725,13 @@ var constraint in GetConstraints(table, ColumnAttrs.Unique) foreach (var container in new[] { "Tables", "ReadOnlyTables", "Queries" }) names.Add(container, table.Identifier, owner); + foreach (var container in new[] { "Tables", "ReadOnlyTables" }) + { + if (table.Name == "__instanceId") + { + names.Add(container, "__instanceId", "generated instance field"); + } + } if (table.Name is "GetType" or "ToString" or "Equals" or "GetHashCode") { diag.Report( @@ -730,24 +791,25 @@ public IEnumerable GenerateTableAccessorFilters(TableAccessor tableAcces continue; } var standardIndexName = ct.ToIndex().StandardIndexName(tableAccessor); - var updateMethod = ct.Attr.HasFlag(ColumnAttrs.PrimaryKey) - ? $"public {globalName} Update({globalName} row) => DoUpdate(row);" + var primaryKey = ct.Attr.HasFlag(ColumnAttrs.PrimaryKey); + var instanceTable = sharedContexts && primaryKey; + var updateMethod = primaryKey + ? $"public {globalName} Update({globalName} row) => DoUpdate(row{(instanceTable ? ", __table" : "")});" : ""; yield return $$""" {{vis}} sealed class {{f.Identifier}}UniqueIndex : {{uniqueIndexBase}}<{{tableAccessor.Identifier}}, {{globalName}}, {{f.Type.Name}}, {{f.Type.BSATNName}}> { - {{HandleLookupNameCache(f.Identifier + "UniqueIndex", standardIndexName)}} - internal {{f.Identifier}}UniqueIndex() : base({{HandleLookupName( + {{(instanceTable ? "private readonly global::SpacetimeDB.Internal.TableHandle __table;" : "")}} + internal {{f.Identifier}}UniqueIndex({{(sharedContexts ? "int instanceId" + (instanceTable ? ", global::SpacetimeDB.Internal.TableHandle table" : "") : "")}}) : base({{HandleLookupName( standardIndexName - )}}) {} + )}}) { {{(instanceTable ? "__table = table;" : "")}} } // Important: don't move this to the base class. // C# generics don't play well with nullable types and can't accept both struct-type-based and class-type-based // `globalName` in one generic definition, leading to buggy `Row?` expansion for either one or another. public {{globalName}}? Find({{f.Type.Name}} key) => FindSingle(key); {{updateMethod}} } - {{IndexInstanceCache(f.Identifier + "UniqueIndex", f.Identifier)}} {{vis}} {{f.Identifier}}UniqueIndex {{f.Identifier}} => {{IndexInstance( - f.Identifier + f.Identifier, writable: true, primaryKey: primaryKey )}}; """; } @@ -768,10 +830,9 @@ public IEnumerable GenerateTableAccessorFilters(TableAccessor tableAcces var standardIndexName = index.StandardIndexName(tableAccessor); yield return $$""" - {{vis}} sealed class {{identifierName}}Index() : SpacetimeDB.Internal.IndexBase<{{globalName}}>({{HandleLookupName( + {{vis}} sealed class {{identifierName}}Index({{(sharedContexts ? "int instanceId" : "")}}) : SpacetimeDB.Internal.IndexBase<{{globalName}}>({{HandleLookupName( standardIndexName )}}) { - {{HandleLookupNameCache(identifierName + "Index", standardIndexName)}} """; for (var n = 0; n < members.Length; n++) @@ -814,7 +875,7 @@ public ulong Delete({{argsBounds}}) => """; } - yield return $"}}\n {IndexInstanceCache(identifierName + "Index", identifierName)}\n {vis} {identifierName}Index {identifierName} => {IndexInstance(identifierName)};\n"; + yield return $"}}\n {vis} {identifierName}Index {identifierName} => {IndexInstance(identifierName, writable: true)};\n"; } } @@ -845,8 +906,7 @@ public sealed class {{{f.Identifier}}}Index {{{f.Type.Name}}}, {{{f.Type.BSATNName}}}> { - {{{HandleLookupNameCache(f.Identifier + "Index", standardIndexName)}}} - internal {{{f.Identifier}}}Index() : base({{{HandleLookupName( + internal {{{f.Identifier}}}Index({{{(sharedContexts ? "int instanceId" : "")}}}) : base({{{HandleLookupName( standardIndexName )}}}) { } @@ -878,8 +938,7 @@ public sealed class {{{f.Identifier}}}Index public sealed class {{{identifierName}}}Index : global::SpacetimeDB.Internal.ReadOnlyIndexBase<{{{globalName}}}> { - {{{HandleLookupNameCache(identifierName + "Index", standardIndexName)}}} - internal {{{identifierName}}}Index() : base({{{HandleLookupName( + internal {{{identifierName}}}Index({{{(sharedContexts ? "int instanceId" : "")}}}) : base({{{HandleLookupName( standardIndexName )}}}) {} """, @@ -968,12 +1027,43 @@ public IEnumerable GenerateTableAccessors() var accessorIdentifier = v.Identifier; var iTable = $"global::SpacetimeDB.Internal.ITableView<{accessorIdentifier}, {globalName}>"; + var tableArgument = sharedContexts ? "__state" : ""; + var rowArgument = sharedContexts ? "row, __state" : "row"; + var instanceMembers = sharedContexts + ? $$""" + private sealed class __InstanceState(int instanceId) : global::SpacetimeDB.Internal.TableHandle({{HandleLookupName( + v.Name + )}}) + { + internal readonly int InstanceId = instanceId; + {{string.Join("\n", WritableIndexCaches(v))}} + } + + private static readonly __InstanceState?[] __instances = new __InstanceState?[global::SpacetimeDB.Internal.Module.InstanceCount]; + private readonly __InstanceState __state; + static {{accessorIdentifier}}() { } + public {{accessorIdentifier}}() : this(__GetInstance(0).__state) { } + private {{accessorIdentifier}}(__InstanceState state) { __state = state; } + + [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)] + public static {{accessorIdentifier}} __GetInstance(int contextInstance) => new(__instances[contextInstance] ??= __CreateInstance(contextInstance)); + + private static __InstanceState __CreateInstance(int contextInstance) + { + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance(contextInstance, {{SymbolDisplay.FormatLiteral( + assemblyIdentity, + true + )}}); + return __instances[instanceId] ??= new(instanceId); + } + """ + : ""; yield return new( v.Name, globalName, $$$""" {{{SyntaxFacts.GetText(Visibility)}}} readonly struct {{{accessorIdentifier}}} : {{{iTable}}} { - {{{(sharedContexts ? $"public static string LookupName => {LookupName(v.Name)};" : "")}}} + {{{instanceMembers}}} public static {{{globalName}}} ReadGenFields(System.IO.BinaryReader reader, {{{globalName}}} row) { {{{string.Join( "\n", @@ -1022,16 +1112,16 @@ v.Scheduled is { } scheduled /// This reads datastore metadata, so it runs in constant time. /// It also takes into account modifications by the current transaction. /// - public ulong Count => {{{iTable}}}.DoCount(); - public IEnumerable<{{{globalName}}}> Iter() => {{{iTable}}}.DoIter(); - public {{{globalName}}} Insert({{{globalName}}} row) => {{{iTable}}}.DoInsert(row); - public bool Delete({{{globalName}}} row) => {{{iTable}}}.DoDelete(row); - public ulong Clear() => {{{iTable}}}.DoClear(); + public ulong Count => {{{iTable}}}.DoCount({{{tableArgument}}}); + public IEnumerable<{{{globalName}}}> Iter() => {{{iTable}}}.DoIter({{{tableArgument}}}); + public {{{globalName}}} Insert({{{globalName}}} row) => {{{iTable}}}.DoInsert({{{rowArgument}}}); + public bool Delete({{{globalName}}} row) => {{{iTable}}}.DoDelete({{{rowArgument}}}); + public ulong Clear() => {{{iTable}}}.DoClear({{{tableArgument}}}); {{{string.Join("\n", GenerateTableAccessorFilters(v))}}} } """, - $"{SyntaxFacts.GetText(Visibility)} global::{TableHandlesNamespace}.{accessorIdentifier} {accessorIdentifier} => new();" + $"{SyntaxFacts.GetText(Visibility)} global::{TableHandlesNamespace}.{accessorIdentifier} {accessorIdentifier} => {(sharedContexts ? $"global::{TableHandlesNamespace}.{accessorIdentifier}.__GetInstance(global::SpacetimeDB.Internal.Module.GetInstanceId(db))" : "new()")};" ); } } @@ -1064,10 +1154,10 @@ public IEnumerable GenerateReadOnlyAccessors() {{{visibility}}} sealed class {{{accessorIdentifier}}}ReadOnly : global::SpacetimeDB.Internal.ReadOnlyTableView<{{{globalName}}}> { - {{{HandleLookupNameCache(accessorIdentifier + "ReadOnly", accessor.Name)}}} - internal {{{accessorIdentifier}}}ReadOnly() : base({{{HandleLookupName( + {{{(sharedContexts ? HandleCache(accessorIdentifier + "ReadOnly") : "")}}} + internal {{{accessorIdentifier}}}ReadOnly({{{(sharedContexts ? "int instanceId" : "")}}}) : base({{{HandleLookupName( accessor.Name - )}}}) { } + )}}}) { {{{(sharedContexts ? "__instanceId = instanceId;" : "")}}} } /// /// Returns the number of rows in this table. @@ -1080,7 +1170,7 @@ public IEnumerable GenerateReadOnlyAccessors() {{{readOnlyIndexDecls}}} } """, - $"{visibility} global::{ViewHandlesNamespace}.{accessorIdentifier}ReadOnly {accessorIdentifier} => new();" + $"{visibility} global::{ViewHandlesNamespace}.{accessorIdentifier}ReadOnly {accessorIdentifier} => {(sharedContexts ? $"global::{ViewHandlesNamespace}.{accessorIdentifier}ReadOnly.__GetInstance(global::SpacetimeDB.Internal.Module.GetInstanceId(db))" : "new()")};" ); } } @@ -1167,22 +1257,29 @@ string IxColInit(ColumnDeclaration col) ? $$""" public static partial class AssemblyDescriptor { - private static class {{accessorIdentifier}}SqlNameCache + private static global::SpacetimeDB.SqlTableName?[] {{accessorIdentifier}}SqlNames => field ??= new global::SpacetimeDB.SqlTableName?[global::SpacetimeDB.Internal.Module.InstanceCount]; + + private static global::SpacetimeDB.SqlTableName {{accessorIdentifier}}SqlName(int contextInstance) { - internal static readonly global::SpacetimeDB.SqlTableName Name = - global::SpacetimeDB.Internal.Module.ResolveSqlName({{SymbolDisplay.FormatLiteral( + var names = {{accessorIdentifier}}SqlNames; + if (names[contextInstance] is { } name) + { + return name; + } + var instanceId = global::SpacetimeDB.Internal.Module.ResolveInstance(contextInstance, {{SymbolDisplay.FormatLiteral( assemblyIdentity, true - )}}, {{SymbolDisplay.FormatLiteral(tableName, true)}}); - // Prevent eager initialization before the root installs namespace placements. - static {{accessorIdentifier}}SqlNameCache() { } + )}}); + var resolvedName = names[instanceId] ??= global::SpacetimeDB.Internal.Module.ResolveSqlName(instanceId, {{SymbolDisplay.FormatLiteral(tableName, true)}}); + names[contextInstance] = resolvedName; + return resolvedName; } public readonly partial struct Queries { {{vis}} {{queryType}} {{accessorIdentifier}}() { - var tableName = {{accessorIdentifier}}SqlNameCache.Name; + var tableName = {{accessorIdentifier}}SqlName(__instanceId); return new(tableName, new {{colsTypeName}}(tableName), new {{ixColsTypeName}}(tableName)); } } @@ -1192,7 +1289,7 @@ public static partial class QueryTableExtensions { extension(global::SpacetimeDB.QueryBuilder from) { - {{vis}} {{queryType}} {{accessorIdentifier}}() => new AssemblyDescriptor.Queries().{{accessorIdentifier}}(); + {{vis}} {{queryType}} {{accessorIdentifier}}() => new AssemblyDescriptor.Queries(global::SpacetimeDB.Internal.Module.GetInstanceId(from)).{{accessorIdentifier}}(); } } """ @@ -1805,19 +1902,14 @@ public Scope.Extensions GenerateSchedule() var cacheName = $"__Schedule{Name}Name"; extensions.Contents.Append( $$""" - private static class {{cacheName}} - { - internal static readonly string Name = global::SpacetimeDB.Internal.Module.ResolveFunctionName({{SymbolDisplay.FormatLiteral( + private static string {{cacheName}} => field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName({{SymbolDisplay.FormatLiteral( declaringAssembly, true )}}, nameof({{Identifier}}), {{(string.IsNullOrEmpty(CanonicalName) ? "null" : SymbolDisplay.FormatLiteral(CanonicalName!, true))}}); - // Prevent eager initialization before the root installs namespace placements. - static {{cacheName}}() { } - } """ ); - functionName = cacheName + ".Name"; + functionName = cacheName; } // Mark the API as unstable. We use name `STDB_UNSTABLE` because: @@ -1842,6 +1934,20 @@ private static class {{cacheName}} """ ); + if (declaringAssembly is not null) + { + extensions.Contents.Append( + ImmediateSchedule.GenerateContextOverload( + Name, + Identifier, + declaringAssembly, + CanonicalName, + Args, + "SpacetimeDB.Internal.IReducer" + ) + ); + } + return extensions; } } @@ -2052,19 +2158,14 @@ public Scope.Extensions GenerateSchedule() var cacheName = $"__Schedule{Name}Name"; extensions.Contents.Append( $$""" - private static class {{cacheName}} - { - internal static readonly string Name = global::SpacetimeDB.Internal.Module.ResolveFunctionName({{SymbolDisplay.FormatLiteral( + private static string {{cacheName}} => field ??= global::SpacetimeDB.Internal.Module.ResolveFunctionName({{SymbolDisplay.FormatLiteral( declaringAssembly, true )}}, nameof({{Identifier}}), {{(string.IsNullOrEmpty(CanonicalName) ? "null" : SymbolDisplay.FormatLiteral(CanonicalName!, true))}}); - // Prevent eager initialization before the root installs namespace placements. - static {{cacheName}}() { } - } """ ); - functionName = cacheName + ".Name"; + functionName = cacheName; } // Mark the API as unstable. We use name `STDB_UNSTABLE` because: @@ -2089,6 +2190,20 @@ private static class {{cacheName}} """ ); + if (declaringAssembly is not null) + { + extensions.Contents.Append( + ImmediateSchedule.GenerateContextOverload( + Name, + Identifier, + declaringAssembly, + CanonicalName, + Args, + "SpacetimeDB.Internal.ProcedureExtensions" + ) + ); + } + return extensions; } } @@ -2270,7 +2385,7 @@ record AssemblyTableAccessor(string Name, string TypeName); record AssemblyDeclaration( string Identity, string DescriptorTypeName, - bool DeclaresMounts, + EquatableArray Mounts, string RootOnlyDeclarations, string? CaseConversionPolicy, EquatableArray Tables, @@ -2308,8 +2423,187 @@ internal static string AssemblyNamespace(IAssemblySymbol assembly) private static string IndentGeneratedCode(string code, int spaces) => code.Replace("\n", "\n" + new string(' ', spaces)); + private static bool NeedsNamespaceContainer(CompositionNode node) => + node.Children.Array.Length != 0 || node.Contributors.Array.Length > 1; + + private static string NamespaceContainerType( + CompositionNode node, + string container, + string extensionNamespace, + Dictionary assemblies + ) => + NeedsNamespaceContainer(node) + ? $"global::{extensionNamespace}.NamespaceAccessors.Scope{node.Id}.{container}" + : $"{assemblies[node.Contributors.Array[0]].DescriptorTypeName}.{container}"; + + private static string GenerateNamespaceContainers( + IEnumerable nodes, + string extensionNamespace, + Dictionary assemblies, + SourceProductionContext context + ) + { + var scopes = new List(); + foreach (var node in nodes.Where(node => node.Id != 0 && NeedsNamespaceContainer(node))) + { + var containers = new List(); + foreach (var container in new[] { "Tables", "ReadOnlyTables", "Queries" }) + { + var members = new List(); + var used = new Dictionary(StringComparer.Ordinal) + { + ["Tables"] = "generated namespace container", + ["ReadOnlyTables"] = "generated namespace container", + ["Queries"] = "generated namespace container", + ["__instanceId"] = "generated instance field", + }; + foreach (var contributor in node.Contributors) + { + var assembly = assemblies[contributor]; + var tables = container switch + { + "Tables" => assembly.Tables, + "Queries" => assembly.Queries, + _ => assembly.ReadOnlyTables, + }; + var invocation = container == "Queries" ? "()" : ""; + foreach (var table in tables) + { + if (used.TryGetValue(table.Name, out var previous)) + { + if (container == "Tables") + { + context.ReportDiagnostic( + ErrorDescriptor.NamespaceAccessorCollision.ToDiag( + ($"{node.AccessorPath}.{table.Name}", previous, contributor) + ) + ); + } + continue; + } + used.Add(table.Name, contributor); + members.Add( + $"public {table.TypeName} {EscapeIdentifier(table.Name)}{invocation} => new {assembly.DescriptorTypeName}.{container}(__instanceId).{EscapeIdentifier(table.Name)}{invocation};" + ); + } + } + foreach (var child in node.Children) + { + var mount = child.Mount!; + if (used.TryGetValue(mount.Accessor, out var previous)) + { + if (container == "Tables") + { + context.ReportDiagnostic( + ErrorDescriptor.NamespaceAccessorCollision.ToDiag( + ( + $"{node.AccessorPath}.{mount.Accessor}", + previous, + mount.AssemblyIdentity + ) + ) + ); + } + continue; + } + used.Add(mount.Accessor, mount.AssemblyIdentity); + members.Add( + $"public {NamespaceContainerType(child, container, extensionNamespace, assemblies)} {mount.AccessorIdentifier} => new(NamespaceBindings.Child{child.Id}[__instanceId]);" + ); + } + containers.Add( + $$""" + public readonly struct {{container}} { + private readonly int __instanceId; + public {{container}}(int instanceId) { __instanceId = instanceId; } + {{IndentGeneratedCode(string.Join("\n", members), 4)}} + } + """ + ); + } + scopes.Add( + $$""" + public static class Scope{{node.Id}} { + {{IndentGeneratedCode(string.Join("\n", containers), 4)}} + } + """ + ); + } + return scopes.Count == 0 + ? "" + : $$""" + public static class NamespaceAccessors { + {{IndentGeneratedCode(string.Join("\n", scopes), 4)}} + } + """; + } + + private static string GenerateContextSelectors( + CompositionNode[] nodes, + SourceProductionContext context + ) + { + if (nodes.Length == 1) + { + return ""; + } + var scopes = new List(); + foreach (var node in nodes) + { + foreach (var child in node.Children) + { + var accessor = child.Mount!.Accessor; + if ( + accessor == "__context" + || accessor == "__instanceId" + || accessor == $"Scope{node.Id}" + ) + { + context.ReportDiagnostic( + ErrorDescriptor.NamespaceAccessorCollision.ToDiag( + ( + child.AccessorPath, + "generated context selector", + child.Mount.AssemblyIdentity + ) + ) + ); + } + } + var members = node.Children.Select( + (child, index) => + $"public Scope{child.Id} {child.Mount!.AccessorIdentifier} => new(__context, NamespaceBindings.{(node.Id == 0 ? $"Mount{index}" : $"Child{child.Id}")}[__instanceId]);" + ); + scopes.Add( + $$""" + public readonly struct Scope{{node.Id}} : global::SpacetimeDB.Internal.IModuleContext + where TContext : global::SpacetimeDB.Internal.IModuleContext + { + private readonly TContext __context; + private readonly int __instanceId; + int global::SpacetimeDB.Internal.IModuleContext.InstanceId => __instanceId; + public Scope{{node.Id}}(TContext context, int instanceId) { __context = context; __instanceId = instanceId; } + public static implicit operator TContext(Scope{{node.Id}} selection) => selection.__context.SelectInstance(selection.__instanceId); + {{IndentGeneratedCode(string.Join("\n", members), 4)}} + } + """ + ); + } + return $$""" + public static class ContextSelectors { + {{IndentGeneratedCode(string.Join("\n", scopes), 4)}} + extension(TContext context) + where TContext : global::SpacetimeDB.Internal.IModuleContext + { + public Scope0 As => new(context, context.InstanceId); + } + } + """; + } + private static EquatableArray DiscoverAssemblies( Compilation compilation, + DiagReporter diag, CancellationToken cancellationToken ) { @@ -2335,6 +2629,7 @@ tree.Options is CSharpParseOptions options compilation.SourceModule.ReferencedAssemblySymbols ); var assemblies = new List(); + var symbols = new Dictionary(StringComparer.Ordinal); while (pending.Count > 0) { cancellationToken.ThrowIfCancellationRequested(); @@ -2368,16 +2663,12 @@ marker is null continue; } + symbols.Add(assembly.Identity.ToString(), assembly); assemblies.Add( new AssemblyDeclaration( assembly.Identity.ToString(), descriptor.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), - assembly - .GetAttributes() - .Any(attribute => - attribute.AttributeClass?.ToDisplayString() - == "SpacetimeDB.NamespaceAttribute" - ), + new(ImmutableArray.Empty), descriptor .GetMembers("RootOnlyDeclarations") .OfType() @@ -2428,9 +2719,23 @@ EquatableArray ReadAccessors(string container) => ); } + // Read mounts after discovery so markers can target any descriptor-bearing dependency. return new( assemblies .OrderBy(assembly => assembly.Identity, StringComparer.Ordinal) + .Select(assembly => + assembly with + { + Mounts = NamespaceDeclaration.Parse( + compilation, + symbols[assembly.Identity], + symbols.Keys, + assembly.Tables.Select(table => table.Name), + diag, + cancellationToken + ), + } + ) .ToImmutableArray() ); } @@ -2856,7 +3161,28 @@ public void Initialize(IncrementalGeneratorInitializationContext context) ) ); - var referencedAssemblies = context.CompilationProvider.Select(DiscoverAssemblies); + var referencedAssemblies = context + .CompilationProvider.SelectMany( + (compilation, ct) => + new[] + { + DiagReporter.With( + Location.None, + diag => DiscoverAssemblies(compilation, diag, ct) + ), + } + ) + .ReportDiagnostics(context) + .WithTrackingName("SpacetimeDB.Assembly.Discover") + .Collect() + .Select( + (results, _) => + results.Length == 0 + ? new EquatableArray( + ImmutableArray.Empty + ) + : results.Single() + ); var namespaceDeclarations = context .CompilationProvider.Combine(referencedAssemblies) .Combine(tableDecls) @@ -2869,7 +3195,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) diag => NamespaceDeclaration.Parse( input.Left.Left, - input.Left.Right, + input.Left.Left.Assembly, + input.Left.Right.Select(assembly => assembly.Identity), input.Right.SelectMany(t => t.TableAccessors.Select(a => a.Name) ), @@ -2883,13 +3210,36 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .WithTrackingName("SpacetimeDB.Namespace.Parse") .Collect(); + var composition = extensionNamespace + .Combine(referencedAssemblies) + .Combine(namespaceDeclarations) + .SelectMany( + (input, ct) => + new[] + { + DiagReporter.With( + Location.None, + diag => + ModuleComposition.Build( + input.Left.Left.Identity, + input.Right.SelectMany(mounts => mounts), + input.Left.Right, + diag, + ct + ) + ), + } + ) + .ReportDiagnostics(context) + .WithTrackingName("SpacetimeDB.Composition.Build"); + // Register the generated source code with the compilation context as part of module publishing // Once the compilation is complete, the generated code will be used to create tables and reducers in the database context.RegisterSourceOutput( moduleOutputInputs .Combine(extensionNamespace) .Combine(referencedAssemblies) - .Combine(namespaceDeclarations), + .Combine(composition.Collect()), (context, input) => { var ( @@ -2906,55 +3256,71 @@ public void Initialize(IncrementalGeneratorInitializationContext context) ), assemblies ), - mounts + compositions ) = input; + if (compositions.Length != 1 || !compositions[0].IsValid) + { + return; + } + var tree = compositions[0]; var handlesNamespace = sharedContexts ? extensionNamespaceName : "SpacetimeDB.Internal"; - var mountByIdentity = mounts - .SelectMany(m => m) - .ToDictionary(m => m.AssemblyIdentity, StringComparer.Ordinal); - bool IsChild(AssemblyDeclaration assembly) => - mountByIdentity.TryGetValue(assembly.Identity, out var mount) - && !mount.Accessor.Equals("public", StringComparison.OrdinalIgnoreCase); - var publicScopeAssemblies = assemblies.Where(a => !IsChild(a)).ToArray(); - var mountedAssemblies = assemblies.Where(IsChild).ToArray(); - var registrationOrder = publicScopeAssemblies.Concat(mountedAssemblies).ToArray(); - foreach (var assembly in assemblies.Where(a => a.DeclaresMounts)) - context.ReportDiagnostic( - ErrorDescriptor.DependencyNamespaceMounts.ToDiag(assembly.Identity) - ); - foreach ( - var assembly in mountedAssemblies.Where(a => a.RootOnlyDeclarations.Length != 0) - ) - context.ReportDiagnostic( - ErrorDescriptor.MountedRootOnlyDeclarations.ToDiag( - ( - assembly.Identity, - mountByIdentity[assembly.Identity].Accessor, - assembly.RootOnlyDeclarations - ) - ) - ); + var nodes = tree.Nodes.ToArray(); + var assemblyByIdentity = assemblies.ToDictionary( + a => a.Identity, + StringComparer.Ordinal + ); + var publicScopeAssemblies = tree + .Root.Contributors.Skip(1) + .Select(contributor => assemblyByIdentity[contributor]) + .ToArray(); + foreach (var node in nodes.Skip(1)) + { + foreach (var contributor in node.Contributors) + { + var assembly = assemblyByIdentity[contributor]; + if (assembly.RootOnlyDeclarations.Length != 0) + { + context.ReportDiagnostic( + ErrorDescriptor.MountedRootOnlyDeclarations.ToDiag( + ( + assembly.Identity, + node.AccessorPath, + assembly.RootOnlyDeclarations + ) + ) + ); + } + } + } + + string Descriptor(string contributor) => + contributor == identity + ? $"global::{extensionNamespaceName}.AssemblyDescriptor" + : assemblyByIdentity[contributor].DescriptorTypeName; string GenerateDispatchRouting(string category, string arguments, string unknownId) { - // Match Main's registration order; each category has its own local IDs. - var descriptors = new[] - { - $"global::{extensionNamespaceName}.AssemblyDescriptor", - }.Concat( - ( - category == "HttpHandler" ? publicScopeAssemblies : registrationOrder - ).Select(assembly => assembly.DescriptorTypeName) - ); - var routes = descriptors.Select(descriptor => - $$""" - if ((uint)localId < (uint){{descriptor}}.{{category}}Count) - return {{descriptor}}.CallLocal{{category}}(localId, {{arguments}}); - localId -= {{descriptor}}.{{category}}Count; - """ - ); + // The host assigns IDs depth-first, independently for each category. + var routes = nodes + .Where(node => category != "HttpHandler" || node.Id == 0) + .SelectMany(node => + node.Contributors.Select(contributor => + (Descriptor: Descriptor(contributor), InstanceId: node.Id) + ) + ) + .Select(route => + $$""" + if ((uint)localId < (uint){{route.Descriptor}}.{{category}}Count) + return {{route.Descriptor}}.CallLocal{{category}}(localId, {{arguments}}{{( + sharedContexts && category != "HttpHandler" + ? $", {route.InstanceId}" + : "" + )}}); + localId -= {{route.Descriptor}}.{{category}}Count; + """ + ); return $"if (id < 0) {{ {unknownId} }}\nvar localId = id;\n" + string.Join("\n", routes) + "\n" @@ -2985,6 +3351,14 @@ string GenerateDispatchRouting(string category, string arguments, string unknown ) ) ); + if (nodes.Length > 1) + { + generatedNames.Add( + extensionNamespaceName, + "ContextSelectors", + "generated context selectors" + ); + } foreach (var table in tableAccessors) { var owner = $"table '{table.TableAccessorName}' on '{table.TableName}'"; @@ -3003,6 +3377,7 @@ string GenerateDispatchRouting(string category, string arguments, string unknown string ConsumerAccessors(string container) { + var receiver = container == "Queries" ? "from" : "db"; var members = new List(); var used = new Dictionary(StringComparer.Ordinal); foreach (var table in tableAccessors) @@ -3025,15 +3400,31 @@ void Add(string name, string owner, string declaration) used.Add(name, owner); members.Add(declaration); } - foreach (var assembly in assemblies) + var accessScopes = publicScopeAssemblies + .Select(assembly => + (Assembly: assembly, Child: (CompositionNode?)null, Index: 0) + ) + .Concat( + tree.Root.Children.Select( + (child, index) => + ( + Assembly: assemblyByIdentity[child.Contributors.Array[0]], + Child: (CompositionNode?)child, + Index: index + ) + ) + ) + .OrderBy(scope => scope.Assembly.Identity, StringComparer.Ordinal) + .ThenBy(scope => scope.Child?.Mount?.Accessor, StringComparer.Ordinal); + foreach (var (assembly, child, index) in accessScopes) { - if (IsChild(assembly)) + if (child is not null) { - var mount = mountByIdentity[assembly.Identity]; + var mount = child.Mount!; Add( mount.Accessor, assembly.Identity, - $"public {assembly.DescriptorTypeName}.{container} {mount.AccessorIdentifier} => new();" + $"public {NamespaceContainerType(child, container, extensionNamespaceName, assemblyByIdentity)} {mount.AccessorIdentifier} => new(NamespaceBindings.Mount{index}[global::SpacetimeDB.Internal.Module.GetInstanceId({receiver})]);" ); } else @@ -3049,7 +3440,7 @@ void Add(string name, string owner, string declaration) Add( table.Name, assembly.Identity, - $"public {table.TypeName} {EscapeIdentifier(table.Name)}{invocation} => new {assembly.DescriptorTypeName}.{container}().{EscapeIdentifier(table.Name)}{invocation};" + $"public {table.TypeName} {EscapeIdentifier(table.Name)}{invocation} => new {assembly.DescriptorTypeName}.{container}(global::SpacetimeDB.Internal.Module.GetInstanceId({receiver})).{EscapeIdentifier(table.Name)}{invocation};" ); } } @@ -3058,41 +3449,77 @@ void Add(string name, string owner, string declaration) var consumerWritableAccessors = ConsumerAccessors("Tables"); var consumerReadOnlyAccessors = ConsumerAccessors("ReadOnlyTables"); var consumerQueryAccessors = ConsumerAccessors("Queries"); + var namespaceContainers = GenerateNamespaceContainers( + nodes, + extensionNamespaceName, + assemblyByIdentity, + context + ); + var contextSelectors = GenerateContextSelectors(nodes, context); + var namespaceBindings = + tree.Root.Children.Array.Length == 0 + ? "" + : $$""" + internal static class NamespaceBindings { + static NamespaceBindings() { } + {{IndentGeneratedCode(string.Join("\n", tree.Root.Children.Select((child, index) => + $"internal static readonly global::SpacetimeDB.Internal.NamespaceBinding Mount{index} = new({SymbolDisplay.FormatLiteral(identity, true)}, {SymbolDisplay.FormatLiteral(child.Mount!.Accessor, true)});").Concat(nodes.Where(node => node.ParentId is not null and not 0).Select(node => + $"internal static readonly global::SpacetimeDB.Internal.NamespaceBinding Child{node.Id} = new(null, {SymbolDisplay.FormatLiteral(node.Mount!.Accessor, true)});"))), 4)}} + } + """; var declaredCasePolicy = settings.Array.Length == 1 ? settings.Array[0].CaseConversionPolicy : null; var rootCasePolicy = declaredCasePolicy ?? "SnakeCase"; + string Policy(CompositionNode node) => + node.Id == 0 + ? rootCasePolicy + : assemblyByIdentity[node.Contributors.Array[0]].CaseConversionPolicy + ?? "SnakeCase"; + string BuilderName(CompositionNode node) => + node.Id == 0 + ? "global::SpacetimeDB.Internal.Module.RootBuilder" + : $"child{node.Id - 1}"; + var compositionRegistration = new List { - "global::SpacetimeDB.Internal.Module.InstallNamespaces(new global::SpacetimeDB.Internal.NamespaceRegistry(" - + SymbolDisplay.FormatLiteral(identity, true) - + $", global::SpacetimeDB.CaseConversionPolicy.{rootCasePolicy}, new (string, string, string?, global::SpacetimeDB.CaseConversionPolicy)[] {{" - + string.Join( - ",", - mountByIdentity.Values.Select(m => - $"({SymbolDisplay.FormatLiteral(m.AssemblyIdentity, true)}, {SymbolDisplay.FormatLiteral(m.Accessor, true)}, {(m.Name is { } name ? SymbolDisplay.FormatLiteral(name, true) : "null")}, global::SpacetimeDB.CaseConversionPolicy.{assemblies.Array.Single(a => a.Identity == m.AssemblyIdentity).CaseConversionPolicy ?? "SnakeCase"})" + !sharedContexts + ? $"global::SpacetimeDB.Internal.Module.InstallNamespaces(new global::SpacetimeDB.Internal.NamespaceRegistry({SymbolDisplay.FormatLiteral(identity, true)}, global::SpacetimeDB.CaseConversionPolicy.{rootCasePolicy}, new (string, string, string?, global::SpacetimeDB.CaseConversionPolicy)[] {{}}));" + : "global::SpacetimeDB.Internal.Module.InstallNamespaces(new global::SpacetimeDB.Internal.NamespaceRegistry(new (int, string, string?, global::SpacetimeDB.CaseConversionPolicy, string[])[] {" + + string.Join( + ",", + nodes.Select(node => + $"({node.ParentId ?? -1}, {SymbolDisplay.FormatLiteral(node.Mount?.Accessor ?? "", true)}, {(node.Mount?.Name is { } name ? SymbolDisplay.FormatLiteral(name, true) : "null")}, global::SpacetimeDB.CaseConversionPolicy.{Policy(node)}, new string[] {{ {string.Join(",", node.Contributors.Select(contributor => SymbolDisplay.FormatLiteral(contributor, true)))} }})" + ) ) - ) - + "}));", - $"global::{extensionNamespaceName}.AssemblyDescriptor.Register(global::SpacetimeDB.Internal.Module.RootBuilder);", + + "}));", }; - foreach (var assembly in publicScopeAssemblies) - compositionRegistration.Add( - $"{assembly.DescriptorTypeName}.Register(global::SpacetimeDB.Internal.Module.RootBuilder);" - ); - for (var i = 0; i < mountedAssemblies.Length; i++) + foreach (var node in nodes) { - var assembly = mountedAssemblies[i]; - compositionRegistration.Add( - $"var child{i} = new global::SpacetimeDB.Internal.ModuleBuilder();" - ); - compositionRegistration.Add( - $"{assembly.DescriptorTypeName}.Register(child{i});" - ); - compositionRegistration.Add( - $"global::SpacetimeDB.Internal.Module.RootBuilder.RegisterSubmodule({SymbolDisplay.FormatLiteral(mountByIdentity[assembly.Identity].Accessor, true)}, {(mountByIdentity[assembly.Identity].Name is { } name ? SymbolDisplay.FormatLiteral(name, true) : "null")}, child{i});" - ); + if (node.Id != 0) + { + compositionRegistration.Add( + $"var {BuilderName(node)} = new global::SpacetimeDB.Internal.ModuleBuilder();" + ); + } + foreach (var contributor in node.Contributors) + { + compositionRegistration.Add( + $"{Descriptor(contributor)}.Register({BuilderName(node)});" + ); + } + } + // RegisterSubmodule takes a snapshot: finish descendants before attaching them. + foreach (var node in Enumerable.Reverse(nodes)) + { + foreach (var child in node.Children) + { + var mount = child.Mount!; + compositionRegistration.Add( + $"{BuilderName(node)}.RegisterSubmodule({SymbolDisplay.FormatLiteral(mount.Accessor, true)}, {(mount.Name is { } name ? SymbolDisplay.FormatLiteral(name, true) : "null")}, {BuilderName(child)});" + ); + } } if (settings.Array.Length > 1) @@ -3114,22 +3541,35 @@ void Add(string name, string owner, string declaration) } // A shared typespace also has one naming policy. Unspecified dependency - // settings inherit the root policy, whose host default is SnakeCase. - foreach (var assembly in publicScopeAssemblies) + // settings inherit their containing scope's policy (SnakeCase by default). + foreach (var node in nodes) { - if ( - assembly.CaseConversionPolicy is { } dependencyPolicy - && dependencyPolicy != rootCasePolicy - ) + foreach (var contributor in node.Contributors.Skip(1)) { - context.ReportDiagnostic( - ErrorDescriptor.ConflictingCaseConversionPolicies.ToDiag( - (identity, rootCasePolicy, assembly.Identity, dependencyPolicy) - ) - ); + var assembly = assemblyByIdentity[contributor]; + if ( + assembly.CaseConversionPolicy is { } dependencyPolicy + && dependencyPolicy != Policy(node) + ) + { + context.ReportDiagnostic( + ErrorDescriptor.ConflictingCaseConversionPolicies.ToDiag( + ( + node.Id == 0 ? "public" : node.AccessorPath, + node.Contributors.Array[0], + Policy(node), + assembly.Identity, + dependencyPolicy + ) + ) + ); + } } } + var instanceParameter = sharedContexts ? ",\nint instanceId = 0" : ""; + var instanceArgument = sharedContexts ? ", instanceId" : ""; + var settingsRegistration = declaredCasePolicy is { } policyName ? $"builder.SetCaseConversionPolicy(SpacetimeDB.CaseConversionPolicy.{policyName});" : string.Empty; @@ -3481,6 +3921,7 @@ internal AnonymousViewContext(Internal.LocalReadOnly db) #if NET10_0_OR_GREATER namespace {{extensionNamespaceName}} { + {{IndentGeneratedCode(namespaceBindings + (namespaceContainers.Length == 0 ? "" : "\n" + namespaceContainers) + (contextSelectors.Length == 0 ? "" : "\n" + contextSelectors), 4)}} public static partial class AssemblyDescriptor { public const string? CaseConversionPolicy = {{(declaredCasePolicy is null ? "null" : SymbolDisplay.FormatLiteral(declaredCasePolicy, true))}}; public const string RootOnlyDeclarations = {{SymbolDisplay.FormatLiteral(string.Join(", ", new[] { @@ -3506,9 +3947,9 @@ public static partial class AssemblyDescriptor { ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink error + global::SpacetimeDB.Internal.BytesSink error{{IndentGeneratedCode(instanceParameter, 12)}} ) => global::ModuleRegistration.CallLocalReducer( - id, sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, error + id, sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, error{{instanceArgument}} ); public static global::SpacetimeDB.Internal.Errno CallLocalProcedure( @@ -3521,9 +3962,9 @@ public static partial class AssemblyDescriptor { ulong conn_id_1, global::SpacetimeDB.Timestamp timestamp, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink result_sink + global::SpacetimeDB.Internal.BytesSink result_sink{{IndentGeneratedCode(instanceParameter, 12)}} ) => global::ModuleRegistration.CallLocalProcedure( - id, sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, result_sink + id, sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, result_sink{{instanceArgument}} ); public static global::SpacetimeDB.Internal.Errno CallLocalHttpHandler( @@ -3549,17 +3990,17 @@ public static partial class AssemblyDescriptor { ulong sender_2, ulong sender_3, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink + global::SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 12)}} ) => global::ModuleRegistration.CallLocalView( - id, sender_0, sender_1, sender_2, sender_3, args, sink + id, sender_0, sender_1, sender_2, sender_3, args, sink{{instanceArgument}} ); public static global::SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, global::SpacetimeDB.Internal.BytesSource args, - global::SpacetimeDB.Internal.BytesSink sink + global::SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 12)}} ) => global::ModuleRegistration.CallLocalAnonymousView( - id, args, sink + id, args, sink{{instanceArgument}} ); public static void Register( @@ -3567,14 +4008,18 @@ public static void Register( => global::ModuleRegistration.Register(builder); public readonly struct Tables { - {{IndentGeneratedCode(string.Join("\n", tableAccessors.Select(v => v.Getter)), 12)}} + {{IndentGeneratedCode(sharedContexts ? "private readonly int __instanceId;\npublic Tables(int instanceId) { __instanceId = instanceId; }" : "", 12)}} + {{IndentGeneratedCode(string.Join("\n", tableAccessors.Select(v => v.Getter.Replace("global::SpacetimeDB.Internal.Module.GetInstanceId(db)", "__instanceId"))), 12)}} } public readonly struct ReadOnlyTables { - {{IndentGeneratedCode(string.Join("\n", readOnlyAccessors.Select(v => v.ReadOnlyGetter)), 12)}} + {{IndentGeneratedCode(sharedContexts ? "private readonly int __instanceId;\npublic ReadOnlyTables(int instanceId) { __instanceId = instanceId; }" : "", 12)}} + {{IndentGeneratedCode(string.Join("\n", readOnlyAccessors.Select(v => v.ReadOnlyGetter.Replace("global::SpacetimeDB.Internal.Module.GetInstanceId(db)", "__instanceId"))), 12)}} } - public readonly partial struct Queries { } + public readonly partial struct Queries { + {{IndentGeneratedCode(sharedContexts ? "private readonly int __instanceId;\npublic Queries(int instanceId) { __instanceId = instanceId; }" : "", 12)}} + } } public static class LocalTableExtensions { extension(global::SpacetimeDB.Local db) { @@ -3760,10 +4205,10 @@ internal static void Register( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error{{IndentGeneratedCode(instanceParameter, 4)}} ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateReducerContext(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp); + var ctx = SpacetimeDB.Internal.Module.CreateReducerContext(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp{{instanceArgument}}); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref reducerArgsBuffer); using var reader = new System.IO.BinaryReader(stream); {{EscapeIdentifier(r.Name)}}.Invoke(reader, ctx); @@ -3790,10 +4235,10 @@ SpacetimeDB.Internal.BytesSink error ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink{{IndentGeneratedCode(instanceParameter, 4)}} ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateProcedureContext(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp); + var ctx = SpacetimeDB.Internal.Module.CreateProcedureContext(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp{{instanceArgument}}); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref procedureArgsBuffer); using var reader = new System.IO.BinaryReader(stream); var bytes = {{EscapeIdentifier(p.Name)}}.Invoke(reader, ctx); @@ -3852,10 +4297,10 @@ SpacetimeDB.Internal.BytesSink response_body_sink ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 4)}} ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateViewContext(sender_0, sender_1, sender_2, sender_3); + var ctx = SpacetimeDB.Internal.Module.CreateViewContext(sender_0, sender_1, sender_2, sender_3{{instanceArgument}}); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref viewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); var bytes = {{v.Name}}ViewDispatcher.Invoke(reader, ctx); @@ -3876,10 +4321,10 @@ SpacetimeDB.Internal.BytesSink sink $$""" private static SpacetimeDB.Internal.Errno __call_view_anon_{{i}}( SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 4)}} ) { try { - var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext(); + var ctx = SpacetimeDB.Internal.Module.CreateAnonymousViewContext({{(sharedContexts ? "instanceId" : "")}}); using var stream = SpacetimeDB.Internal.Module.ConsumeBytes(args, ref anonymousViewArgsBuffer); using var reader = new System.IO.BinaryReader(stream); var bytes = {{v.Name}}ViewDispatcher.Invoke(reader, ctx); @@ -3926,12 +4371,12 @@ internal static SpacetimeDB.Internal.Errno CallLocalReducer( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink error + SpacetimeDB.Internal.BytesSink error{{IndentGeneratedCode(instanceParameter, 8)}} ) => id switch { {{IndentGeneratedCode(string.Join( "\n", addReducers.Select((r, i) => - $"{i} => __call_reducer_{i}(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, error)," + $"{i} => __call_reducer_{i}(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, error{instanceArgument})," ) ), 8)}} _ => SpacetimeDB.Internal.Module.WriteReducerError(error, new System.ArgumentOutOfRangeException(nameof(id), id, "Unknown reducer id")) @@ -3969,12 +4414,12 @@ internal static SpacetimeDB.Internal.Errno CallLocalProcedure( ulong conn_id_1, SpacetimeDB.Timestamp timestamp, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink result_sink + SpacetimeDB.Internal.BytesSink result_sink{{IndentGeneratedCode(instanceParameter, 8)}} ) => id switch { {{IndentGeneratedCode(string.Join( "\n", addProcedures.Select((p, i) => - $"{i} => __call_procedure_{i}(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, result_sink)," + $"{i} => __call_procedure_{i}(sender_0, sender_1, sender_2, sender_3, conn_id_0, conn_id_1, timestamp, args, result_sink{instanceArgument})," ) ), 8)}} _ => throw new System.ArgumentOutOfRangeException(nameof(id), id, "Unknown procedure id") @@ -4051,12 +4496,12 @@ internal static SpacetimeDB.Internal.Errno CallLocalView( ulong sender_2, ulong sender_3, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 8)}} ) => id switch { {{IndentGeneratedCode(string.Join("\n", views.Array.Where(v => !v.IsAnonymous) .Select((v, i) => - $"{i} => __call_view_{i}(sender_0, sender_1, sender_2, sender_3, args, sink)," + $"{i} => __call_view_{i}(sender_0, sender_1, sender_2, sender_3, args, sink{instanceArgument})," ) ), 8)}} _ => UnknownViewId(id) @@ -4080,12 +4525,12 @@ SpacetimeDB.Internal.BytesSink sink internal static SpacetimeDB.Internal.Errno CallLocalAnonymousView( int id, SpacetimeDB.Internal.BytesSource args, - SpacetimeDB.Internal.BytesSink sink + SpacetimeDB.Internal.BytesSink sink{{IndentGeneratedCode(instanceParameter, 8)}} ) => id switch { {{IndentGeneratedCode(string.Join("\n", views.Array.Where(v => v.IsAnonymous) .Select((v, i) => - $"{i} => __call_view_anon_{i}(args, sink)," + $"{i} => __call_view_anon_{i}(args, sink{instanceArgument})," ) ), 8)}} _ => UnknownAnonymousViewId(id) diff --git a/crates/bindings-csharp/Codegen/ModuleComposition.cs b/crates/bindings-csharp/Codegen/ModuleComposition.cs new file mode 100644 index 00000000000..daec9e546b3 --- /dev/null +++ b/crates/bindings-csharp/Codegen/ModuleComposition.cs @@ -0,0 +1,230 @@ +namespace SpacetimeDB.Codegen; + +using System.Collections.Immutable; +using static Utils; + +// A node is one schema scope. Public contributions share it; named mounts create children. +internal record CompositionNode( + int Id, + int? ParentId, + string AccessorPath, + NamespaceDeclaration? Mount, + EquatableArray Contributors, + EquatableArray Children +); + +internal record ModuleComposition(CompositionNode Root, bool IsValid) +{ + public IEnumerable Nodes => Traverse(Root); + + private static IEnumerable Traverse(CompositionNode node) + { + yield return node; + foreach (var child in node.Children) + { + foreach (var descendant in Traverse(child)) + { + yield return descendant; + } + } + } + + public static ModuleComposition Build( + string rootIdentity, + IEnumerable rootMounts, + IEnumerable dependencies, + DiagReporter diag, + CancellationToken cancellationToken + ) => new Builder(rootIdentity, rootMounts, dependencies, diag, cancellationToken).Build(); + + private sealed class Builder( + string rootIdentity, + IEnumerable rootMounts, + IEnumerable dependencies, + DiagReporter diag, + CancellationToken cancellationToken + ) + { + private readonly Dictionary declarations = + dependencies.ToDictionary( + a => a.Identity, + a => a.Mounts.ToArray(), + StringComparer.Ordinal + ); + private bool valid = true; + private int nextId; + + public ModuleComposition Build() + { + declarations.Add(rootIdentity, [.. rootMounts]); + var visited = new HashSet(StringComparer.Ordinal); + foreach ( + var identity in declarations.Keys.OrderBy( + identity => identity, + StringComparer.Ordinal + ) + ) + { + CheckCycles(identity, visited, []); + } + + if (!valid) + { + return new( + new( + 0, + null, + "", + null, + new(ImmutableArray.Create(rootIdentity)), + new(ImmutableArray.Empty) + ), + false + ); + } + + // Discovery is deduplicated by assembly; composition is not. A mount target + // belongs to its declared locations, not also to the automatic public set. + var targets = new HashSet( + declarations + .Values.SelectMany(mounts => mounts) + .Select(mount => mount.AssemblyIdentity), + StringComparer.Ordinal + ); + var publicDependencies = declarations + .Keys.Where(identity => identity != rootIdentity && !targets.Contains(identity)) + .OrderBy(identity => identity, StringComparer.Ordinal); + var root = BuildNode(null, null, "", new[] { rootIdentity }.Concat(publicDependencies)); + return new(root, valid); + } + + private void CheckCycles(string identity, HashSet visited, List ancestors) + { + cancellationToken.ThrowIfCancellationRequested(); + if (ancestors.Contains(identity)) + { + Report( + $"Namespace mount cycle: {string.Join(" -> ", ancestors.Concat([identity]))}." + ); + return; + } + if (!visited.Add(identity)) + { + return; + } + + ancestors.Add(identity); + foreach (var mount in declarations[identity]) + { + CheckCycles(mount.AssemblyIdentity, visited, ancestors); + } + ancestors.RemoveAt(ancestors.Count - 1); + } + + private CompositionNode BuildNode( + int? parentId, + NamespaceDeclaration? mount, + string path, + IEnumerable initialContributors + ) + { + cancellationToken.ThrowIfCancellationRequested(); + var id = nextId++; + var contributors = new HashSet(StringComparer.Ordinal); + var pending = new Queue(initialContributors); + var first = pending.Peek(); + var childMounts = new List(); + while (pending.Count != 0) + { + var identity = pending.Dequeue(); + if (!contributors.Add(identity)) + { + continue; + } + foreach (var declaration in declarations[identity]) + { + if (declaration.Accessor.Equals("public", StringComparison.OrdinalIgnoreCase)) + { + pending.Enqueue(declaration.AssemblyIdentity); + } + else + { + childMounts.Add(declaration); + } + } + } + + var accessors = new Dictionary( + StringComparer.OrdinalIgnoreCase + ); + var names = new Dictionary(StringComparer.Ordinal); + var children = ImmutableArray.CreateBuilder(); + // Preserve the existing one-level registration order. Additional mounts of + // the same assembly are ordered by accessor, independently of reference order. + foreach ( + var child in childMounts + .OrderBy(m => m.AssemblyIdentity, StringComparer.Ordinal) + .ThenBy(m => m.Accessor, StringComparer.Ordinal) + ) + { + CheckSiblingName(accessors, child.Accessor, child, path, "accessor"); + if (child.Name is { } name) + { + // Do not reproduce the host's case-conversion policy here. + CheckSiblingName(names, name, child, path, "explicit database name"); + } + children.Add( + BuildNode( + id, + child, + path.Length == 0 ? child.Accessor : path + "." + child.Accessor, + [child.AssemblyIdentity] + ) + ); + } + + return new( + id, + parentId, + path, + mount, + new( + new[] { first } + .Concat( + contributors + .Where(identity => identity != first) + .OrderBy(identity => identity, StringComparer.Ordinal) + ) + .ToImmutableArray() + ), + new(children.ToImmutable()) + ); + } + + private void CheckSiblingName( + Dictionary names, + string name, + NamespaceDeclaration mount, + string path, + string kind + ) + { + if (names.TryGetValue(name, out var previous)) + { + Report( + $"Namespace {kind} '{name}' in scope '{(path.Length == 0 ? "public" : path)}' is contributed by both '{previous.DeclaringAssemblyIdentity}' and '{mount.DeclaringAssemblyIdentity}'." + ); + } + else + { + names.Add(name, mount); + } + } + + private void Report(string message) + { + valid = false; + diag.Report(ErrorDescriptor.InvalidNamespaceComposition, message); + } + } +} diff --git a/crates/bindings-csharp/Codegen/NamespaceDeclaration.cs b/crates/bindings-csharp/Codegen/NamespaceDeclaration.cs index beaace7d237..f05b8e1998d 100644 --- a/crates/bindings-csharp/Codegen/NamespaceDeclaration.cs +++ b/crates/bindings-csharp/Codegen/NamespaceDeclaration.cs @@ -6,13 +6,19 @@ namespace SpacetimeDB.Codegen; using Microsoft.CodeAnalysis.CSharp; using static Utils; -internal record NamespaceDeclaration(string AssemblyIdentity, string Accessor, string? Name) +internal record NamespaceDeclaration( + string DeclaringAssemblyIdentity, + string AssemblyIdentity, + string Accessor, + string? Name +) { public string AccessorIdentifier => EscapeIdentifier(Accessor); public static EquatableArray Parse( Compilation compilation, - EquatableArray assemblies, + IAssemblySymbol declaringAssembly, + IEnumerable knownAssemblyIdentities, IEnumerable tableAccessors, DiagReporter diag, CancellationToken cancellationToken @@ -25,21 +31,22 @@ CancellationToken cancellationToken return new EquatableArray(result.ToImmutable()); } - var identities = new Dictionary(StringComparer.Ordinal); var accessors = new Dictionary(StringComparer.OrdinalIgnoreCase); var tables = new HashSet(tableAccessors, StringComparer.Ordinal); var assemblyIdentities = new HashSet( - assemblies.Select(static assembly => assembly.Identity), + knownAssemblyIdentities, StringComparer.Ordinal ); - var supported = compilation.SyntaxTrees.Any(static tree => - tree.Options is CSharpParseOptions options - && options.PreprocessorSymbolNames.Contains("NET10_0_OR_GREATER") - // Use the numeric value to keep the analyzer compatible with Roslyn 4.3. - && (int)options.LanguageVersion >= 1400 - ); + var supported = + !SymbolEqualityComparer.Default.Equals(declaringAssembly, compilation.Assembly) + || compilation.SyntaxTrees.Any(static tree => + tree.Options is CSharpParseOptions options + && options.PreprocessorSymbolNames.Contains("NET10_0_OR_GREATER") + // Use the numeric value to keep the analyzer compatible with Roslyn 4.3. + && (int)options.LanguageVersion >= 1400 + ); - foreach (var attribute in compilation.Assembly.GetAttributes()) + foreach (var attribute in declaringAssembly.GetAttributes()) { cancellationToken.ThrowIfCancellationRequested(); if (!SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, attributeType)) @@ -73,14 +80,14 @@ tree.Options is CSharpParseOptions options } var identity = marker.ContainingAssembly.Identity.ToString(); - if ( - SymbolEqualityComparer.Default.Equals( - marker.ContainingAssembly, - compilation.Assembly - ) - ) + if (SymbolEqualityComparer.Default.Equals(marker.ContainingAssembly, declaringAssembly)) { - ReportError(diag, attribute, ref valid, "The root assembly cannot mount itself."); + ReportError( + diag, + attribute, + ref valid, + $"Assembly '{declaringAssembly.Identity}' cannot mount itself." + ); } else if (supported && !assemblyIdentities.Contains(identity)) { @@ -136,14 +143,6 @@ as string } } - CheckDuplicate( - diag, - attribute, - ref valid, - identities, - identity, - $"Assembly '{identity}' may only be mounted once." - ); if (accessor.Length > 0) { CheckDuplicate( @@ -152,7 +151,7 @@ as string ref valid, accessors, accessor, - $"Namespace accessor '{accessor}' is declared more than once (case-insensitive)." + $"Namespace accessor '{accessor}' is declared more than once (case-insensitive) in assembly '{declaringAssembly.Identity}'." ); } @@ -162,7 +161,7 @@ as string diag, attribute, ref valid, - $"Namespace accessor '{accessor}' conflicts with a root table accessor." + $"Namespace accessor '{accessor}' conflicts with a table accessor in assembly '{declaringAssembly.Identity}'." ); } @@ -178,7 +177,14 @@ as string if (valid) { - result.Add(new NamespaceDeclaration(identity, accessor, name)); + result.Add( + new NamespaceDeclaration( + declaringAssembly.Identity.ToString(), + identity, + accessor, + name + ) + ); } } return new EquatableArray(result.ToImmutable()); diff --git a/crates/bindings-csharp/README.md b/crates/bindings-csharp/README.md index 6a5d5054cd4..0ce99447461 100644 --- a/crates/bindings-csharp/README.md +++ b/crates/bindings-csharp/README.md @@ -31,7 +31,7 @@ Reference another C# module with a normal `ProjectReference` (or a package containing its compiled module assembly). No root/library build-role property is required: the same dependency can also be published independently. Descriptor-bearing dependencies, including transitive dependencies, register -automatically once in `public` unless the root assigns a namespace: +automatically in root `public` unless targeted by a namespace declaration: ```csharp [assembly: SpacetimeDB.Namespace(typeof(AuthLib.Marker), Accessor = "MyAuth", Name = "auth_data")] @@ -52,21 +52,81 @@ context and transaction; a namespace is not a security boundary between helpers. For this example, raw SQL uses `auth_data.auth_users`, while generated clients use `conn.Db.MyAuth.User` and `q.From.MyAuth.User()`. Generated client queries and network calls use the canonical database names automatically. -When `Name` is omitted, the host applies the root module's case-conversion policy +When `Name` is omitted, the host applies the containing module's case-conversion policy to the accessor: with the default `SnakeCase` policy, `MyAuth` becomes `my_auth`. An explicit `Name` is used as supplied, without case conversion. +#### Nested submodules + +A dependency may declare its own namespace attributes. For example, if root +mounts Auth and Auth mounts Audit, root can access `ctx.Db.Auth.Audit.User`. +Mounting the same Audit assembly elsewhere creates separate tables, not an alias +for Auth's tables. Dispatch supplies each reducer, procedure, and view with its +own instance's table handles. Public contributions add no path segment. + +Module query builders follow the same paths: root can use +`ctx.From.Auth.Audit.User()`, while Audit uses `ctx.From.User()`. The query +receiver carries the current instance, and resolved SQL names are cached per +table and instance, so repeated copies query their own tables. + +Use `As` when passing a context to a C# method that must address a particular +copy of a library: + +```csharp +Audit.Functions.Write(ctx.As.Auth.Audit); +Audit.Functions.Write(ctx.As.DirectAudit); +``` + +Here `Auth`, `Audit`, and `DirectAudit` are mount accessors. The called method +keeps its ordinary context parameter and library-local `ctx.Db`/`ctx.From` +expressions. Selection preserves the context type, including read-only view +contexts, and does not modify the caller. It shares sender/auth, RNG, UUID +counter, and transaction state; it does not start a transaction or invoke a host +function. Procedure and handler contexts keep their existing `WithTx` behavior. + +To keep a selected context in a local variable, specify its context type, for +example `ReducerContext audit = ctx.As.Auth.Audit;`. With `var`, the value is the +generated path selector, not the context. Traversing the path uses value types; +conversion to a different instance creates a context wrapper. Database receivers +are cached per instance. Reuse a typed local when making repeated calls to the +same instance. + +Generated clients expose the same full accessor paths on `Db`, `Reducers`, +`Procedures`, and `q.From`. + +See [nested-namespace-test-cs](../../modules/nested-namespace-test-cs/) and its +[client regression](../../sdks/csharp/examples~/regression-tests/nested-namespaces/). + +Immediate scheduling accepts a context or a selected path on .NET 10: + +```csharp +Audit.Functions.VolatileNonatomicScheduleImmediateTick(ctx.As.Auth.Audit, value); +``` + +Inside Audit, pass `ctx` to schedule against the current instance. This works for +both reducers and procedures. The canonical function name is resolved once and +cached for that instance. Passing a path selector does not create a context +wrapper. The existing overload without a context still works when the assembly +has a single placement; it cannot choose between repeated placements. +These APIs remain experimental, best-effort, non-durable, and non-atomic with +the caller's transaction. They do not replace scheduled tables. + +Coexisting versions with the same simple assembly name are not covered by the +retained integration fixture. Repeated instances of one DLL do not establish +support for loading different versions together under NativeAOT. + #### Restrictions and limitations -- Only the consuming root chooses namespace placement. A dependency that itself - declares namespace mounts cannot be composed, even in `public`. Nested mounts, - multiple instances of one assembly, and runtime-created namespaces are unsupported. -- An assembly can be mounted only once, and the root cannot mount itself. - Omitting the attribute, or explicitly using `Accessor = "public"`, registers - the dependency in the default scope with flat accessors. -- Dependencies in `public` inherit the root's case-conversion policy (`SnakeCase` - by default). An explicitly different policy is a compilation error. Mount the - dependency in a named namespace to keep its independent naming policy. +- Dependencies may declare their own mounts. The same assembly can appear at + different paths, each with independent tables. Self-mounts, mount cycles, + sibling accessor collisions, and runtime-created namespaces are unsupported. +- `Accessor = "public"` merges declarations into the containing scope, not + necessarily the root. A public dependency's named children become children of + that scope. Referenced modules not targeted by any mount register automatically + in the root's public scope. +- Dependencies in `public` inherit the containing scope's case-conversion policy + (`SnakeCase` by default). An explicitly different policy is a compilation error. + Mount the dependency in a named namespace to keep its independent naming policy. - `Accessor` must be a valid C# and database identifier; optional `Name` must be a valid database identifier. Both are limited to 63 UTF-8 bytes. Accessors are checked for case-insensitive duplicates; the host validates @@ -76,8 +136,9 @@ An explicit `Name` is used as supplied, without case conversion. The `public` scope cannot be renamed or targeted through a different accessor. - Named namespaces cannot declare lifecycle reducers, nonempty environment schemas, or RLS filters. The generator rejects these when composing the root. - They remain valid when the dependency is published alone or registered in - `public`, subject to ordinary host validation (including lifecycle uniqueness). + This applies at every depth, including public contributions inside a named + submodule. They remain valid when published alone or registered in the root's + public scope, subject to ordinary host validation (including lifecycle uniqueness). - Define RLS in the root, using canonical qualified table names, as in [the integration fixture](../../modules/namespace-test-cs/Lib.cs). Library-defined RLS in a named namespace is unsupported; it must not be relied diff --git a/crates/bindings-csharp/Runtime/HandlerContext.cs b/crates/bindings-csharp/Runtime/HandlerContext.cs index 5bd4b768a3a..ee998732157 100644 --- a/crates/bindings-csharp/Runtime/HandlerContext.cs +++ b/crates/bindings-csharp/Runtime/HandlerContext.cs @@ -23,6 +23,23 @@ public abstract class HandlerContextBase // **Note:** must be 0..=u32::MAX protected int CounterUuid = 0; +#if NET10_0_OR_GREATER + private protected HandlerContextBase? SelectionSource; + protected ref int SharedCounterUuid => ref (SelectionSource ?? this).CounterUuid; + + protected virtual HandlerTxContextBase SelectTxContext(HandlerTxContextBase tx) => tx; + + // Keep captured callbacks off the ordinary, unselected transaction path. + private TResult WithSelectedTx(Func body) => + SelectionSource!.WithTx(tx => body(SelectTxContext(tx))); + + private TxOutcome TryWithSelectedTx( + Func> body + ) + where TError : Exception => + SelectionSource!.TryWithTx(tx => body(SelectTxContext(tx))); +#endif + private readonly TransactionalContextState txState; protected HandlerContextBase(Identity sender, string? senderJwt, Random random, Timestamp time) @@ -72,8 +89,16 @@ public TResult UnwrapOrThrow() => } [Experimental("STDB_UNSTABLE")] - public TResult WithTx(Func body) => - txState.WithTx(body); + public TResult WithTx(Func body) + { +#if NET10_0_OR_GREATER + if (SelectionSource is not null) + { + return WithSelectedTx(body); + } +#endif + return txState.WithTx(body); + } [Experimental("STDB_UNSTABLE")] public TxOutcome TryWithTx( @@ -81,6 +106,12 @@ Func> body ) where TError : Exception { +#if NET10_0_OR_GREATER + if (SelectionSource is not null) + { + return TryWithSelectedTx(body); + } +#endif var outcome = txState.TryWithTx(body); return outcome.IsSuccess ? TxOutcome.Success(outcome.Value!) @@ -93,13 +124,32 @@ Func> body public abstract class HandlerTxContextBase(Internal.TxContext inner) : IRefreshableTxContext { +#if NET10_0_OR_GREATER + private protected HandlerTxContextBase? SelectionSource; + private protected LocalBase LocalDb = (LocalBase)inner.Db; + private Internal.TxContext currentInner = inner; + + // Selected wrappers must observe refreshes of the original transaction context. + internal Internal.TxContext Inner => SelectionSource?.Inner ?? currentInner; + + internal void Refresh(Internal.TxContext inner) + { + currentInner = inner; + LocalDb = (LocalBase)inner.Db; + } +#else internal Internal.TxContext Inner { get; private set; } = inner; internal void Refresh(Internal.TxContext inner) => Inner = inner; +#endif void IRefreshableTxContext.Refresh(Internal.TxContext inner) => Refresh(inner); +#if NET10_0_OR_GREATER + public LocalBase Db => LocalDb; +#else public LocalBase Db => (LocalBase)Inner.Db; +#endif public DatabaseEnvironment Env { get; } = DatabaseEnvironment.Instance; public Identity Sender => Inner.Sender; public Timestamp Timestamp => Inner.Timestamp; diff --git a/crates/bindings-csharp/Runtime/Internal/IIndex.cs b/crates/bindings-csharp/Runtime/Internal/IIndex.cs index b0223486059..34474beb0a9 100644 --- a/crates/bindings-csharp/Runtime/Internal/IIndex.cs +++ b/crates/bindings-csharp/Runtime/Internal/IIndex.cs @@ -144,12 +144,16 @@ out var numDeleted return row; } - protected Row DoUpdate(Row row) + protected Row DoUpdate(Row row) => UpdateRow(row, ITableView.tableId); + + protected Row DoUpdate(Row row, TableHandle table) => UpdateRow(row, table.Id); + + private Row UpdateRow(Row row, FFI.TableId tableId) { // Insert the row. var bytes = IStructuralReadWrite.ToBytes(row); var bytes_len = bytes.Length; - FFI.datastore_update_bsatn(ITableView.tableId, indexId, bytes, ref bytes_len); + FFI.datastore_update_bsatn(tableId, indexId, bytes, ref bytes_len); return ITableView.IntegrateGeneratedColumns(row, bytes, bytes_len); } @@ -207,12 +211,16 @@ out var numDeleted return row; } - protected Row DoUpdate(Row row) + protected Row DoUpdate(Row row) => UpdateRow(row, ITableView.tableId); + + protected Row DoUpdate(Row row, TableHandle table) => UpdateRow(row, table.Id); + + private Row UpdateRow(Row row, FFI.TableId tableId) { // Insert the row. var bytes = IStructuralReadWrite.ToBytes(row); var bytes_len = bytes.Length; - FFI.datastore_update_bsatn(ITableView.tableId, indexId, bytes, ref bytes_len); + FFI.datastore_update_bsatn(tableId, indexId, bytes, ref bytes_len); return ITableView.IntegrateGeneratedColumns(row, bytes, bytes_len); } diff --git a/crates/bindings-csharp/Runtime/Internal/IModuleContext.cs b/crates/bindings-csharp/Runtime/Internal/IModuleContext.cs new file mode 100644 index 00000000000..fbcecce2eb4 --- /dev/null +++ b/crates/bindings-csharp/Runtime/Internal/IModuleContext.cs @@ -0,0 +1,15 @@ +#if NET10_0_OR_GREATER +namespace SpacetimeDB.Internal; + +/// Identifies a context or path selector for generated instance-aware calls. +public interface IModuleContext +{ + int InstanceId { get; } +} + +/// Used by generated namespace context selectors to preserve the context type. +public interface IModuleContext : IModuleContext +{ + TContext SelectInstance(int instanceId); +} +#endif diff --git a/crates/bindings-csharp/Runtime/Internal/ITable.cs b/crates/bindings-csharp/Runtime/Internal/ITable.cs index 4ea680b97f3..d3143d967e2 100644 --- a/crates/bindings-csharp/Runtime/Internal/ITable.cs +++ b/crates/bindings-csharp/Runtime/Internal/ITable.cs @@ -94,17 +94,19 @@ protected override void IterStart(out FFI.RowIter handle) => private static readonly string tableName = typeof(View).Name; - // Note: this must be Lazy to ensure that we don't try to get the tableId during startup, before the module is initialized. - private static readonly Lazy tableId_ = - new(() => - { - var name_bytes = System.Text.Encoding.UTF8.GetBytes(View.LookupName); - FFI.table_id_from_name(name_bytes, name_bytes.Length, out var out_); - return out_; - }); + // Instance-aware handles supply their own IDs and never need this legacy cache. + private static Lazy? legacyTableId; #pragma warning disable IDE1006 // Used by static interface member call sites. - internal static FFI.TableId tableId => tableId_.Value; + internal static FFI.TableId tableId => + ( + legacyTableId ??= new(() => + { + var name_bytes = System.Text.Encoding.UTF8.GetBytes(View.LookupName); + FFI.table_id_from_name(name_bytes, name_bytes.Length, out var out_); + return out_; + }) + ).Value; #pragma warning restore IDE1006 ulong Count { get; } @@ -117,7 +119,11 @@ protected override void IterStart(out FFI.RowIter handle) => ulong Clear(); - protected static ulong DoCount() + protected static ulong DoCount() => CountRows(tableId); + + protected static ulong DoCount(TableHandle table) => CountRows(table.Id); + + private static ulong CountRows(FFI.TableId tableId) { FFI.datastore_table_row_count(tableId, out var count); return count; @@ -125,7 +131,13 @@ protected static ulong DoCount() protected static IEnumerable DoIter() => new RawTableIter(tableId); - protected static T DoInsert(T row) + protected static IEnumerable DoIter(TableHandle table) => new RawTableIter(table.Id); + + protected static T DoInsert(T row) => InsertRow(row, tableId); + + protected static T DoInsert(T row, TableHandle table) => InsertRow(row, table.Id); + + private static T InsertRow(T row, FFI.TableId tableId) { // Insert the row. var bytes = IStructuralReadWrite.ToBytes(row); @@ -143,7 +155,11 @@ static T IntegrateGeneratedColumns(T row, byte[] bytes, int gen_len) return View.ReadGenFields(reader, row); } - protected static bool DoDelete(T row) + protected static bool DoDelete(T row) => DeleteRow(row, tableId); + + protected static bool DoDelete(T row, TableHandle table) => DeleteRow(row, table.Id); + + private static bool DeleteRow(T row, FFI.TableId tableId) { using var stream = new MemoryStream(); using var writer = new BinaryWriter(stream); @@ -161,7 +177,11 @@ out var out_ return out_ > 0; } - protected static ulong DoClear() + protected static ulong DoClear() => ClearRows(tableId); + + protected static ulong DoClear(TableHandle table) => ClearRows(table.Id); + + private static ulong ClearRows(FFI.TableId tableId) { FFI.datastore_clear(tableId, out var count); return count; diff --git a/crates/bindings-csharp/Runtime/Internal/Module.cs b/crates/bindings-csharp/Runtime/Internal/Module.cs index b15119a2263..ebc6f33a56a 100644 --- a/crates/bindings-csharp/Runtime/Internal/Module.cs +++ b/crates/bindings-csharp/Runtime/Internal/Module.cs @@ -46,6 +46,21 @@ private static void EnsureNativeAotTypeRoots() private static NamespaceRegistry? namespaces; + private static NamespaceRegistry Namespaces => + namespaces + ?? throw new InvalidOperationException("Module namespaces have not been installed."); + + public static int InstanceCount => Namespaces.InstanceCount; + + public static int ResolveInstance(int contextInstance, string assemblyIdentity) => + Namespaces.ResolveInstance(contextInstance, assemblyIdentity); + + public static string ResolveName(int instanceId, string localName) => + Namespaces.Resolve(instanceId, localName); + + internal static int[] BindNamespace(string? assemblyIdentity, string accessor) => + Namespaces.BindNamespace(assemblyIdentity, accessor); + public static void InstallNamespaces(NamespaceRegistry registry) { if (namespaces is not null) @@ -57,64 +72,43 @@ public static void InstallNamespaces(NamespaceRegistry registry) } public static string ResolveName(string assemblyIdentity, string localName) => - ( - namespaces - ?? throw new InvalidOperationException("Module namespaces have not been installed.") - ).Resolve(assemblyIdentity, localName); + Namespaces.Resolve(assemblyIdentity, localName); public static string ResolveFunctionName( string assemblyIdentity, string sourceName, string? explicitName - ) => - ( - namespaces - ?? throw new InvalidOperationException("Module namespaces have not been installed.") - ).ResolveFunction(assemblyIdentity, sourceName, explicitName); + ) => Namespaces.ResolveFunction(assemblyIdentity, sourceName, explicitName); + + public static string ResolveFunctionName( + int instanceId, + string sourceName, + string? explicitName + ) => Namespaces.ResolveFunction(instanceId, sourceName, explicitName); public static SqlTableName ResolveSqlName(string assemblyIdentity, string localName) => - ( - namespaces - ?? throw new InvalidOperationException("Module namespaces have not been installed.") - ).ResolveSqlName(assemblyIdentity, localName); + Namespaces.ResolveSqlName(assemblyIdentity, localName); + public static SqlTableName ResolveSqlName(int instanceId, string localName) => + Namespaces.ResolveSqlName(instanceId, localName); + +#if !NET10_0_OR_GREATER private static Func< Identity, ConnectionId?, Random, Timestamp, IReducerContext - >? newReducerContext = -#if NET10_0_OR_GREATER - (identity, connectionId, random, time) => - new SpacetimeDB.ReducerContext(identity, connectionId, random, time); -#else - null; -#endif - private static Func? newViewContext = -#if NET10_0_OR_GREATER - identity => new ViewContext(identity, new LocalReadOnly()); -#else - null; -#endif - private static Func? newAnonymousViewContext = -#if NET10_0_OR_GREATER - () => new AnonymousViewContext(new LocalReadOnly()); -#else - null; -#endif + >? newReducerContext; + private static Func? newViewContext; + private static Func? newAnonymousViewContext; private static Func< Identity, string?, Random, Timestamp, SpacetimeDB.HandlerContextBase - >? newHandlerContext = -#if NET10_0_OR_GREATER - (sender, senderJwt, random, time) => new HandlerContext(sender, senderJwt, random, time); -#else - null; -#endif + >? newHandlerContext; private static Func< Identity, @@ -122,13 +116,7 @@ private static Func< Random, Timestamp, IProcedureContext - >? newProcedureContext = -#if NET10_0_OR_GREATER - (identity, connectionId, random, time) => - new ProcedureContext(identity, connectionId, random, time); -#else - null; -#endif + >? newProcedureContext; public static void SetReducerContextConstructor( Func ctor @@ -147,6 +135,7 @@ public static void SetViewContextConstructor(Func ctor) public static void SetAnonymousViewContextConstructor(Func ctor) => newAnonymousViewContext = ctor; +#endif public readonly struct TypeRegistrar : ITypeRegistrar { @@ -329,6 +318,27 @@ public static IReducerContext CreateReducerContext( ulong conn_id_0, ulong conn_id_1, Timestamp timestamp + ) => + CreateReducerContext( + sender_0, + sender_1, + sender_2, + sender_3, + conn_id_0, + conn_id_1, + timestamp, + 0 + ); + + public static IReducerContext CreateReducerContext( + ulong sender_0, + ulong sender_1, + ulong sender_2, + ulong sender_3, + ulong conn_id_0, + ulong conn_id_1, + Timestamp timestamp, + int instanceId ) { var senderIdentity = Identity.From( @@ -338,7 +348,17 @@ Timestamp timestamp var random = new Random((int)timestamp.MicrosecondsSinceUnixEpoch); var time = timestamp.ToStd(); +#if NET10_0_OR_GREATER + return new ReducerContext( + senderIdentity, + connectionId, + random, + time, + instanceId: instanceId + ); +#else return newReducerContext!(senderIdentity, connectionId, random, time); +#endif } public static IProcedureContext CreateProcedureContext( @@ -349,6 +369,27 @@ public static IProcedureContext CreateProcedureContext( ulong conn_id_0, ulong conn_id_1, Timestamp timestamp + ) => + CreateProcedureContext( + sender_0, + sender_1, + sender_2, + sender_3, + conn_id_0, + conn_id_1, + timestamp, + 0 + ); + + public static IProcedureContext CreateProcedureContext( + ulong sender_0, + ulong sender_1, + ulong sender_2, + ulong sender_3, + ulong conn_id_0, + ulong conn_id_1, + Timestamp timestamp, + int instanceId ) { var sender = Identity.From(MemoryMarshal.AsBytes([sender_0, sender_1, sender_2, sender_3])); @@ -356,7 +397,11 @@ Timestamp timestamp var random = new Random((int)timestamp.MicrosecondsSinceUnixEpoch); var time = timestamp.ToStd(); +#if NET10_0_OR_GREATER + return new ProcedureContext(sender, connectionId, random, time, instanceId); +#else return newProcedureContext!(sender, connectionId, random, time); +#endif } public static SpacetimeDB.HandlerContextBase CreateHandlerContext( @@ -373,7 +418,11 @@ Timestamp timestamp var senderJwt = AuthCtx.ReadJwt(sender_jwt); var random = new Random((int)timestamp.MicrosecondsSinceUnixEpoch); var time = timestamp.ToStd(); +#if NET10_0_OR_GREATER + return new HandlerContext(sender, senderJwt, random, time); +#else return newHandlerContext!(sender, senderJwt, random, time); +#endif } public static IViewContext CreateViewContext( @@ -381,13 +430,55 @@ public static IViewContext CreateViewContext( ulong sender_1, ulong sender_2, ulong sender_3 + ) => CreateViewContext(sender_0, sender_1, sender_2, sender_3, 0); + + public static IViewContext CreateViewContext( + ulong sender_0, + ulong sender_1, + ulong sender_2, + ulong sender_3, + int instanceId ) { var sender = Identity.From(MemoryMarshal.AsBytes([sender_0, sender_1, sender_2, sender_3])); +#if NET10_0_OR_GREATER + return new ViewContext(sender, LocalReadOnly.ForInstance(instanceId)); +#else return newViewContext!(sender); +#endif } - public static IAnonymousViewContext CreateAnonymousViewContext() => newAnonymousViewContext!(); + public static IAnonymousViewContext CreateAnonymousViewContext() => + CreateAnonymousViewContext(0); + + public static IAnonymousViewContext CreateAnonymousViewContext(int instanceId) + { +#if NET10_0_OR_GREATER + return new AnonymousViewContext(LocalReadOnly.ForInstance(instanceId)); +#else + return newAnonymousViewContext!(); +#endif + } + +#if NET10_0_OR_GREATER + public static int GetInstanceId(Local db) => db.InstanceId; + + public static int GetInstanceId(LocalReadOnly db) => db.InstanceId; + + public static int GetInstanceId(QueryBuilder from) => from.InstanceId; + + public static int GetInstanceId(IReducerContext context) => + ((ReducerContext)context).ModuleInstanceId; + + public static int GetInstanceId(IProcedureContext context) => + ((ProcedureContext)context).ModuleInstanceId; + + public static int GetInstanceId(IViewContext context) => + ((ViewContext)context).ModuleInstanceId; + + public static int GetInstanceId(IAnonymousViewContext context) => + ((AnonymousViewContext)context).ModuleInstanceId; +#endif public static void EnsureNoUnreadBytes(MemoryStream stream, string description) { @@ -423,22 +514,7 @@ public static void __describe_module__(BytesSink description) try { var module = RootBuilder.BuildModuleDefinition(); - foreach (var submodules in module.Sections.OfType()) - { - foreach (var submodule in submodules.Submodules_) - { - if ( - submodule - .Module.Sections.OfType() - .Any(routes => routes.HttpRoutes_.Count > 0) - ) - { - Log.Warn( - $"HTTP routes declared in submodule '{submodule.Namespace}' are ignored. Define HTTP routes in the root module instead." - ); - } - } - } + WarnIgnoredRoutes(module, ""); RawModuleDef versioned = new RawModuleDef.V10(module); var moduleBytes = IStructuralReadWrite.ToBytes(new RawModuleDef.BSATN(), versioned); description.Write(moduleBytes); @@ -448,6 +524,28 @@ public static void __describe_module__(BytesSink description) Log.Error($"Error while describing the module: {e}"); } } + + private static void WarnIgnoredRoutes(RawModuleDefV10 module, string path) + { + foreach (var section in module.Sections.OfType()) + { + foreach (var child in section.Submodules_) + { + var childPath = path.Length == 0 ? child.Namespace : path + "." + child.Namespace; + if ( + child + .Module.Sections.OfType() + .Any(routes => routes.HttpRoutes_.Count > 0) + ) + { + Log.Warn( + $"HTTP routes declared in submodule '{childPath}' are ignored. Define HTTP routes in the root module instead." + ); + } + WarnIgnoredRoutes(child.Module, childPath); + } + } + } } /// @@ -456,7 +554,9 @@ public static void __describe_module__(BytesSink description) /// public partial class Local { - // Intentionally empty – generated code adds table handles here. +#if NET10_0_OR_GREATER + internal int InstanceId { get; init; } +#endif } /// @@ -464,4 +564,16 @@ public partial class Local /// On .NET 10 the generator provides assembly-scoped extension properties. /// On .NET 8 generated modules declare their own type with table accessors. /// -public sealed partial class LocalReadOnly { } +public sealed partial class LocalReadOnly +{ +#if NET10_0_OR_GREATER + internal int InstanceId { get; init; } + + private static readonly LocalReadOnly Root = new(); + + private static LocalReadOnly?[] Instances => field ??= new LocalReadOnly?[Module.InstanceCount]; + + internal static LocalReadOnly ForInstance(int instanceId) => + instanceId == 0 ? Root : Instances[instanceId] ??= new() { InstanceId = instanceId }; +#endif +} diff --git a/crates/bindings-csharp/Runtime/Internal/NamespaceBinding.cs b/crates/bindings-csharp/Runtime/Internal/NamespaceBinding.cs new file mode 100644 index 00000000000..405a2229d2f --- /dev/null +++ b/crates/bindings-csharp/Runtime/Internal/NamespaceBinding.cs @@ -0,0 +1,27 @@ +namespace SpacetimeDB.Internal; + +/// Precomputed child selection for a generated namespace accessor. +/// +/// The declaring assembly for Db extensions, or null when a namespace container +/// already supplies the exact parent instance. +/// +/// The child's local accessor. +public sealed class NamespaceBinding(string? assemblyIdentity, string accessor) +{ + private readonly int[] instances = Module.BindNamespace(assemblyIdentity, accessor); + + public int this[int contextInstance] + { + get + { + var instance = instances[contextInstance]; + if (instance < 0) + { + throw new InvalidOperationException( + $"Namespace '{accessor}' is unavailable or ambiguous in this context." + ); + } + return instance; + } + } +} diff --git a/crates/bindings-csharp/Runtime/Internal/NamespaceRegistry.cs b/crates/bindings-csharp/Runtime/Internal/NamespaceRegistry.cs index 3b35500cc76..c2e06ee44b9 100644 --- a/crates/bindings-csharp/Runtime/Internal/NamespaceRegistry.cs +++ b/crates/bindings-csharp/Runtime/Internal/NamespaceRegistry.cs @@ -8,6 +8,165 @@ private readonly Dictionary< (string Accessor, string Canonical, CaseConversionPolicy Policy) > mounts = new(StringComparer.Ordinal); private readonly CaseConversionPolicy rootPolicy; + private readonly HashSet ambiguous = new(StringComparer.Ordinal); + private readonly string[] instancePaths; + private readonly string[] canonicalPaths; + private readonly CaseConversionPolicy[] policies; + private readonly Dictionary instances = new(StringComparer.Ordinal); + private readonly Dictionary<(int Parent, string Accessor), int> children = []; + + public int InstanceCount => instancePaths.Length; + + public int ResolveInstance(int contextInstance, string assemblyIdentity) + { + if ((uint)contextInstance >= (uint)InstanceCount) + { + throw new ArgumentOutOfRangeException(nameof(contextInstance)); + } + if (!instances.TryGetValue(assemblyIdentity, out var candidates)) + { + return 0; + } + var instance = candidates[contextInstance]; + if (instance < 0) + { + throw new InvalidOperationException( + $"Assembly '{assemblyIdentity}' has multiple instances accessible from '{instancePaths[contextInstance]}'. Select a specific submodule context." + ); + } + return instance; + } + + public string Resolve(int instanceId, string localName) => + Qualify(instancePaths[instanceId], localName); + + internal int[] BindNamespace(string? assemblyIdentity, string accessor) + { + var parents = assemblyIdentity is null ? null : instances[assemblyIdentity]; + var result = new int[InstanceCount]; + for (var context = 0; context < result.Length; context++) + { + var parent = parents is null ? context : parents[context]; + result[context] = children.TryGetValue((parent, accessor), out var child) ? child : -1; + } + return result; + } + + public NamespaceRegistry( + ( + int ParentId, + string Accessor, + string? Name, + CaseConversionPolicy Policy, + string[] Assemblies + )[] scopes + ) + { + if (scopes.Length == 0 || scopes[0].ParentId != -1) + { + throw new ArgumentException( + "The composition must start with the root scope.", + nameof(scopes) + ); + } + rootPolicy = scopes[0].Policy; + instancePaths = new string[scopes.Length]; + canonicalPaths = new string[scopes.Length]; + policies = [.. scopes.Select(scope => scope.Policy)]; + for (var id = 0; id < scopes.Length; id++) + { + var scope = scopes[id]; + if (id == 0) + { + instancePaths[id] = ""; + canonicalPaths[id] = ""; + } + else + { + if (scope.ParentId < 0 || scope.ParentId >= id) + { + throw new ArgumentException("A scope must follow its parent.", nameof(scopes)); + } + children.Add((scope.ParentId, scope.Accessor), id); + var name = + scope.Name + ?? CanonicalName.Convert(scope.Accessor, scopes[scope.ParentId].Policy); + instancePaths[id] = Qualify(instancePaths[scope.ParentId], scope.Accessor); + canonicalPaths[id] = Qualify(canonicalPaths[scope.ParentId], name); + } + foreach (var assembly in scope.Assemblies) + { + if (!mounts.TryAdd(assembly, (instancePaths[id], canonicalPaths[id], scope.Policy))) + { + ambiguous.Add(assembly); + } + } + } + // Resolve ownership once at startup, not for every table operation. + var parents = scopes.Select(scope => scope.ParentId).ToArray(); + foreach (var assembly in mounts.Keys) + { + var owners = Enumerable + .Range(0, scopes.Length) + .Where(id => scopes[id].Assemblies.Contains(assembly)) + .ToArray(); + var resolved = new int[scopes.Length]; + for (var context = 0; context < scopes.Length; context++) + { + if (owners.Length == 1) + { + resolved[context] = owners[0]; + continue; + } + if (owners.Contains(context)) + { + resolved[context] = context; + continue; + } + var selected = -1; + foreach (var owner in owners) + { + if (!IsDescendant(owner, context, parents)) + { + continue; + } + if (selected >= 0) + { + selected = -1; + break; + } + selected = owner; + } + resolved[context] = selected; + } + instances.Add(assembly, resolved); + } + } + + private static bool IsDescendant(int id, int ancestor, int[] parents) + { + for (var parent = parents[id]; parent >= 0; parent = parents[parent]) + { + if (parent == ancestor) + { + return true; + } + } + return false; + } + + private static string Qualify(string path, string name) => + path.Length == 0 ? name : path + "." + name; + + private void CheckUnambiguous(string assemblyIdentity) + { + if (ambiguous.Contains(assemblyIdentity)) + { + throw new InvalidOperationException( + $"Assembly '{assemblyIdentity}' has multiple mount instances. This lookup requires an instance ID." + ); + } + } public NamespaceRegistry( string rootIdentity, @@ -18,9 +177,29 @@ public NamespaceRegistry( string? Name, CaseConversionPolicy Policy )> mounts + ) + : this(CreateFlatScopes(rootIdentity, rootPolicy, mounts)) { } + + private static ( + int ParentId, + string Accessor, + string? Name, + CaseConversionPolicy Policy, + string[] Assemblies + )[] CreateFlatScopes( + string rootIdentity, + CaseConversionPolicy rootPolicy, + IEnumerable<( + string AssemblyIdentity, + string Accessor, + string? Name, + CaseConversionPolicy Policy + )> mounts ) { - this.rootPolicy = rootPolicy; + var identities = new HashSet(StringComparer.Ordinal) { rootIdentity }; + var publicAssemblies = new List { rootIdentity }; + var scopes = new List<(int, string, string?, CaseConversionPolicy, string[])> { default }; foreach (var mount in mounts) { if (mount.AssemblyIdentity == rootIdentity) @@ -28,37 +207,41 @@ CaseConversionPolicy Policy throw new ArgumentException("The root assembly cannot be mounted.", nameof(mounts)); } - if ( - !this.mounts.TryAdd( - mount.AssemblyIdentity, - ( - mount.Accessor, - mount.Name ?? CanonicalName.Convert(mount.Accessor, rootPolicy), - mount.Policy - ) - ) - ) + if (!identities.Add(mount.AssemblyIdentity)) { throw new ArgumentException( $"Assembly '{mount.AssemblyIdentity}' is mounted more than once.", nameof(mounts) ); } + if ( + mount.Accessor.Length == 0 + || mount.Accessor.Equals("public", StringComparison.OrdinalIgnoreCase) + ) + { + publicAssemblies.Add(mount.AssemblyIdentity); + } + else + { + scopes.Add((0, mount.Accessor, mount.Name, mount.Policy, [mount.AssemblyIdentity])); + } } + scopes[0] = (-1, "", null, rootPolicy, [.. publicAssemblies]); + return [.. scopes]; } - private string? ResolveNamespace(string assemblyIdentity) => - mounts.TryGetValue(assemblyIdentity, out var mount) - && !mount.Accessor.Equals("public", StringComparison.OrdinalIgnoreCase) + private string? ResolveNamespace(string assemblyIdentity) + { + CheckUnambiguous(assemblyIdentity); + return mounts.TryGetValue(assemblyIdentity, out var mount) && mount.Accessor.Length != 0 ? mount.Accessor : null; + } public string ResolveFunction(string assemblyIdentity, string sourceName, string? explicitName) { - if ( - mounts.TryGetValue(assemblyIdentity, out var mount) - && !mount.Accessor.Equals("public", StringComparison.OrdinalIgnoreCase) - ) + CheckUnambiguous(assemblyIdentity); + if (mounts.TryGetValue(assemblyIdentity, out var mount) && mount.Accessor.Length != 0) { return mount.Canonical + "." @@ -67,11 +250,25 @@ public string ResolveFunction(string assemblyIdentity, string sourceName, string return explicitName ?? CanonicalName.Convert(sourceName, rootPolicy); } + public string ResolveFunction(int instanceId, string sourceName, string? explicitName) => + Qualify( + canonicalPaths[instanceId], + explicitName ?? CanonicalName.Convert(sourceName, policies[instanceId]) + ); + public string Resolve(string assemblyIdentity, string localName) => ResolveNamespace(assemblyIdentity) is { } name ? name + "." + localName : localName; - public SqlTableName ResolveSqlName(string assemblyIdentity, string localName) => - ResolveNamespace(assemblyIdentity) is { } name - ? new SqlTableName(name, localName) - : new SqlTableName(localName); + public SqlTableName ResolveSqlName(string assemblyIdentity, string localName) + { + var name = ResolveNamespace(assemblyIdentity); + return name is null + ? new SqlTableName(localName) + : new SqlTableName(name.Split('.'), localName); + } + + public SqlTableName ResolveSqlName(int instanceId, string localName) => + instancePaths[instanceId].Length == 0 + ? new SqlTableName(localName) + : new SqlTableName(instancePaths[instanceId].Split('.'), localName); } diff --git a/crates/bindings-csharp/Runtime/Internal/TableHandle.cs b/crates/bindings-csharp/Runtime/Internal/TableHandle.cs new file mode 100644 index 00000000000..57ae65047bb --- /dev/null +++ b/crates/bindings-csharp/Runtime/Internal/TableHandle.cs @@ -0,0 +1,19 @@ +namespace SpacetimeDB.Internal; + +/// A table ID cached for one published table instance. +public abstract class TableHandle(string name) +{ + private string? lookupName = name; + private FFI.TableId? id; + + internal FFI.TableId Id => id ??= ResolveId(); + + private FFI.TableId ResolveId() + { + // Module execution is single-threaded. Keep lookup lazy without a Lazy/delegate allocation. + var bytes = System.Text.Encoding.UTF8.GetBytes(lookupName!); + FFI.table_id_from_name(bytes, bytes.Length, out var result); + lookupName = null; + return result; + } +} diff --git a/crates/bindings-csharp/Runtime/ModuleContexts.cs b/crates/bindings-csharp/Runtime/ModuleContexts.cs index d8c5383151d..91842581a4b 100644 --- a/crates/bindings-csharp/Runtime/ModuleContexts.cs +++ b/crates/bindings-csharp/Runtime/ModuleContexts.cs @@ -6,10 +6,37 @@ namespace SpacetimeDB; #pragma warning disable STDB_UNSTABLE #pragma warning disable CA1822 // Preserve the existing instance-based context API. -public sealed class Local : LocalBase { } +public sealed class Local : LocalBase +{ + private static readonly Local Root = new(); + + private static Local?[] Instances => field ??= new Local?[Internal.Module.InstanceCount]; -public sealed record ReducerContext : DbContext, Internal.IReducerContext + internal static Local ForInstance(int instanceId) => + instanceId == 0 ? Root : Instances[instanceId] ??= new() { InstanceId = instanceId }; +} + +public sealed record ReducerContext + : DbContext, + Internal.IReducerContext, + Internal.IModuleContext { + private ReducerContext? selectionSource; + + int Internal.IModuleContext.InstanceId => ModuleInstanceId; + + ReducerContext Internal.IModuleContext.SelectInstance(int instanceId) + { + if (instanceId == ModuleInstanceId) + { + return this; + } + var selected = this with { Db = Local.ForInstance(instanceId) }; + selected.selectionSource = selectionSource ?? this; + return selected; + } + + internal int ModuleInstanceId => Db.InstanceId; public DatabaseEnvironment Env => default; public readonly Identity Sender; public readonly ConnectionId? ConnectionId; @@ -32,8 +59,10 @@ internal ReducerContext( ConnectionId? connectionId, Random random, Timestamp time, - AuthCtx? senderAuth = null + AuthCtx? senderAuth = null, + int instanceId = 0 ) + : base(Local.ForInstance(instanceId)) { Sender = identity; ConnectionId = connectionId; @@ -87,25 +116,52 @@ public Uuid NewUuidV7() { var bytes = new byte[4]; Rng.NextBytes(bytes); - return Uuid.FromCounterV7(ref CounterUuid, Timestamp, bytes); + return Uuid.FromCounterV7(ref (selectionSource ?? this).CounterUuid, Timestamp, bytes); } } -public readonly struct QueryBuilder { } +public readonly struct QueryBuilder +{ + internal readonly int InstanceId; + + internal QueryBuilder(int instanceId) => InstanceId = instanceId; +} -public sealed partial class ProcedureContext : global::SpacetimeDB.ProcedureContextBase +public sealed partial class ProcedureContext + : global::SpacetimeDB.ProcedureContextBase, + Internal.IModuleContext { - private readonly Local _db = new(); + int Internal.IModuleContext.InstanceId => ModuleInstanceId; + + ProcedureContext Internal.IModuleContext.SelectInstance(int instanceId) + { + if (instanceId == ModuleInstanceId) + { + return this; + } + var selected = (ProcedureContext)MemberwiseClone(); + selected.Db = Local.ForInstance(instanceId); + selected.SelectionSource = SelectionSource ?? this; + return selected; + } + + protected override ProcedureTxContextBase SelectTxContext(ProcedureTxContextBase tx) => + ((Internal.IModuleContext)(ProcedureTxContext)tx).SelectInstance( + ModuleInstanceId + ); + + internal int ModuleInstanceId => Db.InstanceId; internal ProcedureContext( Identity identity, ConnectionId? connectionId, Random random, - Timestamp time + Timestamp time, + int instanceId = 0 ) - : base(identity, connectionId, random, time) { } + : base(identity, connectionId, random, time) => Db = Local.ForInstance(instanceId); - protected internal override global::SpacetimeDB.LocalBase CreateLocal() => _db; + protected internal override global::SpacetimeDB.LocalBase CreateLocal() => Db; protected override global::SpacetimeDB.ProcedureTxContextBase CreateTxContext( Internal.TxContext inner @@ -113,7 +169,7 @@ Internal.TxContext inner private ProcedureTxContext? _cached; - public Local Db => _db; + public Local Db { get; private set; } public TResult WithTx(Func body) => base.WithTx(tx => body((ProcedureTxContext)tx)); @@ -167,13 +223,34 @@ public Uuid NewUuidV7() { var bytes = new byte[4]; Rng.NextBytes(bytes); - return Uuid.FromCounterV7(ref CounterUuid, Timestamp, bytes); + return Uuid.FromCounterV7(ref SharedCounterUuid, Timestamp, bytes); } } -public sealed partial class HandlerContext : global::SpacetimeDB.HandlerContextBase +public sealed partial class HandlerContext + : global::SpacetimeDB.HandlerContextBase, + Internal.IModuleContext { - private readonly Local _db = new(); + private Local _db = Local.ForInstance(0); + + int Internal.IModuleContext.InstanceId => _db.InstanceId; + + HandlerContext Internal.IModuleContext.SelectInstance(int instanceId) + { + if (instanceId == _db.InstanceId) + { + return this; + } + var selected = (HandlerContext)MemberwiseClone(); + selected._db = Local.ForInstance(instanceId); + selected.SelectionSource = SelectionSource ?? this; + return selected; + } + + protected override HandlerTxContextBase SelectTxContext(HandlerTxContextBase tx) => + ((Internal.IModuleContext)(HandlerTxContext)tx).SelectInstance( + _db.InstanceId + ); internal HandlerContext(Identity sender, string? senderJwt, Random random, Timestamp time) : base(sender, senderJwt, random, time) { } @@ -207,12 +284,28 @@ public Uuid NewUuidV7() { var bytes = new byte[4]; Rng.NextBytes(bytes); - return Uuid.FromCounterV7(ref CounterUuid, Timestamp, bytes); + return Uuid.FromCounterV7(ref SharedCounterUuid, Timestamp, bytes); } } -public sealed class ProcedureTxContext : global::SpacetimeDB.ProcedureTxContextBase +public sealed class ProcedureTxContext + : global::SpacetimeDB.ProcedureTxContextBase, + Internal.IModuleContext { + int Internal.IModuleContext.InstanceId => Db.InstanceId; + + ProcedureTxContext Internal.IModuleContext.SelectInstance(int instanceId) + { + if (instanceId == Db.InstanceId) + { + return this; + } + var selected = (ProcedureTxContext)MemberwiseClone(); + selected.SelectionSource = SelectionSource ?? this; + selected.LocalDb = Local.ForInstance(instanceId); + return selected; + } + internal ProcedureTxContext(Internal.TxContext inner) : base(inner) { } @@ -220,20 +313,50 @@ internal ProcedureTxContext(Internal.TxContext inner) } [Experimental("STDB_UNSTABLE")] -public sealed class HandlerTxContext : global::SpacetimeDB.HandlerTxContextBase +public sealed class HandlerTxContext + : global::SpacetimeDB.HandlerTxContextBase, + Internal.IModuleContext { + int Internal.IModuleContext.InstanceId => Db.InstanceId; + + HandlerTxContext Internal.IModuleContext.SelectInstance(int instanceId) + { + if (instanceId == Db.InstanceId) + { + return this; + } + var selected = (HandlerTxContext)MemberwiseClone(); + selected.SelectionSource = SelectionSource ?? this; + selected.LocalDb = Local.ForInstance(instanceId); + return selected; + } + internal HandlerTxContext(Internal.TxContext inner) : base(inner) { } public new Local Db => (Local)base.Db; } -public sealed record ViewContext : DbContext, Internal.IViewContext +public sealed record ViewContext + : DbContext, + Internal.IViewContext, + Internal.IModuleContext { + int Internal.IModuleContext.InstanceId => ModuleInstanceId; + + ViewContext Internal.IModuleContext.SelectInstance(int instanceId) => + instanceId == ModuleInstanceId + ? this + : this with + { + Db = Internal.LocalReadOnly.ForInstance(instanceId), + }; + + internal int ModuleInstanceId => Db.InstanceId; public DatabaseEnvironment Env => default; public Identity Sender { get; } - public QueryBuilder From => default; + public QueryBuilder From => new(ModuleInstanceId); internal ViewContext(Identity sender, Internal.LocalReadOnly db) : base(db) @@ -244,10 +367,24 @@ internal ViewContext(Identity sender, Internal.LocalReadOnly db) public sealed record AnonymousViewContext : DbContext, - Internal.IAnonymousViewContext + Internal.IAnonymousViewContext, + Internal.IModuleContext { + int Internal.IModuleContext.InstanceId => ModuleInstanceId; + + AnonymousViewContext Internal.IModuleContext.SelectInstance( + int instanceId + ) => + instanceId == ModuleInstanceId + ? this + : this with + { + Db = Internal.LocalReadOnly.ForInstance(instanceId), + }; + + internal int ModuleInstanceId => Db.InstanceId; public DatabaseEnvironment Env => default; - public QueryBuilder From => default; + public QueryBuilder From => new(ModuleInstanceId); internal AnonymousViewContext(Internal.LocalReadOnly db) : base(db) { } diff --git a/crates/bindings-csharp/Runtime/ProcedureContext.cs b/crates/bindings-csharp/Runtime/ProcedureContext.cs index 63ec0238ca0..86c6c40551a 100644 --- a/crates/bindings-csharp/Runtime/ProcedureContext.cs +++ b/crates/bindings-csharp/Runtime/ProcedureContext.cs @@ -17,6 +17,23 @@ public abstract class ProcedureContextBase : Internal.IInternalProcedureContext // **Note:** must be 0..=u32::MAX protected int CounterUuid = 0; +#if NET10_0_OR_GREATER + private protected ProcedureContextBase? SelectionSource; + protected ref int SharedCounterUuid => ref (SelectionSource ?? this).CounterUuid; + + protected virtual ProcedureTxContextBase SelectTxContext(ProcedureTxContextBase tx) => tx; + + // Keep captured callbacks off the ordinary, unselected transaction path. + private TResult WithSelectedTx(Func body) => + SelectionSource!.WithTx(tx => body(SelectTxContext(tx))); + + private TxOutcome TryWithSelectedTx( + Func> body + ) + where TError : Exception => + SelectionSource!.TryWithTx(tx => body(SelectTxContext(tx))); +#endif + private readonly TransactionalContextState txState; protected ProcedureContextBase( @@ -74,14 +91,28 @@ public TResult UnwrapOrThrow(Func fallbackFactory) => IsSuccess ? Value! : throw (Error ?? fallbackFactory()); } - public TResult WithTx(Func body) => - txState.WithTx(body); + public TResult WithTx(Func body) + { +#if NET10_0_OR_GREATER + if (SelectionSource is not null) + { + return WithSelectedTx(body); + } +#endif + return txState.WithTx(body); + } public TxOutcome TryWithTx( Func> body ) where TError : Exception { +#if NET10_0_OR_GREATER + if (SelectionSource is not null) + { + return TryWithSelectedTx(body); + } +#endif var outcome = txState.TryWithTx(body); return outcome.IsSuccess ? TxOutcome.Success(outcome.Value!) @@ -94,13 +125,32 @@ Func> body public abstract class ProcedureTxContextBase(Internal.TxContext inner) : IRefreshableTxContext { +#if NET10_0_OR_GREATER + private protected ProcedureTxContextBase? SelectionSource; + private protected LocalBase LocalDb = (LocalBase)inner.Db; + private Internal.TxContext currentInner = inner; + + // Selected wrappers must observe refreshes of the original transaction context. + internal Internal.TxContext Inner => SelectionSource?.Inner ?? currentInner; + + internal void Refresh(Internal.TxContext inner) + { + currentInner = inner; + LocalDb = (LocalBase)inner.Db; + } +#else internal Internal.TxContext Inner { get; private set; } = inner; internal void Refresh(Internal.TxContext inner) => Inner = inner; +#endif void IRefreshableTxContext.Refresh(Internal.TxContext inner) => Refresh(inner); +#if NET10_0_OR_GREATER + public LocalBase Db => LocalDb; +#else public LocalBase Db => (LocalBase)Inner.Db; +#endif public DatabaseEnvironment Env { get; } = DatabaseEnvironment.Instance; public Identity Sender => Inner.Sender; public ConnectionId? ConnectionId => Inner.ConnectionId; diff --git a/crates/codegen/src/csharp.rs b/crates/codegen/src/csharp.rs index 1d0e3eadfe8..b879552f931 100644 --- a/crates/codegen/src/csharp.rs +++ b/crates/codegen/src/csharp.rs @@ -627,7 +627,15 @@ impl CsharpScope<'_> { "new global::SpacetimeDB.SqlTableName({namespace:?}, {:?})", name.deref() ), - _ => panic!("Nested namespaces are not supported by C# bindings"), + namespaces => format!( + "new global::SpacetimeDB.SqlTableName(new string[] {{ {} }}, {:?})", + namespaces + .iter() + .map(|segment| format!("{segment:?}")) + .collect::>() + .join(", "), + name.deref() + ), } } diff --git a/crates/testing/tests/standalone_integration_test.rs b/crates/testing/tests/standalone_integration_test.rs index e850771e17f..55a860cf58e 100644 --- a/crates/testing/tests/standalone_integration_test.rs +++ b/crates/testing/tests/standalone_integration_test.rs @@ -117,6 +117,160 @@ fn test_calling_a_reducer_csharp() { test_calling_a_reducer_in_module("module-test-cs"); } +#[test] +#[serial] +fn namespace_csharp_nested_registration() { + init(); + CompiledModule::compile("nested-namespace-test-cs", CompilationMode::Debug).with_module_async( + DEFAULT_CONFIG, + |module| async move { + let host = module.client.module(); + let schema = &host.info.module_def; + let branch = &schema.submodules()["branch_data"]; + assert!(branch.submodules().contains_key("nested_data")); + assert!(schema.submodules().contains_key("leaf_data")); + assert!(schema.submodules().contains_key("promoted_data")); + assert!(schema.submodules().contains_key("second_data")); + assert!(schema.match_http_route(&spacetimedb_lib::http::Method::Get, "/leaf").is_none()); + + let warnings: Vec<_> = ["Branch.Leaf", "Leaf", "Promoted", "SecondLeaf", "class", "class.Branch.Leaf"].into_iter() + .map(|path| format!("HTTP routes declared in submodule '{path}' are ignored. Define HTTP routes in the root module instead.")) + .collect(); + // Warnings must be emitted during description/publication, before any call. + let log = module.read_log(None).await; + for warning in &warnings { + assert!(log.contains(warning)); + } + + // Reuse the existing functions to exercise real immediate reducer/procedure calls. + // Run twice so each target also exercises the cached-name path. + for iteration in 0..2 { + for stage in ["ping", "pong", "next"] { + assert_eq!(module.call_http_route_get(&format!("/schedule/{stage}")).await.unwrap().as_ref(), b"scheduled"); + tokio::time::timeout(std::time::Duration::from_secs(10), async { + loop { + let mut complete = true; + for (path, id) in [("branch_data.nested_data", 2i32), ("outer_data.branch_data.nested_data", 8)] { + let result = spacetimedb::sql::execute::run( + host.relational_db().clone(), + format!("SELECT * FROM {path}.user WHERE id = 1"), + spacetimedb_lib::identity::AuthCtx::for_current(spacetimedb_lib::Identity::ZERO), + Some(host.info.subscriptions.clone()), + Some(host.clone()), + &mut vec![], + ).await.unwrap(); + let expected = match stage { + "ping" => vec![product![1i32, id + 100]], + "pong" => vec![], + _ => vec![product![1i32, id]], + }; + complete &= result.rows == expected; + } + if stage == "next" { + // The first procedure transaction makes rows visible before the + // rollback check finishes. Wait for both procedure bodies to finish. + let logs = read_logs_allowing_warnings(&module, &warnings.iter().map(String::as_str).collect::>()).await; + complete &= ["next:2", "next:8"].iter().all(|message| logs.iter().filter(|line| line.as_str() == *message).count() == iteration + 1); + } + if complete { + break; + } + tokio::time::sleep(std::time::Duration::from_millis(20)).await; + } + }).await.expect("immediate scheduling did not reach the selected instances"); + } + } + assert_eq!(module.call_http_route_get("/schedule/reset").await.unwrap().as_ref(), b"reset"); + + module.call_reducer_binary("ping", &product![]).await.unwrap(); + assert_eq!(module.call_http_route_get("/contexts").await.unwrap().as_ref(), b"selected"); + assert_eq!( + module.call_procedure_with_args("instance", "[]").await.unwrap(), + AlgebraicValue::I32(0) + ); + for (path, id) in [("branch_data.nested_data", 2i32), ("leaf_data", 3), ("promoted_data", 4), ("second_data", 5), ("outer_data", 6), ("outer_data.branch_data.nested_data", 8)] { + module + .call_reducer_binary(&format!("{path}.ping"), &product![]) + .await + .unwrap(); + module + .call_reducer_binary(&format!("{path}.pong"), &product![]) + .await + .unwrap(); + assert_eq!( + module + .call_procedure_with_args(&format!("{path}.instance"), "[]") + .await + .unwrap(), + AlgebraicValue::I32(id) + ); + assert_eq!( + module + .call_procedure_with_args(&format!("{path}.next"), "[]") + .await + .unwrap(), + AlgebraicValue::I32(id + 10) + ); + for (view, expected) in [("current", id), ("anonymous", id + 10), ("query_current", id), ("query_anonymous", id + 10)] { + let result = spacetimedb::sql::execute::run( + host.relational_db().clone(), + format!("SELECT * FROM {path}.{view}"), + spacetimedb_lib::identity::AuthCtx::for_current(spacetimedb_lib::Identity::ZERO), + Some(host.info.subscriptions.clone()), + Some(host.clone()), + &mut vec![], + ) + .await + .unwrap(); + assert_eq!(result.rows, [product![if expected == id { 1i32 } else { 2i32 }, expected]]); + } + } + module.call_reducer_binary("check_tables", &product![]).await.unwrap(); + assert_eq!( + module + .call_procedure_with_args("branch_data.instance", "[]") + .await + .unwrap(), + AlgebraicValue::I32(1) + ); + assert_eq!( + module.call_procedure_with_args("outer_data.branch_data.instance", "[]").await.unwrap(), + AlgebraicValue::I32(7) + ); + for (view, expected) in [("nested", 2i32), ("deep", 8)] { + let result = spacetimedb::sql::execute::run( + host.relational_db().clone(), + format!("SELECT * FROM {view}"), + spacetimedb_lib::identity::AuthCtx::for_current(spacetimedb_lib::Identity::ZERO), + Some(host.info.subscriptions.clone()), + Some(host.clone()), + &mut vec![], + ).await.unwrap(); + assert_eq!(result.rows, [product![expected]]); + } + for (view, expected) in [("branch_data.query_child", 2i32), ("outer_data.branch_data.query_child", 8), ("query_deep", 8), ("query_public", 6)] { + let result = spacetimedb::sql::execute::run( + host.relational_db().clone(), + format!("SELECT * FROM {view}"), + spacetimedb_lib::identity::AuthCtx::for_current(spacetimedb_lib::Identity::ZERO), + Some(host.info.subscriptions.clone()), + Some(host.clone()), + &mut vec![], + ).await.unwrap(); + assert_eq!(result.rows, [product![1i32, expected]]); + } + let messages = read_logs_allowing_warnings(&module, &warnings.iter().map(String::as_str).collect::>()).await + .into_iter().filter(|message| !warnings.contains(message)).collect::>(); + let (scheduled, messages) = messages.split_at(12); + let mut scheduled = scheduled.to_vec(); + scheduled.sort(); + assert_eq!(scheduled, ["leaf:2", "leaf:2", "leaf:8", "leaf:8", "next:2", "next:2", "next:8", "next:8", "pong:2", "pong:2", "pong:8", "pong:8"]); + assert_eq!(messages, + ["root:0", "leaf:2", "pong:2", "next:2", "leaf:3", "pong:3", "next:3", "leaf:4", "pong:4", "next:4", "leaf:5", "pong:5", "next:5", "leaf:6", "pong:6", "next:6", "leaf:8", "pong:8", "next:8"]); + }, + ); +} + #[test] #[serial] fn namespace_csharp_root_selected_at_publish() { diff --git a/docs/docs/00200-core-concepts/00100-databases/00600-submodules.md b/docs/docs/00200-core-concepts/00100-databases/00600-submodules.md index 32ac42ecf9a..9120210f4fc 100644 --- a/docs/docs/00200-core-concepts/00100-databases/00600-submodules.md +++ b/docs/docs/00200-core-concepts/00100-databases/00600-submodules.md @@ -11,16 +11,18 @@ A **submodule** is a SpacetimeDB module that can be included in another module's Submodules let you package reusable database logic as a library that any consumer can integrate without coordinating table names. :::note -Submodules are currently supported in TypeScript only. Support for Rust, C#, and C++ is coming soon. +Submodules are supported in TypeScript and C# (.NET 10 only). Cross-language composition is not supported. ::: ## Writing a Submodule -A submodule is a regular SpacetimeDB module. Nothing special marks a module as a submodule. Export the schema as the default export and export every function (reducers, procedures, views, HTTP handlers) the consumer needs to register. +A submodule is a regular SpacetimeDB module. The same module can be published independently or included by another module; no special root/library build role is required. +Export the schema as the default export and export every function the consumer needs to register. + ```typescript // auth_lib/src/index.ts import { schema, table, t, SyncResponse, Router, type ReducerCtx } from 'spacetimedb/server'; @@ -69,12 +71,58 @@ export const router = spacetimedb.httpRouter( The same file can be published as a standalone database or used as a submodule by another module. The module does not need to declare which role it plays. + + + +Create a normal C# module project targeting `net10.0`, with `SpacetimeDB.Runtime` 2.13 or later. Its public types and functions can be called by the consumer: + +```csharp +// AuthLib/Lib.cs +using SpacetimeDB; + +namespace AuthLib; + +// Any accessible type in this assembly can identify it to the consumer. +public class Marker { } + +[Table(Accessor = "User", Name = "auth_users", Public = true)] +public partial struct User +{ + [PrimaryKey] + public uint Id; + public uint Score; +} + +public static partial class Functions +{ + public static void Insert(ReducerContext ctx, uint id) => + ctx.Db.User.Insert(new User { Id = id, Score = 42 }); + + public static void Insert(ProcedureTxContext ctx, uint id) => + ctx.Db.User.Insert(new User { Id = id, Score = 42 }); + + public static ulong Count(ReducerContext ctx) => ctx.Db.User.Count; + + [Reducer] + public static void Add(ReducerContext ctx, uint id) => Insert(ctx, id); + + [Procedure] + public static ulong CountUsers(ProcedureContext ctx) => + ctx.WithTx(tx => tx.Db.User.Count); + + [View(Accessor = "Users", Public = true)] + public static User? Users(AnonymousViewContext ctx) => ctx.Db.User.Id.Find(2); +} +``` + +Library code uses its own flat accessors, such as `ctx.Db.User`, regardless of the namespace the consumer selects. The `Users` view returns the user with ID `2`, if present. + ## Using a Submodule -The consumer controls the namespace name. Pass the submodule's module-namespace object under the alias you choose. +The consumer controls the namespace name. The accessor name is used in module code and generated bindings; the canonical name is used in SQL and network calls. @@ -121,16 +169,48 @@ import * as authLib from 'auth_lib'; // ✅ correct A default-only import exposes only the submodule's schema, not its named exports (reducers, procedures, views, handlers). The submodule walker requires the full module-namespace object. A clear error is raised if you use the wrong form. ::: + + + +Reference the library with a normal `ProjectReference`, or a package containing its compiled module assembly. Both projects must target .NET 10 and use C# 14. For example, add this to the root module's project file: + +```xml + + + + + +``` + +Referenced module assemblies, including transitive dependencies, are discovered automatically. Assemblies that are not the target of any namespace attribute register once in the root's default `public` scope with flat accessors. Explicitly mounted assemblies register at their declared locations. To place a dependency in a named namespace, add an assembly attribute to the module that includes it: + +```csharp +// Root module's Lib.cs, before any namespace or type declarations +using SpacetimeDB; + +[assembly: Namespace(typeof(AuthLib.Marker), Accessor = "MyAuth", Name = "auth_data")] +``` + +`typeof(AuthLib.Marker)` identifies the dependency assembly. `Accessor = "MyAuth"` creates C# members such as `ctx.Db.MyAuth.User`. `Name = "auth_data"` pins the canonical database namespace, so SQL uses `auth_data.auth_users`. + +When `Name` is omitted, the parent module's case-conversion policy derives it from `Accessor`: under the default `SnakeCase` policy, `MyAuth` becomes `my_auth`. An explicit `Name` is used verbatim. Named dependencies retain their own table/function naming policy; dependencies in `public` inherit the containing scope's policy and cannot explicitly declare a conflicting one. + +:::warning Changing a canonical namespace re-creates its tables +The canonical namespace is part of each table's identity. Changing it removes the old namespace's tables and creates empty tables in the new namespace. To change only C# accessor aliases, keep `Name` fixed while changing `Accessor`. +::: + ## Accessing Submodule Tables and Views -Submodule tables appear under a namespace field on `ctx.db`. The field matches the accessor name you chose, regardless of the canonical name stored in the database. Views exported by a submodule behave like tables from the client's perspective: they are accessible as `.` in subscriptions and SQL queries, where both parts are canonical snake_case names — `activeSessions` in TypeScript is `active_sessions` in SQL, and a submodule registered as `myAuth` is `my_auth`. The generated client bindings expose the camelCase accessors instead, as shown below. +Submodule tables appear under a namespace accessor. The accessor does not change when you pin a different canonical name. Submodule views are also accessible in client subscriptions and SQL as `.`, using canonical names. +Access submodule tables through `ctx.db.myauth`. The `activeSessions` view is `myauth.active_sessions` in SQL. + ```typescript export const example = spacetimedb.reducer((ctx) => { // Consumer's own tables (no namespace) @@ -142,12 +222,37 @@ export const example = spacetimedb.reducer((ctx) => { }); ``` + + + +Access submodule tables through `ctx.Db.MyAuth`. The explicitly named table is `auth_data.auth_users` in SQL, and the `Users` view is `auth_data.users`. + +```csharp +[Reducer] +public static void LookupAuthUser(ReducerContext ctx, uint id) +{ + AuthLib.User? user = ctx.Db.MyAuth.User.Id.Find(id); + foreach (var row in ctx.Db.MyAuth.User.Iter()) + { + Log.Info($"Auth user: {row.Id}"); + } +} +``` + +Root views can also query submodule tables using `ctx.From.MyAuth.User()`. + +```csharp +[View(Accessor = "AuthUsers", Public = true)] +public static IQuery AuthUsers(AnonymousViewContext ctx) => + ctx.From.MyAuth.User().Where(user => user.Score.Eq(42u)); +``` + ## Calling Submodule Functions -A submodule can expose reducers, procedures, views, and HTTP handlers that the consumer calls from its own functions. Because the submodule's context type and the consumer's context type are distinct, use `ctx.as.` to narrow the context before passing it to a submodule function. +A consumer can call public submodule functions directly. A namespace is not a security boundary between ordinary helper calls. ### From a Reducer @@ -158,7 +263,7 @@ Call a submodule reducer or a plain helper function typed against the submodule' ```typescript // auth_lib: plain helper function typed against the submodule's own schema -export function sessionCountHelper(ctx: ReducerCtx): number { +export function sessionCountHelper(ctx: ReducerCtx): bigint { return ctx.db.sessions.count(); } @@ -177,6 +282,24 @@ export const onLogin = spacetimedb.reducer({ token: t.string() }, (ctx, { token For reducers registered through the submodule's own schema (via `schema.reducer(...)`), the host passes a scoped context automatically when invoked directly. `ctx.as` is only needed when the consumer calls a submodule function explicitly. + + + +Call the library's reducer or helper as an ordinary C# method, using `ctx.As.MyAuth` to select the mounted instance: + +```csharp +[Reducer] +public static void AddAuthUser(ReducerContext ctx, uint id) +{ + AuthLib.Functions.Add(ctx.As.MyAuth, id); + Log.Info($"Auth users: {AuthLib.Functions.Count(ctx.As.MyAuth)}"); +} +``` + +`ctx.As.MyAuth` supplies a `ReducerContext` for that instance. Library code still uses flat accessors such as `ctx.Db.User`. Selection preserves the caller's sender, connection, timestamp, and shared state without changing the original context. These calls run in the root reducer's transaction. If the reducer fails, its writes to both root and submodule tables roll back together. + +Passing `ctx` directly remains supported when the library's instance is unambiguous. If multiple instances are accessible, select one explicitly with `ctx.As`; ambiguous access throws an `InvalidOperationException`. Host-dispatched functions receive the appropriate instance context automatically. + @@ -208,6 +331,27 @@ export const transactAndCount = spacetimedb.procedure( ); ``` + + + +Use `ctx.As.MyAuth` to select the instance for a library procedure. Inside `WithTx`, select with `tx.As.MyAuth` and use helpers accepting `ProcedureTxContext`, such as the `Insert` overload above: + +```csharp +[Procedure] +public static ulong CountAuthUsers(ProcedureContext ctx) => + AuthLib.Functions.CountUsers(ctx.As.MyAuth); + +[Procedure] +public static ulong AddAndCountAuthUsers(ProcedureContext ctx, uint id) => + ctx.WithTx(tx => + { + AuthLib.Functions.Insert(tx.As.MyAuth, id); + return tx.Db.MyAuth.User.Count; + }); +``` + +Root and library writes within the same `WithTx` block share a transaction. + @@ -231,12 +375,37 @@ export const router = spacetimedb.httpRouter( ); ``` + + + +Use `ctx.As.MyAuth` to select the instance for a library handler. Declare the route in the root, because routes from named dependencies are ignored: + +```csharp +// Add to AuthLib.Functions. Handler transactions are an unstable API. +#pragma warning disable STDB_UNSTABLE +[HttpHandler] +public static HttpResponse AuthCount(HandlerContext ctx, HttpRequest request) => + new(200, HttpVersion.Http11, [], + HttpBody.FromString(ctx.WithTx(tx => tx.Db.User.Count).ToString())); +``` + +```csharp +// Add to the root module's partial functions class. +[HttpHandler] +public static HttpResponse RootAuthCount(HandlerContext ctx, HttpRequest request) => + AuthLib.Functions.AuthCount(ctx.As.MyAuth, request); + +[HttpRouter] +public static Router Routes() => + Router.New().Get("/auth-count", SpacetimeDB.Handlers.RootAuthCount); +``` + ## Multiple and Nested Submodules -Multiple submodules compose freely. Each gets its own namespace, so name collisions between submodules are impossible. +You can include multiple submodules under different namespaces. Tables and functions in separate namespaces can use the same names. A submodule can itself include other submodules. @@ -266,14 +435,98 @@ export default authSchema; **Lifecycle reducers** (`init`, `clientConnected`, `clientDisconnected`) are an exception: these are only allowed for the root module. Modules containing submodules which define lifecycle reducers will fail to publish. + + + +Declare a namespace for each dependency assembly in the root: + +```csharp +[assembly: SpacetimeDB.Namespace(typeof(AuthLib.Marker), Accessor = "MyAuth", Name = "auth_data")] +[assembly: SpacetimeDB.Namespace(typeof(PaymentLib.Marker), Accessor = "Payments")] +``` + +The root uses `ctx.Db.MyAuth.User` and `ctx.Db.Payments.`. Each module can declare its own child mounts. The same assembly can be mounted more than once, with independent tables and function instances at each path. + +For example, two libraries can each mount their own instance of `AuthLib`: + +```csharp +// StoreLib/Lib.cs (references AuthLib) +using SpacetimeDB; +[assembly: Namespace(typeof(AuthLib.Marker), Accessor = "MyAuth", Name = "auth_data")] +namespace StoreLib; +public class Marker { } +``` + +```csharp +// ForumLib/Lib.cs (references AuthLib) +using SpacetimeDB; +[assembly: Namespace(typeof(AuthLib.Marker), Accessor = "MyAuth", Name = "auth_data")] +namespace ForumLib; +public class Marker { } +``` + +```csharp +// Root module (references StoreLib and ForumLib) +using SpacetimeDB; +[assembly: Namespace(typeof(StoreLib.Marker), Accessor = "Store")] +[assembly: Namespace(typeof(ForumLib.Marker), Accessor = "Forum")] + +public static partial class Functions +{ + [Reducer] + public static void AddUsers(ReducerContext ctx, uint id) + { + AuthLib.Functions.Add(ctx.As.Store.MyAuth, id); + AuthLib.Functions.Add(ctx.As.Forum.MyAuth, id); + } + + [View(Accessor = "StoreUsers", Public = true)] + public static IQuery StoreUsers(AnonymousViewContext ctx) => + ctx.From.Store.MyAuth.User(); +} +``` + +The two inserts above write to separate tables, `store.auth_data.auth_users` and `forum.auth_data.auth_users`. The root accesses them through `ctx.Db.Store.MyAuth.User` and `ctx.Db.Forum.MyAuth.User`. Code inside either parent selects its own child with `ctx.As.MyAuth`. View helpers can also receive a selected context; their flat `ctx.From.User()` queries then target that instance. + +Generated client bindings preserve the full path: + +```csharp +conn.SubscriptionBuilder() + .AddQuery(q => q.From.Store.MyAuth.User()) + .AddQuery(q => q.From.Forum.MyAuth.User()) + .Subscribe(); + +conn.Reducers.Store.MyAuth.Add(10); + +// After the subscription has been applied, read each instance's cache. +var storeUser = conn.Db.Store.MyAuth.User.Id.Find(10); +var forumUser = conn.Db.Forum.MyAuth.User.Id.Find(10); +``` + +You can also mount the same assembly twice directly in one parent by declaring two `Namespace` attributes with distinct accessors and canonical names. `Accessor = "public"` merges a dependency into its containing scope without adding a path segment; its named children remain accessible under that scope. + +For immediate scheduling, pass a selected context to the generated context-aware overload so it targets the intended instance: + +```csharp +// Inside a root HTTP handler. Immediate scheduling is an unstable API. +#pragma warning disable STDB_UNSTABLE +AuthLib.Functions.VolatileNonatomicScheduleImmediateAdd(ctx.As.Store.MyAuth, 10u); +AuthLib.Functions.VolatileNonatomicScheduleImmediateCountUsers(ctx.As.Forum.MyAuth); +#pragma warning restore STDB_UNSTABLE +``` + +Dependencies in named scopes cannot define lifecycle reducers (`Init`, `ClientConnected`, `ClientDisconnected`). Such reducers remain valid when the dependency is published independently or contributes to the root's `public` scope, subject to the usual lifecycle uniqueness checks. A `public` dependency inside a named submodule still belongs to that named scope. + ## Environment variables -Only the root module can declare a nonempty [environment](./00700-environment-variables.md). Including a submodule with environment declarations causes publication to fail. A module with such declarations can still be published independently as a root module. +Named submodules cannot declare a nonempty [environment](./00700-environment-variables.md). Such declarations cause composition or publication to fail. A module with environment declarations can still be published independently as a root module. + +In C#, dependencies registered in the default `public` scope are an exception: their declarations contribute to the root environment schema. -Submodules have no separate environment-variable namespace, and their host-dispatched entry points cannot read the root module's environment. Root module code can pass configuration values to helpers explicitly. Ordinary helper calls retain the calling entry point's access, including calls to helpers defined in submodules. +Named submodules have no separate environment-variable namespace, and their host-dispatched entry points cannot read the root module's environment. Root module code can pass configuration values to helpers explicitly. Ordinary helper calls retain the calling entry point's access, including calls to helpers defined in submodules. ## Client Subscriptions @@ -286,10 +539,33 @@ Client subscriptions use the same namespace structure as server-side access. Sub conn.subscriptionBuilder().subscribe(tables => [ tables.players.build(), // public.players tables.myauth.users.build(), // myauth.users - tables.myauth.activeSessions.build(), // myauth.activeSessions view + tables.myauth.activeSessions.build(), // myauth.active_sessions view ]); ``` + + + +```csharp +// conn is a connected, generated DbConnection. +conn.SubscriptionBuilder() + .AddQuery(q => q.From.MyAuth.User()) // auth_data.auth_users + .AddQuery(q => q.From.MyAuth.Users()) // auth_data.users view + .Subscribe(); +``` + +The generated query builder translates C# accessors to canonical SQL names automatically. Subscribed rows are available through `conn.Db.MyAuth.User` and `conn.Db.MyAuth.Users`, using the same connection and cache as the root tables. + +```csharp +// After the subscription has been applied, read the local cache. +foreach (var user in conn.Db.MyAuth.User.Iter()) +{ + Console.WriteLine($"Auth user: {user.Id}, score: {user.Score}"); +} + +var cachedUser = conn.Db.MyAuth.User.Id.Find(10); +``` + @@ -299,7 +575,7 @@ Submodule reducers and procedures are identified by their fully-qualified name, ### Client SDK -In generated bindings, submodule tables, views, reducers, and procedures appear as nested objects under the namespace alias. The `tables`, `reducers`, and `procedures` exports all reflect the same nesting. +In generated bindings, submodule tables, views, reducers, and procedures appear under the namespace accessor. @@ -340,35 +616,111 @@ const conn = DbConnection.builder() conn.reducers.myauth.verifyToken({ token: 'abc123' }); ``` + + + +```csharp +// conn is a connected, generated DbConnection. +conn.Reducers.MyAuth.Add(10); + +conn.Procedures.MyAuth.CountUsers((ctx, result) => +{ + if (result.IsSuccess) + { + Console.WriteLine($"Auth users: {result.Value}"); + } +}); +``` + +As with other C# client calls, keep processing connection events with `conn.FrameTick()` (or your SDK integration's event loop) to receive subscription updates and callbacks. + ### HTTP API + + + ``` POST /v1/database/my-database/call/myauth.verify_token ``` + + + +``` +POST /v1/database/my-database/call/auth_data.add +``` + + + + ### CLI + + + ```bash spacetime call my-database "myauth.verify_token" '"abc123"' ``` -Both parts of the wire name are canonical: the namespace prefix is the canonical namespace name -(`myauth` here, or `my_auth` for a submodule registered as `myAuth`), and the function name after -`.` is the canonical snake_case form of the submodule's export name -- `verifyToken` in TypeScript -is `verify_token` on the wire. Generated client bindings expose the camelCase accessors instead, -as shown above. +The accessor `verifyToken` becomes `verify_token` on the wire under the default naming policy. + + + + +```bash +spacetime call my-database "auth_data.add" 10 +``` + +The accessor `Add` becomes `add` on the wire under the default naming policy. + + + + +Both parts of the wire name are canonical: the namespace prefix and the function name after `.`. ## Namespace Name Rules -Both the accessor name (the key you register the submodule under) and the canonical name (derived from it, or given explicitly via `name`) must be valid SpacetimeDB identifiers: start with a letter or underscore, continue with letters, digits, or underscores, maximum 63 characters, case-insensitive for resolution. Two submodules cannot share a canonical name, so `myAuth` and `my_auth` cannot both be registered under the default policy. A submodule can be registered under at most one namespace per consumer module. +Each accessor and canonical namespace segment must be a valid SpacetimeDB identifier: start with a letter or underscore, continue with letters, digits, or underscores, maximum 63 UTF-8 bytes, case-insensitive for resolution. Two submodules in the same parent scope cannot share a canonical name, so `myAuth` and `my_auth` cannot both be registered there under the default policy. Different parent scopes can reuse the same child namespace name. -The reserved namespaces `public`, `st`, `spacetimedb`, and `pg_*` cannot be used as submodule namespaces. +The reserved namespaces `st`, `spacetimedb`, and names starting with `pg_` cannot be used. `public` is the default scope, not a named submodule namespace. + + + + +The schema key is the accessor name. The canonical name is derived from it unless explicitly set with `name`. A submodule can be registered under at most one namespace per consumer module. + + + + +`Accessor` sets the accessor name. The canonical name is derived from it unless explicitly set with `Name`. Use `Accessor = "public"` to register a dependency in the default scope with flat accessors. + +Accessors must also be valid C# identifiers. For a keyword, use its plain spelling in the attribute (`Accessor = "class"`) and escape it in expressions (`ctx.Db.@class.User`). + + + ## Limitations ### Submodule routers are not applied automatically -A submodule can define its own `httpRouter`, but when used as a submodule that router is ignored. Only the consumer's root router is used. To expose a submodule's HTTP handlers, register them explicitly on the consumer's router using `ctx.as.` as shown in the [HTTP handler section](#from-an-http-handler). +Routes from named submodules are ignored. Register handlers explicitly on the root router, as shown in the [HTTP handler section](#from-an-http-handler). In C#, dependencies registered in `public` can contribute routes to root-level routing. + +### Row-level security belongs in the root + +Define [row-level security](../../00250-how-to/00400-row-level-security.md) filters in the root, referring to canonical qualified table names. Filters declared inside named submodules do not protect their tables. + + + + +Submodule filter declarations are accepted by the SDK, but the host does not install them. Export filters from the root schema instead, using qualified table names such as `myauth.users`. + + + + +Named dependencies cannot declare filters; the source generator rejects them. Define filters in the root instead, using qualified table names such as `auth_data.auth_users`. + + + diff --git a/modules/nested-namespace-test-cs/Directory.Build.props b/modules/nested-namespace-test-cs/Directory.Build.props new file mode 100644 index 00000000000..f086bb4ee9b --- /dev/null +++ b/modules/nested-namespace-test-cs/Directory.Build.props @@ -0,0 +1,10 @@ + + + + net10.0 + + + + + + diff --git a/modules/nested-namespace-test-cs/Lib.cs b/modules/nested-namespace-test-cs/Lib.cs new file mode 100644 index 00000000000..dc5988a6430 --- /dev/null +++ b/modules/nested-namespace-test-cs/Lib.cs @@ -0,0 +1,226 @@ +using System; +using SpacetimeDB; +using SpacetimeDB.Internal; + +#pragma warning disable STDB_UNSTABLE + +[assembly: Namespace(typeof(NestedBranch.Functions), Accessor = "Branch", Name = "branch_data")] +[assembly: Namespace(typeof(NestedLeaf.Functions), Accessor = "Leaf", Name = "leaf_data")] +[assembly: Namespace(typeof(NestedLeaf.Functions), Accessor = "SecondLeaf", Name = "second_data")] +[assembly: Namespace(typeof(NestedOuter.Marker), Accessor = "class", Name = "outer_data")] + +namespace NestedRoot; + +[Table(Accessor = "User", Public = true)] +public partial struct User +{ + public string Name; +} + +[Type] +public partial struct NestedResult +{ + public int Value; +} + +public static partial class Functions +{ + [View(Accessor = "QueryDeep", Public = true)] + public static IQuery QueryDeep(ViewContext ctx) => + ctx + .From.@class.Branch.Leaf.RefUser() + .Where(row => row.Value.Eq(8)) + .LeftSemijoin(ctx.From.SecondLeaf.RefUser(), (deep, other) => deep.Id.Eq(other.Id)); + + [View(Accessor = "QueryPublic", Public = true)] + public static IQuery QueryPublic(AnonymousViewContext ctx) => + ctx + .From.Promoted.RefUser() + .Where(row => row.Value.Eq(4)) + .RightSemijoin(ctx.From.@class.RefUser(), (other, direct) => other.Id.Eq(direct.Id)); + + [Reducer] + public static void Ping(ReducerContext ctx) => Log.Info($"root:{Module.GetInstanceId(ctx)}"); + + [Procedure] + public static int Instance(ProcedureContext ctx) + { + NestedBranch.Functions.CheckSelection(ctx.As.Branch, ctx, 2); + NestedBranch.Functions.CheckSelection(ctx.As.@class.Branch, ctx, 8); + ProcedureTxContext? selected = null; + ctx.WithTx(tx => + { + selected = tx.As.@class.Branch.Leaf; + NestedLeaf.Functions.BeginSelectedTx(selected); + return true; + }); + try + { + ctx.WithTx(tx => + { + NestedLeaf.Functions.Write(selected!, -1); + tx.Db.User.Insert(new User { Name = "rollback" }); + throw new InvalidOperationException("rollback"); + }); + } + catch (InvalidOperationException error) when (error.Message == "rollback") { } + ctx.WithTx(tx => + { + NestedLeaf.Functions.FinishSelectedTx(selected!, tx); + if (tx.Db.User.Count != 0 || tx.Db.Branch.Leaf.User.Count != 0) + { + throw new Exception("Selected transaction changed another scope."); + } + return true; + }); + return Module.GetInstanceId(ctx); + } + + [Reducer] + public static void CheckTables(ReducerContext ctx) + { + if ( + ctx.Db.User.Count != 0 + || ctx.Db.Branch.Leaf.User.Id.Find(1)?.Value != 2 + || ctx.Db.Leaf.User.Id.Find(1)?.Value != 3 + || ctx.Db.Promoted.User.Id.Find(1)?.Value != 4 + || ctx.Db.SecondLeaf.User.Id.Find(1)?.Value != 5 + || ctx.Db.@class.User.Id.Find(1)?.Value != 6 + || ctx.Db.@class.Branch.Leaf.User.Id.Find(1)?.Value != 8 + ) + { + throw new Exception("Root accessors did not select separate table instances."); + } + var nested = ctx.Db.@class.Branch.Leaf.User; + nested.Id.Update(new NestedLeaf.User { Id = 1, Value = 80 }); + if (ctx.Db.Branch.Leaf.User.Id.Find(1)?.Value != 2) + { + throw new Exception("Deep accessor modified the other Branch instance."); + } + nested.Id.Update(new NestedLeaf.User { Id = 1, Value = 8 }); + ReducerContext[] selected = + [ + ctx.As.Branch.Leaf, + ctx.As.Leaf, + ctx.As.Promoted, + ctx.As.SecondLeaf, + ctx.As.@class, + ctx.As.@class.Branch.Leaf, + ]; + int[] instanceIds = [2, 3, 4, 5, 6, 8]; + var previous = ctx.NewUuidV7(); + for (var i = 0; i < selected.Length; i++) + { + var next = NestedLeaf.Functions.CheckReducerSelection(selected[i], ctx, instanceIds[i]); + if (next.GetCounter() != previous.GetCounter() + 1) + { + throw new Exception("Selected reducer copied its UUID counter."); + } + previous = next; + } + if ( + ctx.NewUuidV7().GetCounter() != previous.GetCounter() + 1 + || Module.GetInstanceId(ctx) != 0 + || ctx.Db.User.Count != 0 + ) + { + throw new Exception("Context selection changed the caller or copied its UUID counter."); + } + // Without selecting a mount, the root cannot choose between four Leaf instances. + try + { + NestedLeaf.Functions.Count(ctx); + throw new Exception("Ambiguous library access unexpectedly succeeded."); + } + catch (InvalidOperationException error) when (error.Message.Contains("multiple instances")) + { } + } + + [View(Accessor = "Nested", Public = true)] + public static NestedResult? Nested(ViewContext ctx) + { + ViewContext selected = ctx.As.Branch.Leaf; + if (selected.Sender != ctx.Sender || Module.GetInstanceId(ctx) != 0) + { + throw new Exception("View selection changed caller state."); + } + return new NestedResult { Value = NestedLeaf.Functions.Current(selected)!.Value.Value }; + } + + [View(Accessor = "Deep", Public = true)] + public static NestedResult? Deep(AnonymousViewContext ctx) + { + if (ctx.Db.@class.User.Id.Find(1)?.Value != 6) + { + throw new Exception("Public contribution was not exposed in the read-only namespace."); + } + return new NestedResult { Value = NestedLeaf.Functions.Read(ctx.As.@class.Branch.Leaf) }; + } + + [HttpHandler] + public static HttpResponse CheckContextSelection(HandlerContext ctx, HttpRequest request) + { + NestedLeaf.Functions.CheckHandlerSelection(ctx.As.Branch.Leaf, ctx); + NestedLeaf.Functions.CheckHandlerSelection(ctx.As.@class.Branch.Leaf, ctx); + ctx.WithTx(tx => + { + NestedLeaf.Functions.CheckSelectedHandlerTx(tx.As.SecondLeaf, tx); + return true; + }); + return new(200, HttpVersion.Http11, [], HttpBody.FromString("selected")); + } + + [HttpRouter] + public static Router Routes() => + Router + .New() + .Get("/contexts", Handlers.CheckContextSelection) + .Get("/schedule/ping", Handlers.Schedule) + .Get("/schedule/reset", Handlers.Schedule) + .Get("/schedule/pong", Handlers.Schedule) + .Get("/schedule/next", Handlers.Schedule); + + [HttpHandler] + public static HttpResponse Schedule(HandlerContext ctx, HttpRequest request) + { + if ( + request.Uri.EndsWith("/ping", StringComparison.Ordinal) + || request.Uri.EndsWith("/reset", StringComparison.Ordinal) + ) + { + // An ambiguous call must not poison subsequent explicitly selected calls. + try + { + NestedLeaf.Functions.VolatileNonatomicScheduleImmediatePing(ctx); + throw new Exception("Ambiguous scheduling unexpectedly succeeded."); + } + catch (InvalidOperationException error) + when (error.Message.Contains("multiple instances")) { } + ctx.WithTx(tx => + { + tx.Db.Branch.Leaf.User.Clear(); + tx.Db.Branch.Leaf.RefUser.Clear(); + tx.Db.@class.Branch.Leaf.User.Clear(); + tx.Db.@class.Branch.Leaf.RefUser.Clear(); + return true; + }); + if (request.Uri.EndsWith("/reset", StringComparison.Ordinal)) + { + return new(200, HttpVersion.Http11, [], HttpBody.FromString("reset")); + } + NestedLeaf.Functions.VolatileNonatomicScheduleImmediatePing(ctx.As.Branch.Leaf); + NestedLeaf.Functions.VolatileNonatomicScheduleImmediatePing(ctx.As.@class.Branch.Leaf); + } + else if (request.Uri.EndsWith("/pong", StringComparison.Ordinal)) + { + NestedLeaf.Functions.VolatileNonatomicScheduleImmediatePong(ctx.As.Branch.Leaf); + NestedLeaf.Functions.VolatileNonatomicScheduleImmediatePong(ctx.As.@class.Branch.Leaf); + } + else + { + NestedBranch.Functions.ScheduleNext(ctx.As.Branch); + NestedBranch.Functions.ScheduleNext(ctx.As.@class.Branch); + } + return new(200, HttpVersion.Http11, [], HttpBody.FromString("scheduled")); + } +} diff --git a/modules/nested-namespace-test-cs/README.md b/modules/nested-namespace-test-cs/README.md new file mode 100644 index 00000000000..5ffc97a1e18 --- /dev/null +++ b/modules/nested-namespace-test-cs/README.md @@ -0,0 +1,45 @@ +# Nested C# Schema, Dispatch, and Tables + +This .NET 10 fixture registers one Leaf assembly six times: under Branch.Leaf, +Leaf, Promoted, SecondLeaf, class, and class.Branch.Leaf. Their database names are +branch_data.nested_data, leaf_data, promoted_data, second_data, outer_data, and +outer_data.branch_data.nested_data. The otherwise unused Public dependency +contributes its Promoted mount directly to the root scope. Branch itself is +instantiated twice, and `class` exercises a C# keyword accessor. Outer registers +Leaf in public, so its tables appear directly at `ctx.Db.@class.User`. + +The integration test verifies independent child schemas and depth-first reducer, +procedure, view, and anonymous-view dispatch, including empty function categories. +Functions return or log their context's instance ID so repeated calls to the same +DLL can be distinguished. Root and Leaf also define different User row types. +Leaf's HTTP route must be ignored at every mount, with publication warnings. + +Each Leaf instance writes its own User table using cached writable handles, +primary-key and B-tree indexes, scans, deletes, and clear. Procedure transactions +commit to that instance and roll back failed writes. Both kinds of views read the +same rows through read-only handles. Root reducers and views access tables two +and three levels deep (`ctx.Db.Branch.Leaf.User` and +`ctx.Db.@class.Branch.Leaf.User`). Writing through one path must not change the +other copy. Calling Leaf directly with an ambiguous root context must fail. + +The [generated client](../../sdks/csharp/examples~/regression-tests/nested-namespaces/) +also runs against this module on .NET 8 and .NET 10. It covers nested client query +builders, cache updates, reducer events/errors, procedure results/errors, views, +joins, one-off queries, and unsubscribe cleanup. + +Module query views also exercise library-local `ctx.From.User()` in every Leaf +instance, child queries in both Branch instances, and three-level root queries +with filters and both semijoin directions. Public contributions and promoted +mounts use the same instance-aware query paths. + +Context-selection checks pass `ctx.As` paths to ordinary C# methods in Leaf and +Branch. They cover every Leaf placement, selection again inside Branch, both +view contexts, procedure and handler transactions, shared auth/RNG/UUID state, +and commit/rollback without changing the caller. A retained selected transaction +also observes refreshed timestamps on later attempts. The root `/contexts` +HTTP route exercises handler selection without enabling submodule routes. + +The root `/schedule/*` routes exercise immediate reducer and procedure scheduling +against both nested Leaf copies. Calls use `ctx.As` paths directly and resolve +Leaf relative to a selected Branch context. The host test repeats the sequence +to exercise cached names, waits for execution, and rejects ambiguous root calls. diff --git a/modules/nested-namespace-test-cs/libraries/Branch/Branch.csproj b/modules/nested-namespace-test-cs/libraries/Branch/Branch.csproj new file mode 100644 index 00000000000..d9c30f927e5 --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Branch/Branch.csproj @@ -0,0 +1,9 @@ + + + NestedBranch + $(AssemblyName) + + + + + diff --git a/modules/nested-namespace-test-cs/libraries/Branch/Lib.cs b/modules/nested-namespace-test-cs/libraries/Branch/Lib.cs new file mode 100644 index 00000000000..deb205bff32 --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Branch/Lib.cs @@ -0,0 +1,37 @@ +using System; +using SpacetimeDB; +using SpacetimeDB.Internal; + +[assembly: Namespace(typeof(NestedLeaf.Functions), Accessor = "Leaf", Name = "nested_data")] + +namespace NestedBranch; + +// Deliberately no reducers or anonymous views: global dispatch must skip empty categories. +public static partial class Functions +{ +#pragma warning disable STDB_UNSTABLE + public static void ScheduleNext(HandlerContext ctx) => + NestedLeaf.Functions.VolatileNonatomicScheduleImmediateNext(ctx); +#pragma warning restore STDB_UNSTABLE + + public static void CheckSelection( + ProcedureContext ctx, + ProcedureContext caller, + int expected + ) => NestedLeaf.Functions.CheckProcedureSelection(ctx.As.Leaf, caller, expected); + + [View(Accessor = "QueryChild", Public = true)] + public static IQuery QueryChild(ViewContext ctx) => + ctx.From.Leaf.User().Where(row => row.Value.Eq(Module.GetInstanceId(ctx) + 1)); + + [Procedure] + public static int Instance(ProcedureContext ctx) => + ctx.WithTx(tx => + { + if (tx.Db.Leaf.User.Id.Find(1)?.Value != Module.GetInstanceId(ctx) + 1) + { + throw new Exception("Branch accessed a different Leaf instance."); + } + return Module.GetInstanceId(ctx); + }); +} diff --git a/modules/nested-namespace-test-cs/libraries/Leaf/Leaf.csproj b/modules/nested-namespace-test-cs/libraries/Leaf/Leaf.csproj new file mode 100644 index 00000000000..5e021a2ebd3 --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Leaf/Leaf.csproj @@ -0,0 +1,6 @@ + + + NestedLeaf + $(AssemblyName) + + diff --git a/modules/nested-namespace-test-cs/libraries/Leaf/Lib.cs b/modules/nested-namespace-test-cs/libraries/Leaf/Lib.cs new file mode 100644 index 00000000000..8a975b59a1a --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Leaf/Lib.cs @@ -0,0 +1,310 @@ +using System; +using System.Linq; +using SpacetimeDB; +using SpacetimeDB.Internal; + +#pragma warning disable STDB_UNSTABLE + +namespace NestedLeaf; + +[Table(Accessor = "User", Public = true)] +[SpacetimeDB.Index.BTree(Accessor = "ByValue", Columns = [nameof(Value)])] +public partial struct User +{ + [PrimaryKey] + public int Id; + public int Value; +} + +[Table(Accessor = "RefUser", Public = true)] +public partial class RefUser +{ + [PrimaryKey] + public int Id; + public int Value; +} + +public static partial class Functions +{ + public static ulong Count(ReducerContext ctx) => ctx.Db.User.Count; + + public static Uuid CheckReducerSelection( + ReducerContext ctx, + ReducerContext caller, + int expected + ) + { + if ( + Module.GetInstanceId(ctx) != expected + || ctx.Sender != caller.Sender + || ctx.ConnectionId != caller.ConnectionId + || ctx.Timestamp != caller.Timestamp + || !ReferenceEquals(ctx.SenderAuth, caller.SenderAuth) + || !ReferenceEquals(ctx.Rng, caller.Rng) + ) + { + throw new Exception("Selected reducer context lost caller state."); + } + ctx.Db.User.Insert(new User { Id = 99, Value = expected }); + if (!ctx.Db.User.Id.Delete(99)) + { + throw new Exception("Selected reducer wrote to the wrong table."); + } + return ctx.NewUuidV7(); + } + + public static void Write(ProcedureTxContext ctx, int value) => + ctx.Db.User.Id.Update(new User { Id = 99, Value = value }); + + public static void BeginSelectedTx(ProcedureTxContext ctx) => + ctx.Db.User.Insert(new User { Id = 99, Value = 8 }); + + public static void FinishSelectedTx(ProcedureTxContext ctx, ProcedureTxContext caller) + { + if ( + ctx.Db.User.Id.Find(99)?.Value != 8 + || ctx.Timestamp != caller.Timestamp + || ctx.Sender != caller.Sender + || ctx.ConnectionId != caller.ConnectionId + || !ReferenceEquals(ctx.SenderAuth, caller.SenderAuth) + || !ReferenceEquals(ctx.Rng, caller.Rng) + ) + { + throw new Exception("Selected transaction failed to share refresh/rollback state."); + } + ctx.Db.User.Id.Delete(99); + } + + public static void CheckSelectedHandlerTx(HandlerTxContext ctx, HandlerTxContext caller) + { + if ( + ctx.Timestamp != caller.Timestamp + || !ReferenceEquals(ctx.Rng, caller.Rng) + || !ReferenceEquals(ctx.SenderAuth, caller.SenderAuth) + ) + { + throw new Exception("Selected handler transaction copied caller state."); + } + ctx.Db.User.Insert(new User { Id = 99, Value = 5 }); + ctx.Db.User.Id.Delete(99); + } + + public static void CheckProcedureSelection( + ProcedureContext ctx, + ProcedureContext caller, + int expected + ) + { + if ( + Module.GetInstanceId(ctx) != expected + || ctx.Sender != caller.Sender + || ctx.ConnectionId != caller.ConnectionId + || !ReferenceEquals(ctx.SenderAuth, caller.SenderAuth) + || !ReferenceEquals(ctx.Rng, caller.Rng) + || !ReferenceEquals(ctx.Http, caller.Http) + ) + { + throw new Exception("Selected procedure context lost caller state."); + } + var first = caller.NewUuidV7(); + var second = ctx.NewUuidV7(); + var third = caller.NewUuidV7(); + if ( + second.GetCounter() != first.GetCounter() + 1 + || third.GetCounter() != second.GetCounter() + 1 + ) + { + throw new Exception("Selected procedure copied its UUID counter."); + } + // Exercise the base API as well as the typed transaction callback. + ((ProcedureContextBase)ctx).WithTx(tx => + { + ((ProcedureTxContext)tx).Db.User.Insert(new User { Id = 99, Value = expected }); + return true; + }); + var failed = ctx.TryWithTx(tx => + { + Write(tx, -1); + return Result.Err(new("rollback")); + }); + ctx.WithTx(tx => + { + if ( + failed.IsSuccess + || tx.Db.User.Id.Find(99)?.Value != expected + || tx.Timestamp != caller.Timestamp + || ctx.Timestamp != caller.Timestamp + ) + { + throw new Exception( + "Selected procedure transaction did not share refresh/rollback state." + ); + } + tx.Db.User.Id.Delete(99); + return true; + }); + } + + public static void CheckHandlerSelection(HandlerContext ctx, HandlerContext caller) + { + if (!ReferenceEquals(ctx.Rng, caller.Rng) || !ReferenceEquals(ctx.Http, caller.Http)) + { + throw new Exception("Selected handler copied caller state."); + } + var first = caller.NewUuidV7(); + var second = ctx.NewUuidV7(); + var third = caller.NewUuidV7(); + if ( + second.GetCounter() != first.GetCounter() + 1 + || third.GetCounter() != second.GetCounter() + 1 + ) + { + throw new Exception("Selected handler copied its UUID counter."); + } + ((HandlerContextBase)ctx).WithTx(tx => + { + ((HandlerTxContext)tx).Db.User.Insert(new User { Id = 99, Value = 99 }); + return true; + }); + var failed = ctx.TryWithTx(tx => + { + tx.Db.User.Id.Update(new User { Id = 99, Value = -1 }); + return Result.Err(new("rollback")); + }); + ctx.WithTx(tx => + { + if ( + failed.IsSuccess + || tx.Db.User.Id.Find(99)?.Value != 99 + || ctx.Timestamp != caller.Timestamp + ) + { + throw new Exception("Selected handler transaction lost its state."); + } + tx.Db.User.Id.Delete(99); + return true; + }); + } + + public static int Read(AnonymousViewContext ctx) => ctx.Db.User.Id.Find(1)!.Value.Value; + + [Reducer] + public static void Ping(ReducerContext ctx) + { + var id = Module.GetInstanceId(ctx); + var table = ctx.Db.User; + if (!ReferenceEquals(table.Id, ctx.Db.User.Id)) + { + throw new Exception("Table and index handles must be cached."); + } + if (table.Count != 0) + { + throw new Exception("Another instance wrote into this table."); + } + table.Insert(new User { Id = 1, Value = id }); + table.Id.Update(new User { Id = 1, Value = id + 100 }); + if (table.ByValue.Filter(id + 100).Single().Id != 1) + { + throw new Exception("Index update targeted the wrong instance."); + } + ctx.Db.RefUser.Insert(new RefUser { Id = 1, Value = id }); + ctx.Db.RefUser.Id.Update(new RefUser { Id = 1, Value = id + 100 }); + if (ctx.Db.RefUser.Id.Find(1)?.Value != id + 100) + { + throw new Exception("Reference-row update targeted the wrong instance."); + } + Log.Info($"leaf:{id}"); + } + + [Reducer] + public static void Pong(ReducerContext ctx) + { + var table = ctx.Db.User; + var id = Module.GetInstanceId(ctx); + if (table.Iter().Single().Value != id + 100 || table.ByValue.Delete(id + 100) != 1) + { + throw new Exception("Index scan/delete targeted the wrong instance."); + } + table.Insert(new User { Id = 2, Value = id }); + if (!table.Delete(new User { Id = 2, Value = id })) + { + throw new Exception("Row delete failed."); + } + table.Insert(new User { Id = 3, Value = id }); + table.Clear(); + if (table.Count != 0) + { + throw new Exception("Clear targeted the wrong instance."); + } + if (!ctx.Db.RefUser.Id.Delete(1) || ctx.Db.RefUser.Count != 0) + { + throw new Exception("Unique-index delete targeted the wrong instance."); + } + Log.Info($"pong:{id}"); + } + + [Procedure] + public static int Instance(ProcedureContext ctx) => Module.GetInstanceId(ctx); + + [Procedure] + public static int Next(ProcedureContext ctx) + { + var id = Module.GetInstanceId(ctx); + ctx.WithTx(tx => + { + tx.Db.User.Insert(new User { Id = 1, Value = id }); + tx.Db.User.Insert(new User { Id = 2, Value = id + 10 }); + tx.Db.RefUser.Insert(new RefUser { Id = 1, Value = id }); + return true; + }); + try + { + ctx.WithTx(tx => + { + tx.Db.User.Id.Update(new User { Id = 1, Value = -1 }); + throw new InvalidOperationException("rollback"); + }); + } + catch (InvalidOperationException error) when (error.Message == "rollback") { } + var result = ctx.WithTx(tx => + { + if (tx.Db.User.Id.Find(1)?.Value != id) + { + throw new Exception("Transaction rollback changed this instance."); + } + return tx.Db.User.Id.Find(2)!.Value.Value; + }); + Log.Info($"next:{id}"); + return result; + } + + [View(Accessor = "Current", Public = true)] + public static User? Current(ViewContext ctx) + { + var row = ctx.Db.User.Id.Find(1); + if (ctx.Db.RefUser.Id.Find(1)?.Value != row?.Value) + { + throw new Exception("Read-only reference-row index targeted the wrong instance."); + } + return row; + } + + [View(Accessor = "Anonymous", Public = true)] + public static User? Anonymous(AnonymousViewContext ctx) => + ctx.Db.User.ByValue.Filter(Module.GetInstanceId(ctx) + 10).Single(); + + [View(Accessor = "QueryCurrent", Public = true)] + public static IQuery QueryCurrent(ViewContext ctx) => + ctx.From.User().Where(row => row.Value.Eq(Module.GetInstanceId(ctx))); + + [View(Accessor = "QueryAnonymous", Public = true)] + public static IQuery QueryAnonymous(AnonymousViewContext ctx) => + ctx.From.User().Where(row => row.Value.Eq(Module.GetInstanceId(ctx) + 10)); + + [HttpHandler] + public static HttpResponse Ignored(HandlerContext ctx, HttpRequest request) => + new(200, HttpVersion.Http11, [], HttpBody.FromString("must not be routed")); + + [HttpRouter] + public static Router Routes() => Router.New().Get("/leaf", Handlers.Ignored); +} diff --git a/modules/nested-namespace-test-cs/libraries/Outer/Lib.cs b/modules/nested-namespace-test-cs/libraries/Outer/Lib.cs new file mode 100644 index 00000000000..690760e32df --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Outer/Lib.cs @@ -0,0 +1,8 @@ +using SpacetimeDB; + +[assembly: Namespace(typeof(NestedBranch.Functions), Accessor = "Branch", Name = "branch_data")] +[assembly: Namespace(typeof(NestedLeaf.Functions), Accessor = "public")] + +namespace NestedOuter; + +public class Marker { } diff --git a/modules/nested-namespace-test-cs/libraries/Outer/Outer.csproj b/modules/nested-namespace-test-cs/libraries/Outer/Outer.csproj new file mode 100644 index 00000000000..037fdc38362 --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Outer/Outer.csproj @@ -0,0 +1,9 @@ + + + NestedOuter + $(AssemblyName) + + + + + diff --git a/modules/nested-namespace-test-cs/libraries/Public/Lib.cs b/modules/nested-namespace-test-cs/libraries/Public/Lib.cs new file mode 100644 index 00000000000..754f33d40bc --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Public/Lib.cs @@ -0,0 +1,3 @@ +using SpacetimeDB; + +[assembly: Namespace(typeof(NestedLeaf.Functions), Accessor = "Promoted", Name = "promoted_data")] diff --git a/modules/nested-namespace-test-cs/libraries/Public/Public.csproj b/modules/nested-namespace-test-cs/libraries/Public/Public.csproj new file mode 100644 index 00000000000..12174cccf8d --- /dev/null +++ b/modules/nested-namespace-test-cs/libraries/Public/Public.csproj @@ -0,0 +1,9 @@ + + + NestedPublic + $(AssemblyName) + + + + + diff --git a/modules/nested-namespace-test-cs/nested-namespace-test-cs.csproj b/modules/nested-namespace-test-cs/nested-namespace-test-cs.csproj new file mode 100644 index 00000000000..20e53dec575 --- /dev/null +++ b/modules/nested-namespace-test-cs/nested-namespace-test-cs.csproj @@ -0,0 +1,12 @@ + + + net10.0 + + + + + + + + + diff --git a/sdks/csharp/DEVELOP.md b/sdks/csharp/DEVELOP.md index 71a27a4e530..db60faae4ae 100644 --- a/sdks/csharp/DEVELOP.md +++ b/sdks/csharp/DEVELOP.md @@ -56,7 +56,7 @@ Generated C# clients expose its tables through `conn.Procedures.MyAuth`, and query factories through `q.From.MyAuth`. Generated SQL and network messages use the database namespace `auth_data`. The C# accessor remains `MyAuth`. When `Name` is omitted, the host derives the -database namespace from the accessor using the root module's case policy. +database namespace from the accessor using the containing module's case policy. The `--namespace` option of `spacetime generate` controls where generated C# classes are declared; it does not name or rename database namespaces. With @@ -65,6 +65,18 @@ while a `User` row in that dependency becomes `Game.Bindings.MyAuth.User`. Their table handles remain `conn.Db.User` and `conn.Db.MyAuth.User`, respectively. +Nested submodules follow the same pattern at every level: +`conn.Db.Auth.Audit.User`, `conn.Reducers.Auth.Audit.Login(...)`, +`conn.Procedures.Auth.Audit.Count(...)`, and `q.From.Auth.Audit.User()`. +All containers share one connection and table registry. Generated SQL quotes +each canonical namespace segment separately; accessors are never substituted +for canonical names. `SqlTableName(string[], string)` supports these paths while +the existing string constructors continue to treat dots as literal identifier +characters. Qualified names are cached on generated table handles. + +The `nested-namespaces` regression client exercises a real three-level C# module +on .NET 8 and .NET 10. + ### Runtime Structure Most of the core logic of the SDK lives in [`DbConnectionBase<...>`](./src/SpacetimeDBClient.cs). This handles: diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/Program.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/Program.cs new file mode 100644 index 00000000000..4ffde2afce7 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/Program.cs @@ -0,0 +1,229 @@ +using System; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using SpacetimeDB; +using SpacetimeDB.Types; + +internal static class Program +{ + private static void Require(bool condition, string message) + { + if (!condition) + { + throw new Exception(message); + } + } + + private static void Main() + { + var host = + Environment.GetEnvironmentVariable("SPACETIMEDB_SERVER_URL") ?? "http://localhost:3000"; + if (host == "local") + { + host = "http://localhost:3000"; + } + var connected = false; + Exception? connectionError = null; + var conn = DbConnection + .Builder() + .WithUri(host) + .WithDatabaseName("nested-namespace-tests") + .OnConnect((_, _, _) => connected = true) + .OnConnectError(error => connectionError = error) + .Build(); + + void Wait(Func done, string phase) + { + var timer = Stopwatch.StartNew(); + while (!done()) + { + if (connectionError != null) + { + throw connectionError; + } + if (timer.Elapsed > TimeSpan.FromSeconds(30)) + { + throw new TimeoutException(phase); + } + conn.FrameTick(); + Thread.Sleep(5); + } + } + + void Unsubscribe(SubscriptionHandle subscription) + { + var done = false; + subscription.UnsubscribeThen(_ => done = true); + Wait(() => done, "unsubscribe"); + } + + void Procedure(Action> call, int expected) + { + var done = false; + call( + (_, result) => + { + Require( + result.IsSuccess && result.Value == expected, + "Wrong procedure instance/result" + ); + done = true; + } + ); + Wait(() => done, "procedure result"); + } + + try + { + Wait(() => connected, "connect"); + var deep = conn.Db.@class.Branch.Leaf.User; + var sibling = conn.Db.Branch.Leaf.User; + var allQueries = QueryBuilder.AllTablesSqlQueries(); + Require( + allQueries.Length == allQueries.Distinct().Count(), + "Subscribe-all does not duplicate tables/views" + ); + + var applied = false; + var subscription = conn.SubscriptionBuilder() + .OnApplied(_ => applied = true) + .OnError((_, error) => throw error) + .AddQuery(q => q.From.@class.Branch.Leaf.User()) + .AddQuery(q => q.From.@class.Branch.Leaf.RefUser()) + .AddQuery(q => q.From.Branch.Leaf.User()) + .Subscribe(); + Wait(() => applied, "typed nested subscription"); + + var inserts = 0; + var deletes = 0; + void CheckInsert(EventContext ctx, SpacetimeDB.Types.@class.Branch.Leaf.User row) + { + Require( + ctx.Db.@class.Branch.Leaf.RefUser.Id.Find(1) != null, + "Callback sees shared post-transaction cache" + ); + inserts++; + } + deep.OnInsert += CheckInsert; + deep.OnDelete += (_, _) => deletes++; + var rootEvents = 0; + var siblingEvents = 0; + var deepEvents = 0; + conn.Reducers.OnPing += _ => rootEvents++; + conn.Reducers.Branch.Leaf.OnPing += _ => siblingEvents++; + conn.Reducers.@class.Branch.Leaf.OnPing += ctx => + { + Require(ctx.Event.Status is Status.Committed, "Deep reducer failed"); + deepEvents++; + }; + conn.Reducers.Ping(); + conn.Reducers.Branch.Leaf.Ping(); + conn.Reducers.@class.Branch.Leaf.Ping(); + Wait( + () => rootEvents == 1 && siblingEvents == 1 && deepEvents == 1 && inserts == 1, + "reducer dispatch and inserts" + ); + deep.OnInsert -= CheckInsert; + Require( + deep.Id.Find(1)?.Value == 108 && sibling.Id.Find(1)?.Value == 102, + "Separate caches for the same Leaf DLL" + ); + + var errors = 0; + conn.OnUnhandledReducerError += (_, _) => errors++; + conn.Reducers.@class.Branch.Leaf.Pong(); + conn.Reducers.Branch.Leaf.Pong(); + Wait(() => deletes == 1 && deep.Count == 0 && sibling.Count == 0, "nested deletes"); + // A second Pong fails; its error must propagate through every parent container. + conn.Reducers.@class.Branch.Leaf.Pong(); + Wait(() => errors == 1, "nested unhandled reducer error"); + Unsubscribe(subscription); + + // Branch expects its child's rows, which have not been created yet. + var failed = false; + conn.Procedures.@class.Branch.Instance( + (_, result) => + { + Require(!result.IsSuccess && result.Error != null, "Nested procedure failure"); + failed = true; + } + ); + Wait(() => failed, "procedure failure result"); + Procedure(conn.Procedures.Instance, 0); + Procedure(conn.Procedures.Branch.Leaf.Next, 12); + Procedure(conn.Procedures.Leaf.Next, 13); + Procedure(conn.Procedures.Promoted.Next, 14); + Procedure(conn.Procedures.SecondLeaf.Next, 15); + Procedure(conn.Procedures.@class.Next, 16); + Procedure(conn.Procedures.@class.Branch.Leaf.Next, 18); + Procedure(conn.Procedures.@class.Branch.Instance, 7); + + var remote = deep.RemoteQuery("WHERE id = 1"); + Wait(() => remote.IsCompleted, "deep RemoteQuery"); + Require( + remote.Result.Single().Value == 8 && deep.Count == 0, + "One-off rows use the correct type without populating the cache" + ); + + applied = false; + subscription = conn.SubscriptionBuilder() + .OnApplied(_ => applied = true) + .OnError((_, error) => throw error) + .SubscribeToAllTables(); + Wait(() => applied, "subscribe all nested tables and views"); + Require(deep.Count == 2 && sibling.Count == 2, "Initial rows reach separate handles"); + Require( + conn.Db.Leaf.User.Id.Find(1)?.Value == 3 + && conn.Db.Promoted.User.Id.Find(1)?.Value == 4 + && conn.Db.SecondLeaf.User.Id.Find(1)?.Value == 5 + && conn.Db.@class.User.Id.Find(1)?.Value == 6, + "Public promotion and repeated instances" + ); + Require( + conn.Db.@class.Branch.Leaf.Current.Iter().Single().Value == 8 + && conn.Db.@class.Branch.Leaf.Anonymous.Iter().Single().Value == 18 + && conn.Db.Deep.Iter().Single().Value == 8, + "Nested and root view results" + ); + Unsubscribe(subscription); + Require( + deep.Count == 0 + && sibling.Count == 0 + && conn.Db.@class.User.Count == 0 + && conn.Db.Leaf.User.Count == 0 + && conn.Db.Promoted.User.Count == 0 + && conn.Db.SecondLeaf.User.Count == 0 + && conn.Db.@class.Branch.Leaf.Current.Count == 0 + && conn.Db.@class.Branch.Leaf.Anonymous.Count == 0, + "Unsubscribe clears nested table and view caches" + ); + + applied = false; + subscription = conn.SubscriptionBuilder() + .OnApplied(_ => applied = true) + .OnError((_, error) => throw error) + .AddQuery(q => + q.From.@class.Branch.Leaf.User() + .Where(c => c.Id.Eq(1)) + .LeftSemijoin( + q.From.Branch.Leaf.User(), + (left, right) => left.Id.Eq(right.Id) + ) + ) + .Subscribe(); + Wait(() => applied, "same-leaf cross-namespace join"); + Require( + deep.Count == 1 && deep.Id.Find(1)?.Value == 8 && sibling.Count == 0, + "Join routes only the projected table" + ); + Unsubscribe(subscription); + Require(deep.Count == 0, "Join unsubscribe cleanup"); + Console.WriteLine("Nested namespace client passed"); + } + finally + { + conn.Disconnect(); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/README.md b/sdks/csharp/examples~/regression-tests/nested-namespaces/README.md new file mode 100644 index 00000000000..38bd994f7f5 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/README.md @@ -0,0 +1,18 @@ +# Nested Namespace Client Regression + +This C# 9 client runs on .NET 8 and .NET 10 against the .NET 10 +`modules/nested-namespace-test-cs` module. The regression scripts generate these +bindings from that module and publish a fresh database for each client runtime. + +The same Leaf assembly appears six times, including three levels deep at +`conn.Db.@class.Branch.Leaf`. C# paths use accessors; SQL and wire names use each +level's canonical name (`outer_data.branch_data.nested_data`). + +The test covers separate table caches, typed subscriptions, reducer calls/events +and error forwarding, procedure results/errors, one-off queries, subscribe-all +including views, same-leaf cross-namespace joins, and unsubscribe cleanup. +An insert callback checks the shared post-transaction cache. + +Run through `sdks/csharp/tools~/run-regression-tests.sh 10` with a local server +and the local SDK packages configured as described in `sdks/csharp/DEVELOP.md`. +That runs both client runtimes. diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/client.csproj b/sdks/csharp/examples~/regression-tests/nested-namespaces/client.csproj new file mode 100644 index 00000000000..719f2fd86d2 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/client.csproj @@ -0,0 +1,13 @@ + + + Exe + net8.0;net10.0 + 9 + enable + disable + true + + + + + diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Namespace.g.cs new file mode 100644 index 00000000000..e3f4f48ba99 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Namespace.g.cs @@ -0,0 +1,52 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + } + + public sealed partial class RemoteTables + { + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + } + } + public sealed class From + { + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Instance.g.cs new file mode 100644 index 00000000000..afe9de0460c --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "branch_data.nested_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Next.g.cs new file mode 100644 index 00000000000..a3dd4fc6c75 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "branch_data.nested_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Ping.g.cs new file mode 100644 index 00000000000..7f76659b0f3 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "branch_data.nested_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Pong.g.cs new file mode 100644 index 00000000000..d585f3a81fa --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "branch_data.nested_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..64ad1898450 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Current.g.cs new file mode 100644 index 00000000000..c8ad56c1f1f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..4d3075bf049 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..ad762a05373 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/RefUser.g.cs new file mode 100644 index 00000000000..45924cfcc35 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/User.g.cs new file mode 100644 index 00000000000..464bd7abcce --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.nested_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "branch_data", "nested_data" }, "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/RefUser.g.cs new file mode 100644 index 00000000000..8e7d939b658 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/User.g.cs new file mode 100644 index 00000000000..44ae4860b43 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Leaf/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Namespace.g.cs new file mode 100644 index 00000000000..3dd048d6023 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Namespace.g.cs @@ -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. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@Branch +{ + public sealed partial class RemoteReducers : RemoteBase + { + public global::SpacetimeDB.Types.@Branch.@Leaf.RemoteReducers @Leaf { get; } + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Leaf = new(conn); + @Leaf.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + public global::SpacetimeDB.Types.@Branch.@Leaf.RemoteProcedures @Leaf { get; } + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Leaf = new(conn); + } + } + + public sealed partial class RemoteTables + { + public global::SpacetimeDB.Types.@Branch.@Leaf.RemoteTables @Leaf { get; } + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(QueryChild = new(conn)); + @Leaf = new(conn, register); + } + } + public sealed class From + { + public global::SpacetimeDB.Types.@Branch.@Leaf.From @Leaf { get; } = new(); + public global::SpacetimeDB.Table QueryChild() => new(RemoteTables.QueryChildHandle.SqlName, new QueryChildCols(RemoteTables.QueryChildHandle.SqlName), new QueryChildIxCols(RemoteTables.QueryChildHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Procedures/Instance.g.cs new file mode 100644 index 00000000000..331dcb8c85b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "branch_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Tables/QueryChild.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Tables/QueryChild.g.cs new file mode 100644 index 00000000000..1c6ae3f94c4 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Tables/QueryChild.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch +{ + public sealed partial class RemoteTables + { + public sealed class QueryChildHandle : RemoteTableHandle + { + public override string RemoteTableName => "branch_data.query_child"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("branch_data", "query_child"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal QueryChildHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly QueryChildHandle QueryChild; + } + + public sealed class QueryChildCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryChildCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryChildIxCols + { + + public QueryChildIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Types/User.g.cs new file mode 100644 index 00000000000..244e2850a17 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Branch/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Branch +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Namespace.g.cs new file mode 100644 index 00000000000..3d8cbcbf6f7 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Namespace.g.cs @@ -0,0 +1,52 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + } + + public sealed partial class RemoteTables + { + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + } + } + public sealed class From + { + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Instance.g.cs new file mode 100644 index 00000000000..4461d643452 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "leaf_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Next.g.cs new file mode 100644 index 00000000000..5d4f3e9abb5 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "leaf_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Ping.g.cs new file mode 100644 index 00000000000..20a2319c619 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "leaf_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Pong.g.cs new file mode 100644 index 00000000000..69ffbd105bb --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "leaf_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..12ae11179e2 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Current.g.cs new file mode 100644 index 00000000000..379484fd9ae --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..783f0a430d6 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..1deb3bf7b6c --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/RefUser.g.cs new file mode 100644 index 00000000000..22bacfd5387 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/User.g.cs new file mode 100644 index 00000000000..66245301321 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "leaf_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("leaf_data", "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/RefUser.g.cs new file mode 100644 index 00000000000..86532bd4988 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/User.g.cs new file mode 100644 index 00000000000..e1e8bcff19b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Leaf/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Procedures/Instance.g.cs new file mode 100644 index 00000000000..cda8cbd0f78 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Namespace.g.cs new file mode 100644 index 00000000000..827a725fe8c --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Namespace.g.cs @@ -0,0 +1,52 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteReducers : RemoteBase + { + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + } + + public sealed partial class RemoteTables + { + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + } + } + public sealed class From + { + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Instance.g.cs new file mode 100644 index 00000000000..3e95e38ba21 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "promoted_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Next.g.cs new file mode 100644 index 00000000000..cb1b48bafa1 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "promoted_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Ping.g.cs new file mode 100644 index 00000000000..e55fc1fa732 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "promoted_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Pong.g.cs new file mode 100644 index 00000000000..3b1842b3dee --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "promoted_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..6feb13f9c70 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Current.g.cs new file mode 100644 index 00000000000..2e79beb270f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..4101c1e2620 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..aecae8392cb --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/RefUser.g.cs new file mode 100644 index 00000000000..14c4213c133 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/User.g.cs new file mode 100644 index 00000000000..bd0d0ce91ef --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "promoted_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("promoted_data", "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/RefUser.g.cs new file mode 100644 index 00000000000..62a952a6a96 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/User.g.cs new file mode 100644 index 00000000000..d37ad84bd8c --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Promoted/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@Promoted +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/CheckTables.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/CheckTables.g.cs new file mode 100644 index 00000000000..6b12a2c483e --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/CheckTables.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void CheckTablesHandler(ReducerEventContext ctx); + public event CheckTablesHandler? OnCheckTables; + + public void CheckTables() + { + conn.InternalCallReducer(new Reducer.CheckTables()); + } + + public bool InvokeCheckTables(ReducerEventContext ctx, Reducer.CheckTables args) + { + if (OnCheckTables == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnCheckTables( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class CheckTables : Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "check_tables"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/Ping.g.cs new file mode 100644 index 00000000000..33dbb3c7d8b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Namespace.g.cs new file mode 100644 index 00000000000..fdaa3de0536 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Namespace.g.cs @@ -0,0 +1,52 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + } + + public sealed partial class RemoteTables + { + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + } + } + public sealed class From + { + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Instance.g.cs new file mode 100644 index 00000000000..9436b341f55 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "second_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Next.g.cs new file mode 100644 index 00000000000..d6a45cdf3a8 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "second_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Ping.g.cs new file mode 100644 index 00000000000..2ad3b27af10 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "second_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Pong.g.cs new file mode 100644 index 00000000000..9ade0e5d4fe --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "second_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..142817644cf --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Current.g.cs new file mode 100644 index 00000000000..8dabae61f1b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..8d5e7562ecb --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..1124bcc62f3 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/RefUser.g.cs new file mode 100644 index 00000000000..93ee869f447 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/User.g.cs new file mode 100644 index 00000000000..5292e9104ff --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "second_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("second_data", "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/RefUser.g.cs new file mode 100644 index 00000000000..6871705be5e --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/User.g.cs new file mode 100644 index 00000000000..fc221580bf3 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SecondLeaf/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@SecondLeaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SpacetimeDBClient.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SpacetimeDBClient.g.cs new file mode 100644 index 00000000000..e7aa483420f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/SpacetimeDBClient.g.cs @@ -0,0 +1,735 @@ +// 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.11.0 (commit ad38fb33589377e398a2a453e4f7da0fe0d9acfa). + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteReducers : RemoteBase + { + public global::SpacetimeDB.Types.@Branch.RemoteReducers @Branch { get; } + public global::SpacetimeDB.Types.@Leaf.RemoteReducers @Leaf { get; } + public global::SpacetimeDB.Types.@Promoted.RemoteReducers @Promoted { get; } + public global::SpacetimeDB.Types.@SecondLeaf.RemoteReducers @SecondLeaf { get; } + public global::SpacetimeDB.Types.@class.RemoteReducers @class { get; } + internal RemoteReducers(DbConnection conn) : base(conn) + { + @Branch = new(conn); + @Branch.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + @Leaf = new(conn); + @Leaf.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + @Promoted = new(conn); + @Promoted.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + @SecondLeaf = new(conn); + @SecondLeaf.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + @class = new(conn); + @class.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + public global::SpacetimeDB.Types.@Branch.RemoteProcedures @Branch { get; } + public global::SpacetimeDB.Types.@Leaf.RemoteProcedures @Leaf { get; } + public global::SpacetimeDB.Types.@Promoted.RemoteProcedures @Promoted { get; } + public global::SpacetimeDB.Types.@SecondLeaf.RemoteProcedures @SecondLeaf { get; } + public global::SpacetimeDB.Types.@class.RemoteProcedures @class { get; } + internal RemoteProcedures(DbConnection conn) : base(conn) + { + @Branch = new(conn); + @Leaf = new(conn); + @Promoted = new(conn); + @SecondLeaf = new(conn); + @class = new(conn); + } + } + + public sealed partial class RemoteTables : RemoteTablesBase + { + public global::SpacetimeDB.Types.@Branch.RemoteTables @Branch { get; } + public global::SpacetimeDB.Types.@Leaf.RemoteTables @Leaf { get; } + public global::SpacetimeDB.Types.@Promoted.RemoteTables @Promoted { get; } + public global::SpacetimeDB.Types.@SecondLeaf.RemoteTables @SecondLeaf { get; } + public global::SpacetimeDB.Types.@class.RemoteTables @class { get; } + public RemoteTables(DbConnection conn) + { + AddTable(Deep = new(conn)); + AddTable(Nested = new(conn)); + AddTable(QueryDeep = new(conn)); + AddTable(QueryPublic = new(conn)); + AddTable(User = new(conn)); + @Branch = new(conn, AddTable); + @Leaf = new(conn, AddTable); + @Promoted = new(conn, AddTable); + @SecondLeaf = new(conn, AddTable); + @class = new(conn, AddTable); + } + } + + + public interface IRemoteDbContext : IDbContext + { + public event Action? OnUnhandledReducerError; + } + + public sealed class EventContext : IEventContext, IRemoteDbContext + { + private readonly DbConnection conn; + + /// + /// The event that caused this callback to run. + /// + public readonly Event Event; + + /// + /// Access to tables in the client cache, which stores a read-only replica of the remote database state. + /// + /// The returned DbView will have a method to access each table defined by the module. + /// + public RemoteTables Db => conn.Db; + /// + /// Access to reducers defined by the module. + /// + /// The returned RemoteReducers will have a method to invoke each reducer defined by the module, + /// plus methods for adding and removing callbacks on each of those reducers. + /// + public RemoteReducers Reducers => conn.Reducers; + /// + /// Access to procedures defined by the module. + /// + /// The returned RemoteProcedures will have a method to invoke each procedure defined by the module, + /// with a callback for when the procedure completes and returns a value. + /// + public RemoteProcedures Procedures => conn.Procedures; + /// + /// Returns true if the connection is active, i.e. has not yet disconnected. + /// + public bool IsActive => conn.IsActive; + /// + /// Close the connection. + /// + /// Throws an error if the connection is already closed. + /// + public void Disconnect() + { + conn.Disconnect(); + } + /// + /// Start building a subscription. + /// + /// A builder-pattern constructor for subscribing to queries, + /// causing matching rows to be replicated into the client cache. + public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder(); + /// + /// Get the Identity of this connection. + /// + /// This method returns null if the connection was constructed anonymously + /// and we have not yet received our newly-generated Identity from the host. + /// + public Identity? Identity => conn.Identity; + /// + /// Get this connection's ConnectionId. + /// + public ConnectionId ConnectionId => conn.ConnectionId; + /// + /// Register a callback to be called when a reducer with no handler returns an error. + /// + public event Action? OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + + internal EventContext(DbConnection conn, Event Event) + { + this.conn = conn; + this.Event = Event; + } + } + + public sealed class ReducerEventContext : IReducerEventContext, IRemoteDbContext + { + private readonly DbConnection conn; + /// + /// The reducer event that caused this callback to run. + /// + public readonly ReducerEvent Event; + + /// + /// Access to tables in the client cache, which stores a read-only replica of the remote database state. + /// + /// The returned DbView will have a method to access each table defined by the module. + /// + public RemoteTables Db => conn.Db; + /// + /// Access to reducers defined by the module. + /// + /// The returned RemoteReducers will have a method to invoke each reducer defined by the module, + /// plus methods for adding and removing callbacks on each of those reducers. + /// + public RemoteReducers Reducers => conn.Reducers; + /// + /// Access to procedures defined by the module. + /// + /// The returned RemoteProcedures will have a method to invoke each procedure defined by the module, + /// with a callback for when the procedure completes and returns a value. + /// + public RemoteProcedures Procedures => conn.Procedures; + /// + /// Returns true if the connection is active, i.e. has not yet disconnected. + /// + public bool IsActive => conn.IsActive; + /// + /// Close the connection. + /// + /// Throws an error if the connection is already closed. + /// + public void Disconnect() + { + conn.Disconnect(); + } + /// + /// Start building a subscription. + /// + /// A builder-pattern constructor for subscribing to queries, + /// causing matching rows to be replicated into the client cache. + public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder(); + /// + /// Get the Identity of this connection. + /// + /// This method returns null if the connection was constructed anonymously + /// and we have not yet received our newly-generated Identity from the host. + /// + public Identity? Identity => conn.Identity; + /// + /// Get this connection's ConnectionId. + /// + public ConnectionId ConnectionId => conn.ConnectionId; + /// + /// Register a callback to be called when a reducer with no handler returns an error. + /// + public event Action? OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + + internal ReducerEventContext(DbConnection conn, ReducerEvent reducerEvent) + { + this.conn = conn; + Event = reducerEvent; + } + } + + public sealed class ErrorContext : IErrorContext, IRemoteDbContext + { + private readonly DbConnection conn; + /// + /// The Exception that caused this error callback to be run. + /// + public readonly Exception Event; + Exception IErrorContext.Event + { + get + { + return Event; + } + } + + /// + /// Access to tables in the client cache, which stores a read-only replica of the remote database state. + /// + /// The returned DbView will have a method to access each table defined by the module. + /// + public RemoteTables Db => conn.Db; + /// + /// Access to reducers defined by the module. + /// + /// The returned RemoteReducers will have a method to invoke each reducer defined by the module, + /// plus methods for adding and removing callbacks on each of those reducers. + /// + public RemoteReducers Reducers => conn.Reducers; + /// + /// Access to procedures defined by the module. + /// + /// The returned RemoteProcedures will have a method to invoke each procedure defined by the module, + /// with a callback for when the procedure completes and returns a value. + /// + public RemoteProcedures Procedures => conn.Procedures; + /// + /// Returns true if the connection is active, i.e. has not yet disconnected. + /// + public bool IsActive => conn.IsActive; + /// + /// Close the connection. + /// + /// Throws an error if the connection is already closed. + /// + public void Disconnect() + { + conn.Disconnect(); + } + /// + /// Start building a subscription. + /// + /// A builder-pattern constructor for subscribing to queries, + /// causing matching rows to be replicated into the client cache. + public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder(); + /// + /// Get the Identity of this connection. + /// + /// This method returns null if the connection was constructed anonymously + /// and we have not yet received our newly-generated Identity from the host. + /// + public Identity? Identity => conn.Identity; + /// + /// Get this connection's ConnectionId. + /// + public ConnectionId ConnectionId => conn.ConnectionId; + /// + /// Register a callback to be called when a reducer with no handler returns an error. + /// + public event Action? OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + + internal ErrorContext(DbConnection conn, Exception error) + { + this.conn = conn; + Event = error; + } + } + + public sealed class SubscriptionEventContext : ISubscriptionEventContext, IRemoteDbContext + { + private readonly DbConnection conn; + + /// + /// Access to tables in the client cache, which stores a read-only replica of the remote database state. + /// + /// The returned DbView will have a method to access each table defined by the module. + /// + public RemoteTables Db => conn.Db; + /// + /// Access to reducers defined by the module. + /// + /// The returned RemoteReducers will have a method to invoke each reducer defined by the module, + /// plus methods for adding and removing callbacks on each of those reducers. + /// + public RemoteReducers Reducers => conn.Reducers; + /// + /// Access to procedures defined by the module. + /// + /// The returned RemoteProcedures will have a method to invoke each procedure defined by the module, + /// with a callback for when the procedure completes and returns a value. + /// + public RemoteProcedures Procedures => conn.Procedures; + /// + /// Returns true if the connection is active, i.e. has not yet disconnected. + /// + public bool IsActive => conn.IsActive; + /// + /// Close the connection. + /// + /// Throws an error if the connection is already closed. + /// + public void Disconnect() + { + conn.Disconnect(); + } + /// + /// Start building a subscription. + /// + /// A builder-pattern constructor for subscribing to queries, + /// causing matching rows to be replicated into the client cache. + public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder(); + /// + /// Get the Identity of this connection. + /// + /// This method returns null if the connection was constructed anonymously + /// and we have not yet received our newly-generated Identity from the host. + /// + public Identity? Identity => conn.Identity; + /// + /// Get this connection's ConnectionId. + /// + public ConnectionId ConnectionId => conn.ConnectionId; + /// + /// Register a callback to be called when a reducer with no handler returns an error. + /// + public event Action? OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + + internal SubscriptionEventContext(DbConnection conn) + { + this.conn = conn; + } + } + + public sealed class ProcedureEventContext : IProcedureEventContext, IRemoteDbContext + { + private readonly DbConnection conn; + /// + /// The procedure event that caused this callback to run. + /// + public readonly ProcedureEvent Event; + + /// + /// Access to tables in the client cache, which stores a read-only replica of the remote database state. + /// + /// The returned DbView will have a method to access each table defined by the module. + /// + public RemoteTables Db => conn.Db; + /// + /// Access to reducers defined by the module. + /// + /// The returned RemoteReducers will have a method to invoke each reducer defined by the module, + /// plus methods for adding and removing callbacks on each of those reducers. + /// + public RemoteReducers Reducers => conn.Reducers; + /// + /// Access to procedures defined by the module. + /// + /// The returned RemoteProcedures will have a method to invoke each procedure defined by the module, + /// with a callback for when the procedure completes and returns a value. + /// + public RemoteProcedures Procedures => conn.Procedures; + /// + /// Returns true if the connection is active, i.e. has not yet disconnected. + /// + public bool IsActive => conn.IsActive; + /// + /// Close the connection. + /// + /// Throws an error if the connection is already closed. + /// + public void Disconnect() + { + conn.Disconnect(); + } + /// + /// Start building a subscription. + /// + /// A builder-pattern constructor for subscribing to queries, + /// causing matching rows to be replicated into the client cache. + public SubscriptionBuilder SubscriptionBuilder() => conn.SubscriptionBuilder(); + /// + /// Get the Identity of this connection. + /// + /// This method returns null if the connection was constructed anonymously + /// and we have not yet received our newly-generated Identity from the host. + /// + public Identity? Identity => conn.Identity; + /// + /// Get this connection's ConnectionId. + /// + public ConnectionId ConnectionId => conn.ConnectionId; + /// + /// Register a callback to be called when a reducer with no handler returns an error. + /// + public event Action? OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + + internal ProcedureEventContext(DbConnection conn, ProcedureEvent Event) + { + this.conn = conn; + this.Event = Event; + } + } + + /// + /// Builder-pattern constructor for subscription queries. + /// + public sealed class SubscriptionBuilder + { + private readonly IDbConnection conn; + + private event Action? Applied; + private event Action? Error; + + /// + /// Private API, use conn.SubscriptionBuilder() instead. + /// + public SubscriptionBuilder(IDbConnection conn) + { + this.conn = conn; + } + + /// + /// Register a callback to run when the subscription is applied. + /// + public SubscriptionBuilder OnApplied( + Action callback + ) + { + Applied += callback; + return this; + } + + /// + /// Register a callback to run when the subscription fails. + /// + /// Note that this callback may run either when attempting to apply the subscription, + /// in which case Self::on_applied will never run, + /// or later during the subscription's lifetime if the module's interface changes, + /// in which case Self::on_applied may have already run. + /// + public SubscriptionBuilder OnError( + Action callback + ) + { + Error += callback; + return this; + } + + /// + /// Add a typed query to this subscription. + /// + /// This is the entry point for building subscriptions without writing SQL by hand. + /// Once a typed query is added, only typed queries may follow (SQL and typed queries cannot be mixed). + /// + public TypedSubscriptionBuilder AddQuery( + Func> build + ) + { + var typed = new TypedSubscriptionBuilder(conn, Applied, Error); + return typed.AddQuery(build); + } + + /// + /// Subscribe to the following SQL queries. + /// + /// This method returns immediately, with the data not yet added to the DbConnection. + /// The provided callbacks will be invoked once the data is returned from the remote server. + /// Data from all the provided queries will be returned at the same time. + /// + /// See the SpacetimeDB SQL docs for more information on SQL syntax: + /// https://spacetimedb.com/docs/reference/sql + /// + public SubscriptionHandle Subscribe( + string[] querySqls + ) => new(conn, Applied, Error, querySqls); + + /// + /// Subscribe to all rows from all tables. + /// + /// This method is intended as a convenience + /// for applications where client-side memory use and network bandwidth are not concerns. + /// Applications where these resources are a constraint + /// should register more precise queries via Self.Subscribe + /// in order to replicate only the subset of data which the client needs to function. + /// + /// This method should not be combined with Self.Subscribe on the same DbConnection. + /// A connection may either Self.Subscribe to particular queries, + /// or Self.SubscribeToAllTables, but not both. + /// Attempting to call Self.Subscribe + /// on a DbConnection that has previously used Self.SubscribeToAllTables, + /// or vice versa, may misbehave in any number of ways, + /// including dropping subscriptions, corrupting the client cache, or panicking. + /// + public SubscriptionHandle SubscribeToAllTables() => + new(conn, Applied, Error, QueryBuilder.AllTablesSqlQueries()); + } + + public sealed class SubscriptionHandle : SubscriptionHandleBase + { + /// + /// Internal API. Construct SubscriptionHandles using conn.SubscriptionBuilder. + /// + public SubscriptionHandle( + IDbConnection conn, + Action? onApplied, + Action? onError, + string[] querySqls + ) : base(conn, onApplied, onError, querySqls) + { } + } + + public sealed class QueryBuilder + { + public From From { get; } = new(); + + internal static string[] AllTablesSqlQueries() => new string[] + { + new QueryBuilder().From.Deep().ToSql(), + new QueryBuilder().From.Nested().ToSql(), + new QueryBuilder().From.QueryDeep().ToSql(), + new QueryBuilder().From.QueryPublic().ToSql(), + new QueryBuilder().From.User().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.RefUser().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.User().ToSql(), + new QueryBuilder().From.@Leaf.RefUser().ToSql(), + new QueryBuilder().From.@Leaf.User().ToSql(), + new QueryBuilder().From.@class.RefUser().ToSql(), + new QueryBuilder().From.@class.User().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.RefUser().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.User().ToSql(), + new QueryBuilder().From.@Promoted.RefUser().ToSql(), + new QueryBuilder().From.@Promoted.User().ToSql(), + new QueryBuilder().From.@SecondLeaf.RefUser().ToSql(), + new QueryBuilder().From.@SecondLeaf.User().ToSql(), + new QueryBuilder().From.@Branch.QueryChild().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.Current().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.QueryCurrent().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.Anonymous().ToSql(), + new QueryBuilder().From.@Branch.@Leaf.QueryAnonymous().ToSql(), + new QueryBuilder().From.@Leaf.Current().ToSql(), + new QueryBuilder().From.@Leaf.QueryCurrent().ToSql(), + new QueryBuilder().From.@Leaf.Anonymous().ToSql(), + new QueryBuilder().From.@Leaf.QueryAnonymous().ToSql(), + new QueryBuilder().From.@Promoted.Current().ToSql(), + new QueryBuilder().From.@Promoted.QueryCurrent().ToSql(), + new QueryBuilder().From.@Promoted.Anonymous().ToSql(), + new QueryBuilder().From.@Promoted.QueryAnonymous().ToSql(), + new QueryBuilder().From.@SecondLeaf.Current().ToSql(), + new QueryBuilder().From.@SecondLeaf.QueryCurrent().ToSql(), + new QueryBuilder().From.@SecondLeaf.Anonymous().ToSql(), + new QueryBuilder().From.@SecondLeaf.QueryAnonymous().ToSql(), + new QueryBuilder().From.@class.Current().ToSql(), + new QueryBuilder().From.@class.QueryCurrent().ToSql(), + new QueryBuilder().From.@class.Anonymous().ToSql(), + new QueryBuilder().From.@class.QueryAnonymous().ToSql(), + new QueryBuilder().From.@class.@Branch.QueryChild().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.Current().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.QueryCurrent().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.Anonymous().ToSql(), + new QueryBuilder().From.@class.@Branch.@Leaf.QueryAnonymous().ToSql(), + } + ; + } + + public sealed class From + { + public global::SpacetimeDB.Types.@Branch.From @Branch { get; } = new(); + public global::SpacetimeDB.Types.@Leaf.From @Leaf { get; } = new(); + public global::SpacetimeDB.Types.@Promoted.From @Promoted { get; } = new(); + public global::SpacetimeDB.Types.@SecondLeaf.From @SecondLeaf { get; } = new(); + public global::SpacetimeDB.Types.@class.From @class { get; } = new(); + public global::SpacetimeDB.Table Deep() => new("deep", new DeepCols("deep"), new DeepIxCols("deep")); + public global::SpacetimeDB.Table Nested() => new("nested", new NestedCols("nested"), new NestedIxCols("nested")); + public global::SpacetimeDB.Table QueryDeep() => new("query_deep", new QueryDeepCols("query_deep"), new QueryDeepIxCols("query_deep")); + public global::SpacetimeDB.Table QueryPublic() => new("query_public", new QueryPublicCols("query_public"), new QueryPublicIxCols("query_public")); + public global::SpacetimeDB.Table User() => new("user", new UserCols("user"), new UserIxCols("user")); + } + + public sealed class TypedSubscriptionBuilder + { + private readonly IDbConnection conn; + private Action? Applied; + private Action? Error; + private readonly List querySqls = new(); + + internal TypedSubscriptionBuilder(IDbConnection conn, Action? applied, Action? error) + { + this.conn = conn; + Applied = applied; + Error = error; + } + + public TypedSubscriptionBuilder OnApplied(Action callback) + { + Applied += callback; + return this; + } + + public TypedSubscriptionBuilder OnError(Action callback) + { + Error += callback; + return this; + } + + public TypedSubscriptionBuilder AddQuery(Func> build) + { + var qb = new QueryBuilder(); + querySqls.Add(build(qb).ToSql()); + return this; + } + + public SubscriptionHandle Subscribe() => new(conn, Applied, Error, querySqls.ToArray()); + } + + public abstract partial class Reducer + { + private protected Reducer() { } + } + + public abstract partial class Procedure + { + private Procedure() { } + } + + public sealed class DbConnection : DbConnectionBase + { + public override RemoteTables Db { get; } + public readonly RemoteReducers Reducers; + public readonly RemoteProcedures Procedures; + + public DbConnection() + { + Db = new(this); + Reducers = new(this); + Procedures = new(this); + } + + protected override IEventContext ToEventContext(Event Event) => + new EventContext(this, Event); + + protected override IReducerEventContext ToReducerEventContext(ReducerEvent reducerEvent) => + new ReducerEventContext(this, reducerEvent); + + protected override ISubscriptionEventContext MakeSubscriptionEventContext() => + new SubscriptionEventContext(this); + + protected override IErrorContext ToErrorContext(Exception exception) => + new ErrorContext(this, exception); + + protected override IProcedureEventContext ToProcedureEventContext(ProcedureEvent procedureEvent) => + new ProcedureEventContext(this, procedureEvent); + + protected override bool Dispatch(IReducerEventContext context, Reducer reducer) + { + var eventContext = (ReducerEventContext)context; + return reducer switch + { + Reducer.CheckTables args => Reducers.InvokeCheckTables(eventContext, args), + Reducer.Ping args => Reducers.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@Branch.@Leaf.Reducer.Ping args => Reducers.@Branch.@Leaf.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@Branch.@Leaf.Reducer.Pong args => Reducers.@Branch.@Leaf.InvokePong(eventContext, args), + global::SpacetimeDB.Types.@Leaf.Reducer.Ping args => Reducers.@Leaf.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@Leaf.Reducer.Pong args => Reducers.@Leaf.InvokePong(eventContext, args), + global::SpacetimeDB.Types.@Promoted.Reducer.Ping args => Reducers.@Promoted.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@Promoted.Reducer.Pong args => Reducers.@Promoted.InvokePong(eventContext, args), + global::SpacetimeDB.Types.@SecondLeaf.Reducer.Ping args => Reducers.@SecondLeaf.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@SecondLeaf.Reducer.Pong args => Reducers.@SecondLeaf.InvokePong(eventContext, args), + global::SpacetimeDB.Types.@class.Reducer.Ping args => Reducers.@class.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@class.Reducer.Pong args => Reducers.@class.InvokePong(eventContext, args), + global::SpacetimeDB.Types.@class.@Branch.@Leaf.Reducer.Ping args => Reducers.@class.@Branch.@Leaf.InvokePing(eventContext, args), + global::SpacetimeDB.Types.@class.@Branch.@Leaf.Reducer.Pong args => Reducers.@class.@Branch.@Leaf.InvokePong(eventContext, args), + _ => throw new ArgumentOutOfRangeException("Reducer", $"Unknown reducer {reducer}") + }; + } + + public SubscriptionBuilder SubscriptionBuilder() => new(this); + public event Action OnUnhandledReducerError + { + add => Reducers.InternalOnUnhandledReducerError += value; + remove => Reducers.InternalOnUnhandledReducerError -= value; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Deep.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Deep.g.cs new file mode 100644 index 00000000000..928ad538c08 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Deep.g.cs @@ -0,0 +1,45 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteTables + { + public sealed class DeepHandle : RemoteTableHandle + { + public override string RemoteTableName => "deep"; + + internal DeepHandle(DbConnection conn) : base(conn) + { + } + } + + public readonly DeepHandle Deep; + } + + public sealed class DeepCols + { + public global::SpacetimeDB.Col Value { get; } + + public DeepCols(string tableName) + { + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class DeepIxCols + { + + public DeepIxCols(string tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Nested.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Nested.g.cs new file mode 100644 index 00000000000..1669210502c --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/Nested.g.cs @@ -0,0 +1,45 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteTables + { + public sealed class NestedHandle : RemoteTableHandle + { + public override string RemoteTableName => "nested"; + + internal NestedHandle(DbConnection conn) : base(conn) + { + } + } + + public readonly NestedHandle Nested; + } + + public sealed class NestedCols + { + public global::SpacetimeDB.Col Value { get; } + + public NestedCols(string tableName) + { + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class NestedIxCols + { + + public NestedIxCols(string tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryDeep.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryDeep.g.cs new file mode 100644 index 00000000000..329cf7078e5 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryDeep.g.cs @@ -0,0 +1,47 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteTables + { + public sealed class QueryDeepHandle : RemoteTableHandle + { + public override string RemoteTableName => "query_deep"; + + internal QueryDeepHandle(DbConnection conn) : base(conn) + { + } + } + + public readonly QueryDeepHandle QueryDeep; + } + + public sealed class QueryDeepCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryDeepCols(string tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryDeepIxCols + { + + public QueryDeepIxCols(string tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryPublic.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryPublic.g.cs new file mode 100644 index 00000000000..1857a8d0bca --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/QueryPublic.g.cs @@ -0,0 +1,47 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteTables + { + public sealed class QueryPublicHandle : RemoteTableHandle + { + public override string RemoteTableName => "query_public"; + + internal QueryPublicHandle(DbConnection conn) : base(conn) + { + } + } + + public readonly QueryPublicHandle QueryPublic; + } + + public sealed class QueryPublicCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryPublicCols(string tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryPublicIxCols + { + + public QueryPublicIxCols(string tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/User.g.cs new file mode 100644 index 00000000000..3b76107043f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Tables/User.g.cs @@ -0,0 +1,45 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "user"; + + internal UserHandle(DbConnection conn) : base(conn) + { + } + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Name { get; } + + public UserCols(string tableName) + { + Name = new global::SpacetimeDB.Col(tableName, "name"); + } + } + + public sealed class UserIxCols + { + + public UserIxCols(string tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/NestedResult.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/NestedResult.g.cs new file mode 100644 index 00000000000..bb5b4dd57e7 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/NestedResult.g.cs @@ -0,0 +1,28 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NestedResult + { + [DataMember(Name = "value")] + public int Value; + + public NestedResult(int Value) + { + this.Value = Value; + } + + public NestedResult() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/RefUser.g.cs new file mode 100644 index 00000000000..674c668e33e --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/User.g.cs new file mode 100644 index 00000000000..1feefd37e11 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/Types/User.g.cs @@ -0,0 +1,29 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "name")] + public string Name; + + public User(string Name) + { + this.Name = Name; + } + + public User() + { + this.Name = ""; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Namespace.g.cs new file mode 100644 index 00000000000..faa98fa8efd --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Namespace.g.cs @@ -0,0 +1,52 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) { } + } + + public sealed partial class RemoteTables + { + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + } + } + public sealed class From + { + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Instance.g.cs new file mode 100644 index 00000000000..2e89005b727 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "outer_data.branch_data.nested_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Next.g.cs new file mode 100644 index 00000000000..7587a5eec93 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "outer_data.branch_data.nested_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Ping.g.cs new file mode 100644 index 00000000000..69ec7b4f047 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "outer_data.branch_data.nested_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Pong.g.cs new file mode 100644 index 00000000000..d2be67a937f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "outer_data.branch_data.nested_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..e2a0ec1232b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Current.g.cs new file mode 100644 index 00000000000..125c5451dfc --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..ecb6511ceeb --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..7af5bb16b80 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/RefUser.g.cs new file mode 100644 index 00000000000..071f8aee94a --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/User.g.cs new file mode 100644 index 00000000000..009307b842b --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.nested_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data", "nested_data" }, "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/RefUser.g.cs new file mode 100644 index 00000000000..46253f9fef4 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/User.g.cs new file mode 100644 index 00000000000..2e8853fc9bd --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Leaf/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch.@Leaf +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Namespace.g.cs new file mode 100644 index 00000000000..7099abd12f9 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Namespace.g.cs @@ -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. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@class.@Branch +{ + public sealed partial class RemoteReducers : RemoteBase + { + public global::SpacetimeDB.Types.@class.@Branch.@Leaf.RemoteReducers @Leaf { get; } + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Leaf = new(conn); + @Leaf.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + public global::SpacetimeDB.Types.@class.@Branch.@Leaf.RemoteProcedures @Leaf { get; } + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Leaf = new(conn); + } + } + + public sealed partial class RemoteTables + { + public global::SpacetimeDB.Types.@class.@Branch.@Leaf.RemoteTables @Leaf { get; } + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(QueryChild = new(conn)); + @Leaf = new(conn, register); + } + } + public sealed class From + { + public global::SpacetimeDB.Types.@class.@Branch.@Leaf.From @Leaf { get; } = new(); + public global::SpacetimeDB.Table QueryChild() => new(RemoteTables.QueryChildHandle.SqlName, new QueryChildCols(RemoteTables.QueryChildHandle.SqlName), new QueryChildIxCols(RemoteTables.QueryChildHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Procedures/Instance.g.cs new file mode 100644 index 00000000000..be2b46dbc58 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "outer_data.branch_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Tables/QueryChild.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Tables/QueryChild.g.cs new file mode 100644 index 00000000000..bd303a9c1ae --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Tables/QueryChild.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch +{ + public sealed partial class RemoteTables + { + public sealed class QueryChildHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.branch_data.query_child"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName(new string[] { "outer_data", "branch_data" }, "query_child"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal QueryChildHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly QueryChildHandle QueryChild; + } + + public sealed class QueryChildCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryChildCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryChildIxCols + { + + public QueryChildIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Types/User.g.cs new file mode 100644 index 00000000000..8b3fb7cadb7 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Branch/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class.@Branch +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Namespace.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Namespace.g.cs new file mode 100644 index 00000000000..5ac314d0195 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Namespace.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteReducers : RemoteBase + { + public global::SpacetimeDB.Types.@class.@Branch.RemoteReducers @Branch { get; } + internal RemoteReducers(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Branch = new(conn); + @Branch.InternalOnUnhandledReducerError += (ctx, error) => InternalOnUnhandledReducerError?.Invoke(ctx, error); + } + internal event Action? InternalOnUnhandledReducerError; + } + + public sealed partial class RemoteProcedures : RemoteBase + { + public global::SpacetimeDB.Types.@class.@Branch.RemoteProcedures @Branch { get; } + internal RemoteProcedures(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + @Branch = new(conn); + } + } + + public sealed partial class RemoteTables + { + public global::SpacetimeDB.Types.@class.@Branch.RemoteTables @Branch { get; } + internal RemoteTables(global::SpacetimeDB.Types.DbConnection conn, Action register) + { + register(Anonymous = new(conn)); + register(Current = new(conn)); + register(QueryAnonymous = new(conn)); + register(QueryCurrent = new(conn)); + register(RefUser = new(conn)); + register(User = new(conn)); + @Branch = new(conn, register); + } + } + public sealed class From + { + public global::SpacetimeDB.Types.@class.@Branch.From @Branch { get; } = new(); + public global::SpacetimeDB.Table Anonymous() => new(RemoteTables.AnonymousHandle.SqlName, new AnonymousCols(RemoteTables.AnonymousHandle.SqlName), new AnonymousIxCols(RemoteTables.AnonymousHandle.SqlName)); + public global::SpacetimeDB.Table Current() => new(RemoteTables.CurrentHandle.SqlName, new CurrentCols(RemoteTables.CurrentHandle.SqlName), new CurrentIxCols(RemoteTables.CurrentHandle.SqlName)); + public global::SpacetimeDB.Table QueryAnonymous() => new(RemoteTables.QueryAnonymousHandle.SqlName, new QueryAnonymousCols(RemoteTables.QueryAnonymousHandle.SqlName), new QueryAnonymousIxCols(RemoteTables.QueryAnonymousHandle.SqlName)); + public global::SpacetimeDB.Table QueryCurrent() => new(RemoteTables.QueryCurrentHandle.SqlName, new QueryCurrentCols(RemoteTables.QueryCurrentHandle.SqlName), new QueryCurrentIxCols(RemoteTables.QueryCurrentHandle.SqlName)); + public global::SpacetimeDB.Table RefUser() => new(RemoteTables.RefUserHandle.SqlName, new RefUserCols(RemoteTables.RefUserHandle.SqlName), new RefUserIxCols(RemoteTables.RefUserHandle.SqlName)); + public global::SpacetimeDB.Table User() => new(RemoteTables.UserHandle.SqlName, new UserCols(RemoteTables.UserHandle.SqlName), new UserIxCols(RemoteTables.UserHandle.SqlName)); + } + + public abstract partial class Reducer + { + private Reducer() { } + } + public abstract partial class Procedure + { + private Procedure() { } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Instance.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Instance.g.cs new file mode 100644 index 00000000000..75f54bf976a --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Instance.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Instance(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalInstance((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalInstance(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.InstanceArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Instance + { + [DataMember(Name = "Value")] + public int Value; + + public Instance(int Value) + { + this.Value = Value; + } + + public Instance() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class InstanceArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "outer_data.instance"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Next.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Next.g.cs new file mode 100644 index 00000000000..a1479001bfb --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Procedures/Next.g.cs @@ -0,0 +1,64 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteProcedures : RemoteBase + { + public void Next(ProcedureCallback callback) + { + // Convert the clean callback to the wrapper callback + InternalNext((ctx, result) => + { + if (result.IsSuccess && result.Value != null) + { + callback(ctx, ProcedureCallbackResult.Success(result.Value.Value)); + } + else + { + callback(ctx, ProcedureCallbackResult.Failure(result.Error!)); + } + }); + } + + private void InternalNext(ProcedureCallback callback) + { + conn.InternalCallProcedure(new Procedure.NextArgs(), callback); + } + + } + + public abstract partial class Procedure + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Next + { + [DataMember(Name = "Value")] + public int Value; + + public Next(int Value) + { + this.Value = Value; + } + + public Next() + { + } + } + [SpacetimeDB.Type] + [DataContract] + public sealed partial class NextArgs : Procedure, IProcedureArgs + { + string IProcedureArgs.ProcedureName => "outer_data.next"; + } + + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Ping.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Ping.g.cs new file mode 100644 index 00000000000..754c73b7d03 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Ping.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PingHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PingHandler? OnPing; + + public void Ping() + { + conn.InternalCallReducer(new Reducer.Ping()); + } + + public bool InvokePing(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Ping args) + { + if (OnPing == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPing( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Ping : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "outer_data.ping"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Pong.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Pong.g.cs new file mode 100644 index 00000000000..709714e2c5f --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Reducers/Pong.g.cs @@ -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. + +#nullable enable + +using System; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteReducers : RemoteBase + { + public delegate void PongHandler(global::SpacetimeDB.Types.ReducerEventContext ctx); + public event PongHandler? OnPong; + + public void Pong() + { + conn.InternalCallReducer(new Reducer.Pong()); + } + + public bool InvokePong(global::SpacetimeDB.Types.ReducerEventContext ctx, Reducer.Pong args) + { + if (OnPong == null) + { + if (InternalOnUnhandledReducerError != null) + { + switch (ctx.Event.Status) + { + case Status.Failed(var reason): InternalOnUnhandledReducerError(ctx, new Exception(reason)); break; + case Status.OutOfEnergy(var _): InternalOnUnhandledReducerError(ctx, new Exception("out of energy")); break; + case Status.UnknownResult(var _): InternalOnUnhandledReducerError(ctx, new UnknownResultException()); break; + } + } + return false; + } + OnPong( + ctx + ); + return true; + } + } + + public abstract partial class Reducer + { + [SpacetimeDB.Type] + [DataContract] + public sealed partial class Pong : global::SpacetimeDB.Types.Reducer, IReducerArgs + { + string IReducerArgs.ReducerName => "outer_data.pong"; + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Anonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Anonymous.g.cs new file mode 100644 index 00000000000..53b733aa767 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Anonymous.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class AnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal AnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly AnonymousHandle Anonymous; + } + + public sealed class AnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public AnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class AnonymousIxCols + { + + public AnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Current.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Current.g.cs new file mode 100644 index 00000000000..198df5a98b1 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/Current.g.cs @@ -0,0 +1,49 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class CurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + internal CurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + } + } + + public readonly CurrentHandle Current; + } + + public sealed class CurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public CurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class CurrentIxCols + { + + public CurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryAnonymous.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryAnonymous.g.cs new file mode 100644 index 00000000000..68639011447 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryAnonymous.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class QueryAnonymousHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.query_anonymous"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "query_anonymous"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryAnonymousHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryAnonymousHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryAnonymousHandle QueryAnonymous; + } + + public sealed class QueryAnonymousCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryAnonymousCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryAnonymousIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryAnonymousIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryCurrent.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryCurrent.g.cs new file mode 100644 index 00000000000..4bfad4fbac0 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/QueryCurrent.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class QueryCurrentHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.query_current"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "query_current"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(QueryCurrentHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal QueryCurrentHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly QueryCurrentHandle QueryCurrent; + } + + public sealed class QueryCurrentCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public QueryCurrentCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class QueryCurrentIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public QueryCurrentIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/RefUser.g.cs new file mode 100644 index 00000000000..8d0c4e421db --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/RefUser.g.cs @@ -0,0 +1,63 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class RefUserHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.ref_user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "ref_user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(RefUser row) => row.Id; + + public IdUniqueIndex(RefUserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + internal RefUserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + } + + protected override object GetPrimaryKey(RefUser row) => row.Id; + } + + public readonly RefUserHandle RefUser; + } + + public sealed class RefUserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public RefUserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class RefUserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + + public RefUserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/User.g.cs new file mode 100644 index 00000000000..1d3062a4776 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Tables/User.g.cs @@ -0,0 +1,75 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using SpacetimeDB.BSATN; +using SpacetimeDB.ClientApi; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + public sealed partial class RemoteTables + { + public sealed class UserHandle : RemoteTableHandle + { + public override string RemoteTableName => "outer_data.user"; + internal static readonly global::SpacetimeDB.SqlTableName SqlName = new global::SpacetimeDB.SqlTableName("outer_data", "user"); + protected override global::SpacetimeDB.SqlTableName RemoteSqlTableName => SqlName; + + public sealed class IdUniqueIndex : UniqueIndexBase + { + protected override int GetKey(User row) => row.Id; + + public IdUniqueIndex(UserHandle table) : base(table) { } + } + + public readonly IdUniqueIndex Id; + + public sealed class ByValueIndex : BTreeIndexBase + { + protected override int GetKey(User row) => row.Value; + + public ByValueIndex(UserHandle table) : base(table) { } + } + + public readonly ByValueIndex ByValue; + + internal UserHandle(global::SpacetimeDB.Types.DbConnection conn) : base(conn) + { + Id = new(this); + ByValue = new(this); + } + + protected override object GetPrimaryKey(User row) => row.Id; + } + + public readonly UserHandle User; + } + + public sealed class UserCols + { + public global::SpacetimeDB.Col Id { get; } + public global::SpacetimeDB.Col Value { get; } + + public UserCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.Col(tableName, "id"); + Value = new global::SpacetimeDB.Col(tableName, "value"); + } + } + + public sealed class UserIxCols + { + public global::SpacetimeDB.IxCol Id { get; } + public global::SpacetimeDB.IxCol Value { get; } + + public UserIxCols(global::SpacetimeDB.SqlTableName tableName) + { + Id = new global::SpacetimeDB.IxCol(tableName, "id"); + Value = new global::SpacetimeDB.IxCol(tableName, "value"); + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/RefUser.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/RefUser.g.cs new file mode 100644 index 00000000000..8bbef9435c5 --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/RefUser.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class RefUser + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public RefUser( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public RefUser() + { + } + } +} diff --git a/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/User.g.cs b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/User.g.cs new file mode 100644 index 00000000000..b6cf1c2283e --- /dev/null +++ b/sdks/csharp/examples~/regression-tests/nested-namespaces/module_bindings/class/Types/User.g.cs @@ -0,0 +1,34 @@ +// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE +// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD. + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace SpacetimeDB.Types.@class +{ + [SpacetimeDB.Type] + [DataContract] + public sealed partial class User + { + [DataMember(Name = "id")] + public int Id; + [DataMember(Name = "value")] + public int Value; + + public User( + int Id, + int Value + ) + { + this.Id = Id; + this.Value = Value; + } + + public User() + { + } + } +} diff --git a/sdks/csharp/tests~/QueryBuilderTests.cs b/sdks/csharp/tests~/QueryBuilderTests.cs index e8df8c5f745..f16b27c97e3 100644 --- a/sdks/csharp/tests~/QueryBuilderTests.cs +++ b/sdks/csharp/tests~/QueryBuilderTests.cs @@ -105,26 +105,11 @@ public void QualifiedName_QuotesNamespaceAndLocalName() Assert.Equal("SELECT * FROM \"auth.users\"", MakeTable("auth.users").ToSql()); Assert.Equal("\"auth.users\".\"id\"", new Col("auth.users", "id").ToString()); Assert.Equal("\"auth.users\".\"id\"", new IxCol("auth.users", "id").ToString()); - } - - [Fact] - public void QualifiedName_FiltersAndBothSemijoinsKeepSameLeafNamesDistinct() - { - var leftName = new SqlTableName("auth", "users"); - var rightName = new SqlTableName("audit", "users"); - var left = new Table, IxCol>( - leftName, new(leftName, "id"), new(leftName, "id")); - var right = new Table, IxCol>( - rightName, new(rightName, "id"), new(rightName, "id")); - Assert.Equal("SELECT * FROM \"auth\".\"users\" WHERE (\"auth\".\"users\".\"id\" = 1)", - left.Where(c => c.Eq(1)).ToSql()); - Assert.Equal("SELECT * FROM \"auth\".\"users\" WHERE (\"auth\".\"users\".\"id\" = 1)", - left.Where((_, ix) => ix.Eq(SqlLit.Int(1))).ToSql()); - const string join = " FROM \"auth\".\"users\" JOIN \"audit\".\"users\" ON \"auth\".\"users\".\"id\" = \"audit\".\"users\".\"id\""; - Assert.Equal("SELECT \"auth\".\"users\".*" + join, - left.LeftSemijoin(right, (l, r) => l.Eq(r)).ToSql()); - Assert.Equal("SELECT \"audit\".\"users\".*" + join, - left.RightSemijoin(right, (l, r) => l.Eq(r)).ToSql()); + var segments = new[] { "outer.data", "in\"ner" }; + var nested = new SqlTableName(segments, "users"); + segments[0] = "changed"; + Assert.Equal("\"outer.data\".\"in\"\"ner\".\"users\"", nested.ToString()); + Assert.Equal("\"users\"", new SqlTableName(Array.Empty(), "users").ToString()); var escaped = new SqlTableName("auth\"data", "select"); Assert.Equal("\"auth\"\"data\".\"select\".\"i\"\"d\"", new Col(escaped, "i\"d").ToString()); Assert.Equal("\"auth\"\"data\".\"select\".\"i\"\"d\"", new IxCol(escaped, "i\"d").ToString()); diff --git a/sdks/csharp/tools~/gen-regression-tests.sh b/sdks/csharp/tools~/gen-regression-tests.sh index 1bf296898b5..1fab924bb9a 100755 --- a/sdks/csharp/tools~/gen-regression-tests.sh +++ b/sdks/csharp/tools~/gen-regression-tests.sh @@ -89,4 +89,5 @@ cargo spacetime generate -y -l csharp -o "$SDK_PATH/examples~/regression-tests/p if [ -z "$DOTNET_VERSION" ] || [ "$DOTNET_VERSION" = "10" ]; then cargo spacetime generate -y -l csharp -o "$SDK_PATH/examples~/regression-tests/namespaces/module_bindings" --module-path "$STDB_PATH/modules/namespace-test-cs" --build-options="--dotnet-version 10" + cargo spacetime generate -y -l csharp -o "$SDK_PATH/examples~/regression-tests/nested-namespaces/module_bindings" --module-path "$STDB_PATH/modules/nested-namespace-test-cs" --build-options="--dotnet-version 10" fi diff --git a/sdks/csharp/tools~/run-regression-tests.sh b/sdks/csharp/tools~/run-regression-tests.sh index f801a9b39f6..243503bd1e4 100644 --- a/sdks/csharp/tools~/run-regression-tests.sh +++ b/sdks/csharp/tools~/run-regression-tests.sh @@ -138,6 +138,8 @@ for dotnet_version in "${DOTNET_VERSIONS[@]}"; do echo "Running namespace client with .NET $client_version against the .NET 10 module" cargo spacetime publish --dotnet-version 10 -c -y --server "$SPACETIMEDB_SERVER_URL" -p "$STDB_PATH/modules/namespace-test-cs" namespace-tests run_client "$SDK_PATH/examples~/regression-tests/namespaces" "$client_version" --framework "net$client_version.0" + cargo spacetime publish --dotnet-version 10 -c -y --server "$SPACETIMEDB_SERVER_URL" -p "$STDB_PATH/modules/nested-namespace-test-cs" nested-namespace-tests + run_client "$SDK_PATH/examples~/regression-tests/nested-namespaces" "$client_version" --framework "net$client_version.0" done fi done