载入中...
搜索中...
未找到
Definitions.cpp
浏览该文件的文档.
17eve::schema::FieldDefinition schemaField(std::string name, eve::schema::ValueType type, bool required = true) {
95 eve::DiagnosticDetails{{"schemaId", id}, {"schemaVersion", "1"}, {"validationCode", error.code}},
191eve::Result<Definition> makeDefinition(const std::string& type, const std::string& id, int version,
195 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "definition type and id must not be empty"));
198 eve::DiagnosticCode::InvalidArgument, "definition type and id must form a valid namespace:name reference"));
201 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "definition schema version must be positive"));
216 {"schemaId", type}, {"schemaVersion", std::to_string(version)}, {"validationCode", error.code}},
232 : storage_([](Definition& value, eve::Generation generation) { value.generation = generation; }),
238 result.name = event.operation == eve::RegistryOperation::Remove ? "definition_removed" : "definition_reloaded";
247 return DefinitionHandle{makeDefinitionReference(handle.key.first, handle.key.second), handle.generation};
250DefinitionRegistry::Storage::Handle DefinitionRegistry::storageHandle(const DefinitionHandle& handle) {
252 return Storage::Handle{Key{std::string(logical.namespaceName()), std::string(logical.name())}, handle.generation};
257eve::Result<DefinitionHandle> DefinitionRegistry::insert(const std::string& type, const std::string& id, int version,
276eve::Result<DefinitionHandle> DefinitionRegistry::replace(const std::string& type, const std::string& id, int version,
295eve::Result<DefinitionHandle> DefinitionRegistry::remove(const std::string& type, const std::string& id) {
313eve::ResultRef<const Definition> DefinitionRegistry::resolve(const std::string& type, const std::string& id) const {
325eve::Result<DefinitionHandle> DefinitionRegistry::handle(const std::string& type, const std::string& id) const {
331eve::Result<eve::Generation> DefinitionRegistry::generationOf(const std::string& type, const std::string& id) const {
335bool DefinitionRegistry::isTombstone(const std::string& type, const std::string& id) const noexcept {
343DefinitionRef DefinitionRegistry::reference(const std::string& type, const std::string& id) const {
456 eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "definitions snapshot must be an object"));
468 if (!versionNumber || *versionNumber != 1 || !definitionArray || !generationArray || !eventArray ||
469 !nextSequenceValue || !readUint64String(*nextSequenceValue, nextSequence) || nextSequence == 0) {
471 eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "invalid definitions snapshot fields"));
481 if (!item || !readString(*item, "type", type) || !readString(*item, "id", id) || type.empty() || id.empty() ||
483 !candidate.entries.emplace(Key{type, id}, Storage::Entry{eve::Generation(generation), std::nullopt})
486 eve::DiagnosticCode::ParseError, "invalid definition generation at index " + std::to_string(index)));
499 if (!item || !readString(*item, "type", type) || !readString(*item, "id", id) || type.empty() || id.empty() ||
507 if (entry == candidate.entries.end() || entry->second.generation != eve::Generation(generation) ||
539 !readString(*item, "id", id) || (name != "definition_reloaded" && name != "definition_removed") ||
540 type.empty() || id.empty() || !versionField || !readPositiveSchemaVersion(*versionField, versionValue) ||
542 (!previousSequence.isZero() && eve::EventSequence(sequence) <= previousSequence) || !generationField ||
545 eve::DiagnosticCode::ParseError, "invalid definition event at index " + std::to_string(index)));
576eve::Result<eve::SnapshotEnvelope> DefinitionRegistry::snapshot(const eve::SnapshotHashProvider& hashProvider) const {
579 return eve::makeSnapshotEnvelope("definitions.registry", definitionsSchema(), eve::SchemaVersion(1), instanceId_,
587 eve::DiagnosticCode::InvalidArgument, "snapshot does not belong to definitions::DefinitionRegistry"));
590 eve::DiagnosticCode::Conflict, "snapshot instanceId does not match definitions::DefinitionRegistry"));
595 auto metadata = eve::validateSnapshotPayloadMetadata(candidate.payload, candidate.revision, candidate.tick);
611eve::Result<std::string> DefinitionRegistry::snapshotEnvelopeJson(const eve::SnapshotHashProvider& hashProvider) const {
644 definition.addFunc("getType", [](Definition* value) { return value ? value->type : std::string{}; });
645 definition.addFunc("getId", [](Definition* value) { return value ? value->id : std::string{}; });
652 definition.addFunc("getJson", [](Definition* value) { return value ? value->json : std::string{}; });
655 "DefinitionEvent", std::function<DefinitionEvent*()>([]() -> DefinitionEvent* { return nullptr; }), false);
659 event.addFunc("getName", [](DefinitionEvent* value) { return value ? value->name : std::string{}; });
660 event.addFunc("getType", [](DefinitionEvent* value) { return value ? value->type : std::string{}; });
661 event.addFunc("getId", [](DefinitionEvent* value) { return value ? value->id : std::string{}; });
670 "DefinitionRegistry", std::function<DefinitionRegistry*()>([]() -> DefinitionRegistry* { return nullptr; }),
672 registry.addFunc("insert", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id,
677 eve::Result<DefinitionHandle>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument,
684 registry.addFunc("replace", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id,
689 eve::Result<DefinitionHandle>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument,
696 registry.addFunc("remove", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id) {
700 eve::Result<DefinitionHandle>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument,
707 registry.addFunc("resolve", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id) {
712 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "definition registry must not be null",
722 registry.addFunc("resolveHandle", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id,
728 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "definition registry must not be null",
737 eve::DiagnosticCode::InvalidArgument, "definition generation must be positive", "generation", {},
745 DefinitionHandle{value->reference(type, id), eve::Generation(static_cast<std::uint64_t>(generation))}),
755 registry.addFunc("atType", [](DefinitionRegistry* value, const std::string& type, int index) -> Definition* {
772 registry.addFunc("handle", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id) {
776 eve::Result<DefinitionHandle>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument,
783 registry.addFunc("generationOf", [vm](DefinitionRegistry* value, const std::string& type, const std::string& id) {
787 eve::Result<eve::Generation>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument,
790 [](eve::Generation generation) { return eve::Value(static_cast<std::int64_t>(generation.value())); });
791 return eve::script::projectResult(vm, value->generationOf(type, id), [](eve::Generation generation) {
std::unordered_map< std::string, std::unordered_map< std::string, std::uint64_t > > generations
Definition CapabilityOwned.cpp:9
The single Squirrel projection for common Result, Status and Value.
static Result< DefinitionRef > fromId(LogicalId id)
Build a definition reference from a valid LogicalId.
Definition ResourceRef.cpp:50
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static std::optional< LogicalId > fromParts(std::string_view namespaceName, std::string_view name)
Builds a logical ID from separate namespace and name components.
Definition Identity.cpp:48
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Result< void > add(LogicalId schema, SchemaVersion from, SchemaVersion to, Migration migration)
Register one schema-local migration edge.
Definition Snapshot.cpp:196
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Move-only RAII token that owns one observer registration.
Definition Subscription.h:27
Result< std::string > toJson() const
Serialize this value as deterministic compact JSON.
Definition Value.cpp:67
static Result< Value > fromJson(std::string_view json)
Parse one strict JSON value into an owning Value.
Definition Value.cpp:57
const T * getIf() const noexcept
Return a typed pointer, or nullptr when the kind differs.
Definition Value.h:180
const Key * keyAt(std::size_t index) const noexcept
Returns the key for a live enumeration index, or nullptr.
Definition VersionedRegistry.h:385
ResultRef< const Value > resolve(const Key &key) const
Resolves a live key to a borrowed value.
Definition VersionedRegistry.h:277
std::size_t size() const noexcept
Number of live values, excluding tombstones.
Definition VersionedRegistry.h:341
Result< Handle > replace(Key key, Value value, EventData data={}, std::string label={})
Replaces an existing live value and invalidates its old handle.
Definition VersionedRegistry.h:240
void clearEvents() noexcept
Clears retained events without changing entries or sequence monotonicity.
Definition VersionedRegistry.h:410
Result< Handle > handle(const Key &key) const
Returns the current live handle for a key.
Definition VersionedRegistry.h:302
Result< void > restoreState(State candidate)
Transactionally replaces all registry state from an owning image.
Definition VersionedRegistry.h:423
const Value * at(std::size_t index) const noexcept
Returns a live value by deterministic key order.
Definition VersionedRegistry.h:368
Subscription subscribe(ChangeCallback callback)
Subscribes to successful insert, replace and remove events.
Definition VersionedRegistry.h:461
Result< Generation > generationOf(const Key &key) const
Returns the latest generation for a live key or tombstone.
Definition VersionedRegistry.h:313
Result< Handle > insert(Key key, Value value, EventData data={}, std::string label={})
Inserts a new live value, or revives a tombstoned key.
Definition VersionedRegistry.h:219
Result< Handle > remove(Key key, EventData data={}, std::string label={})
Removes a live value while retaining its generation tombstone.
Definition VersionedRegistry.h:260
const Event * eventAt(std::size_t index) const noexcept
Returns a retained event by insertion sequence order, or nullptr.
Definition VersionedRegistry.h:402
State snapshotState() const
Takes an owning copy of live entries, tombstones and event history.
Definition VersionedRegistry.h:413
std::size_t eventCount() const noexcept
Number of retained mutation events.
Definition VersionedRegistry.h:407
Deterministic registry of topic-neutral, versioned JSON definitions.
Definition Definitions.h:58
eve::ResultRef< const Definition > resolve(const std::string &type, const std::string &id) const
Resolves a definition through the common registry API.
Definition Definitions.cpp:313
eve::Result< DefinitionHandle > insert(const std::string &type, const std::string &id, int version, const std::string &json)
Inserts a definition using the common generation-qualified registry.
Definition Definitions.cpp:257
eve::Result< eve::Generation > generationOf(const std::string &type, const std::string &id) const
Returns the latest generation, including a retained tombstone.
Definition Definitions.cpp:331
DefinitionRef reference(const std::string &type, const std::string &id) const
Creates a reload-safe logical reference containing only type and id.
Definition Definitions.cpp:343
void clearEvents()
Clears retained events without resetting their sequence allocator.
Definition Definitions.cpp:389
std::string snapshotJson() const
Exports all registry state as deterministic canonical JSON.
Definition Definitions.cpp:395
eve::ResultRef< const Definition > resolveHandle(const DefinitionHandle &handle) const
Resolves a generation-qualified handle and reports stale identities.
Definition Definitions.cpp:319
eve::Result< DefinitionHandle > replace(const std::string &type, const std::string &id, int version, const std::string &json)
Replaces a live definition and invalidates its previous handle.
Definition Definitions.cpp:276
eve::Result< DefinitionHandle > remove(const std::string &type, const std::string &id)
Removes a definition and returns the retained tombstone handle.
Definition Definitions.cpp:295
const Definition * at(int index) const
Returns a definition by globally sorted type/id order, or nullptr.
Definition Definitions.cpp:359
eve::Subscription subscribe(ChangeCallback callback)
Subscribes to successful definition register, replace and remove operations.
Definition Definitions.cpp:625
eve::Result< DefinitionHandle > handle(const std::string &type, const std::string &id) const
Returns the current generation-qualified handle through Result.
Definition Definitions.cpp:325
int countType(const std::string &type) const
Returns the number of definitions registered for a type.
Definition Definitions.cpp:349
bool isTombstone(const std::string &type, const std::string &id) const noexcept
Returns whether a key is retained as a tombstone.
Definition Definitions.cpp:335
eve::Result< std::string > snapshotEnvelopeJson(const eve::SnapshotHashProvider &hashProvider) const
Serializes the common snapshot envelope as canonical JSON.
Definition Definitions.cpp:611
eve::Result< eve::SnapshotEnvelope > snapshot(const eve::SnapshotHashProvider &hashProvider) const
Captures this registry in the common versioned snapshot envelope.
Definition Definitions.cpp:576
eve::Result< void > restoreJson(const std::string &json)
Transactionally restores registry state from snapshotJson() output.
Definition Definitions.cpp:445
bool isStale(const DefinitionHandle &handle) const noexcept
Returns whether a generation-qualified handle is stale.
Definition Definitions.cpp:339
eve::Result< void > restoreSnapshotJson(std::string_view json, const eve::SnapshotHashProvider &hashProvider)
Parses and transactionally restores a common snapshot envelope.
Definition Definitions.cpp:618
eve::Result< void > restoreSnapshot(const eve::SnapshotEnvelope &snapshot, const eve::SnapshotHashProvider &hashProvider)
Restores a verified or migratable snapshot transactionally.
Definition Definitions.cpp:583
const Definition * atType(const std::string &type, int index) const
Returns a definition by id order within one type, or nullptr.
Definition Definitions.cpp:364
std::function< void(const DefinitionEvent &)> ChangeCallback
Definition Definitions.h:66
const DefinitionEvent * eventAt(int index) const
Returns a retained mutation event by sequence order, or nullptr.
Definition Definitions.cpp:378
Script module factory for independent definition registries.
Definition Definitions.h:199
DefinitionRegistry * newRegistry()
Allocates a module-owned definition registry.
Definition Definitions.cpp:633
constexpr bool isNil() const noexcept
Returns whether this value is the all-zero nil ID.
Definition Identity.h:176
constexpr std::optional< StrongUint64 > incremented() const noexcept
Returns the next value, or empty instead of unsigned wraparound.
Definition StrongUint64.h:30
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
constexpr bool isZero() const noexcept
Returns whether this value is zero.
Definition StrongUint64.h:28
static eve::Result< SchemaRegistrationStatus > registerVersioned(const SchemaDefinition &definition)
Registers a new exact (id, version) entry without replacing it.
Definition SchemaRegistry.cpp:864
static std::vector< ValidationError > validate(const std::string &schemaId, const std::string &json)
Validates JSON text against the highest registered schema version.
Definition SchemaRegistry.cpp:955
static const SchemaDefinition * resolve(const std::string &schemaId, int schemaVersion)
Resolves one exact (schemaId, schemaVersion) pair, or nullptr.
Definition SchemaRegistry.cpp:879
Definition Definitions.cpp:14
eve::definition::DefinitionHandle DefinitionHandle
Definition Definitions.h:28
@ String
@ Object
@ Integer
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
@ InvalidArgument
@ InvariantViolation
@ ParseError
@ Conflict
detail::StrongUint64< detail::GenerationTag > Generation
Registry/object replacement generation used to reject stale handles.
Definition Generation.h:13
Result< void > validateSnapshotPayloadMetadata(const Value &payload, Revision revision, SimulationTick tick)
Validate optional payload copies of envelope revision and tick.
Definition Snapshot.cpp:80
@ Applied
@ Definition
Result< SnapshotEnvelope > parseSnapshotEnvelope(std::string_view json, const SnapshotHashProvider &hashProvider)
Parse and verify an envelope from canonical or compatible JSON text.
Definition Snapshot.cpp:190
detail::StrongUint64< detail::SchemaVersionTag > SchemaVersion
Persistent data-format version; not a runtime replacement generation.
Definition SchemaVersion.h:13
Result< std::string > serializeSnapshotEnvelope(const SnapshotEnvelope &snapshot)
Serialize an envelope as deterministic compact JSON.
Definition Snapshot.cpp:184
@ Replace
@ Remove
@ Insert
Result< SnapshotEnvelope > makeSnapshotEnvelope(std::string type, LogicalId schema, SchemaVersion schemaVersion, PersistentId instanceId, Revision revision, SimulationTick tick, Value payload, const SnapshotHashProvider &hashProvider)
Construct and seal a snapshot envelope.
Definition Snapshot.cpp:103
detail::StrongUint64< detail::RevisionTag > Revision
Monotonic content/state revision used for optimistic-concurrency checks.
Definition Revision.h:13
detail::StrongUint64< detail::EventSequenceTag > EventSequence
Stream-local event ordering value; it is not a global event identity.
Definition EventSequence.h:13
std::function< Result< ContentId >(std::string_view canonicalInput)> SnapshotHashProvider
Injected content-digest implementation used by snapshots.
Definition Snapshot.h:36
Definition Container.h:602
Stable outer format shared by persistence and cross-process snapshots.
Definition Snapshot.h:46
A generation-qualified reference to one definition incarnation.
Definition DefinitionRuntime.h:69
eve::Generation generation
Definition DefinitionRuntime.h:71
Registry mutation notification in deterministic sequence order.
Definition Definitions.h:42
One immutable view of a registered versioned JSON definition.
Definition Definitions.h:31
Metadata and validation constraints for one object member.
Definition SchemaTypes.h:77
std::vector< FieldDefinition > fields
Definition SchemaTypes.h:99
bool additionalProperties
Definition SchemaTypes.h:98
Recursive node in the deliberately small Eve Schema language.
Definition SchemaTypes.h:47
std::shared_ptr< const SchemaNode > itemSchema
Recursive schema for every array item.
Definition SchemaTypes.h:59
std::shared_ptr< const SchemaDefinition > objectSchema
Inline object shape for an object node.
Definition SchemaTypes.h:57