Commit Graph

17 Commits

Author SHA1 Message Date
Ryan 8a0cd87c4f Adds datastore_index_scan_point_bsatn to C# Runtime (#3909)
# Description of Changes

To resolve #3875, we added exact-match unique index point lookup support
to the C# bindings by introducing and using
`datastore_index_scan_point_bsatn`.

Previously, generated unique index `Find()` was (in at least one
codepath) implemented as:

* A range scan (`datastore_index_scan_range_bsatn`) over a BTree bound,
then
* `SingleOrDefault()` to collapse the results into a single row.
When the scan is empty, `SingleOrDefault()` returns `default(T)`. For
value-type rows this can manifest as a default-initialized row instead
of “missing”, which is what surfaced as “default-ish row” behavior in
views.

Using `datastore_index_scan_point_bsatn` makes the C# implementation
match Rust semantics more closely by performing an exact point lookup
and returning:

* `null` when no rows are found
* the row when exactly one row is found
* (defensively) an error if >1 row is returned (unique index invariant
violation)
Similarly, `datastore_delete_by_index_scan_point_bsatn` was added and
used so deletes-by-unique-key are also exact-match point operations
rather than range deletes.

Runtime updates were made to utilize point scan in `FindSingle(key)` and
in both mutable/read-only unique-index paths.

To keep this non-breaking for existing modules, codegen now detects
whether the table row is a struct or a class and chooses the appropriate
base type:
* Struct rows: `Find()` returns `Row?` (`Nullable<Row>`).
* Class rows: `Find()` returns `Row?` (nullable reference, `null` on
miss).

# API and ABI breaking changes

This change is non-breaking with respect to row type kinds, because
class/record table rows continue to work via
RefUniqueIndex/ReadOnlyRefUniqueIndex while struct rows use
UniqueIndex/ReadOnlyUniqueIndex.

API surface changes:
* Generated `Find()` return type is now nullable (`Row?`) to correctly
represent “missing”.

ABI/runtime:
* Requires the point-scan hostcall import
(`datastore_index_scan_point_bsatn`) to be available; the runtime uses
point-scan for unique lookup (and point delete for unique delete).

# Expected complexity level and risk

Low 2

# Testing

- [X] Local testing: repro module + client validate view and direct
Find() behavior

---------

Signed-off-by: rekhoff <r.ekhoff@clockworklabs.io>
2025-12-20 00:32:37 +00:00
Mazdak Farrokhzad 668eef0d10 bindings-csharp: use the update ABI (#2269)
Co-authored-by: rekhoff <r.ekhoff@clockworklabs.io>
2025-02-22 17:45:28 +00:00
Ingvar Stepanyan 972d775840 Fix & test row deletion API (#2146)
Co-authored-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
2025-01-23 00:53:15 +00:00
Ingvar Stepanyan 08a3f3210b Migrate C# ModuleDef to V9 (#1670) 2024-12-16 21:49:42 +00:00
Ingvar Stepanyan 8448484ad9 Optimise C# in a ridiculous way (#1924) 2024-10-31 16:24:13 +00:00
Jeremie Pelletier 02b70d5c94 c# client generate (#1707) 2024-10-04 04:12:15 +00:00
Ingvar Stepanyan d081e4ad90 More obsolete cleanup (#1782) 2024-10-01 20:01:16 +00:00
Ingvar Stepanyan bcdea5702c [C#] Remove .Query support (#1772) 2024-09-30 21:22:29 +00:00
Mazdak Farrokhzad ccd7e848f6 WASM ABI: Strip leading underscore from syscall names (#1705) 2024-09-27 14:35:27 +00:00
Jeremie Pelletier 32349062ec Jeremie/cs module (#1719) 2024-09-27 11:23:50 +00:00
Ingvar Stepanyan 607f7ce6b8 Auto-generate C# ModuleDef bindings from Rust (#1680) 2024-09-09 18:22:17 +00:00
Mazdak Farrokhzad da71d0f9b1 WASM ABI: insert -> datastore_insert_bsatn & impl new semantics (#1639) 2024-09-05 19:32:26 +00:00
Mazdak Farrokhzad 49f366ff6b WASM ABI: iter_start -> datastore_table_scan_bsatn (#1637) 2024-09-02 15:24:16 +00:00
Mazdak Farrokhzad 2b69583f76 WASM ABI: get_table_id -> table_id_from_name (#1634) 2024-08-27 22:33:47 +00:00
Mazdak Farrokhzad 1dd1e633f3 WASM ABI: implement row_iter_bsatn_advance & row_iter_bsatn_close (#1622) 2024-08-27 22:01:06 +00:00
Mazdak Farrokhzad 1ca9b1a933 [WASM ABI 1.0] Change ColId from u32 to u16 (#1597) 2024-08-19 17:56:28 +00:00
Ingvar Stepanyan 6f0f20bf7a Restructure C# SpacetimeDB runtime (#1455) 2024-07-12 17:12:21 +00:00