mirror of
https://github.com/clockworklabs/SpacetimeDB.git
synced 2026-05-10 17:49:49 -04:00
e4098f98d9
## Description of Changes
This PR primarily affects the `bindings-macro` and `schema` crates to
review:
### Core changes
1. Replaces the `name` macro with `accessor` for **Tables, Views,
Procedures, and Reducers** in Rust modules.
2. Extends `RawModuleDefV10` with a new section for:
* case conversion policies
* explicit names
New sections are not validated in this PR so not functional.
3. Updates index behavior:
* Index names are now always **system-generated** for clients. Which
will be fixed in follow-up PR when we start validating RawModuleDef with
explicit names.
* The `accessor` name for an index is used only inside the module.
## Breaking changes (API/ABI)
1. **Rust modules**
* The `name` macro must be replaced with `accessor`.
2. **Client bindings (all languages)**
* Index names are now system-generated instead of using explicitly
provided names.
**Complexity:** 3
A follow-up PR will reintroduce explicit names with support for case
conversion.
---------
Co-authored-by: rekhoff <r.ekhoff@clockworklabs.io>
Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
from .. import Smoketest, random_string
|
|
import time
|
|
|
|
class DeleteDatabase(Smoketest):
|
|
AUTOPUBLISH = False
|
|
|
|
MODULE_CODE = """
|
|
use spacetimedb::{ReducerContext, Table, duration};
|
|
|
|
#[spacetimedb::table(accessor = counter, public)]
|
|
pub struct Counter {
|
|
#[primary_key]
|
|
id: u64,
|
|
val: u64
|
|
}
|
|
|
|
#[spacetimedb::table(accessor = scheduled_counter, public, scheduled(inc, at = sched_at))]
|
|
pub struct ScheduledCounter {
|
|
#[primary_key]
|
|
#[auto_inc]
|
|
scheduled_id: u64,
|
|
sched_at: spacetimedb::ScheduleAt,
|
|
}
|
|
|
|
#[spacetimedb::reducer]
|
|
pub fn inc(ctx: &ReducerContext, arg: ScheduledCounter) {
|
|
if let Some(mut counter) = ctx.db.counter().id().find(arg.scheduled_id) {
|
|
counter.val += 1;
|
|
ctx.db.counter().id().update(counter);
|
|
} else {
|
|
ctx.db.counter().insert(Counter {
|
|
id: arg.scheduled_id,
|
|
val: 1,
|
|
});
|
|
}
|
|
}
|
|
|
|
#[spacetimedb::reducer(init)]
|
|
pub fn init(ctx: &ReducerContext) {
|
|
ctx.db.scheduled_counter().insert(ScheduledCounter {
|
|
scheduled_id: 0,
|
|
sched_at: duration!(100ms).into(),
|
|
});
|
|
}
|
|
"""
|
|
|
|
def test_delete_database(self):
|
|
"""
|
|
Test that deleting a database stops the module.
|
|
The module is considered stopped if its scheduled reducer stops
|
|
producing update events.
|
|
"""
|
|
|
|
name = random_string()
|
|
self.publish_module(name, clear = False)
|
|
sub = self.subscribe("select * from counter", n = 1000)
|
|
time.sleep(2)
|
|
self.spacetime("delete", name)
|
|
|
|
updates = sub()
|
|
# At a rate of 100ms, we shouldn't have more than 20 updates in 2secs.
|
|
# But let's say 50, in case the delete gets delayed for some reason.
|
|
assert len(updates) <= 50
|