Errors

A call can fail because a definition is missing, a document is invalid, or the database refuses a change. The examples use the people data to show these results. Use the status and diagnostic fields to identify the failure.

Binding errors

LanguageFailure
CReturns a status. The owner that its operation names holds the diagnostic.
GoReturns *Error.
RustReturns Result<_, Error>.
ClojureThrows clojure.lang.ExceptionInfo with diagnostic data.
PythonRaises StardustError.
OdinReturns an Error beside its result.

The error record gives the fields in your language. Statuses gives the failure conditions of each operation.

error

This record describes a failure with its status and diagnostic. The binding copies the diagnostic before it releases the native owner.

FieldTypeUnitAbsent
codeCopied-TextNone—
messageCopied-TextNone—
pathReported-TextNoneAn absent key
fieldReported-TextNoneAn absent key
entityReported-IntegerNoneAn absent key
offsetReported-IntegerBytesAn absent key
statusError-StatusNone—

Statuses

Each status names a class of failure. The table lists codes from the binding. Native diagnostic codes can differ.

:invalid-argument

Codes: time_out_of_range, invalid_argument, out_of_range, non_finite_number, cycle, unsupported_type, too_large, native_failure, live_children, wrong_kind, not_integral, inexact_number, missing_field, unknown_field, duplicate_field, too_deep, length_mismatch, malformed_tag, ambiguous_field, ambiguous_variant, invalid_value, hook_failed.

WhenOperations
the entity ID is outside the user entity range, max_depth is negative or above 32, or max_entities is negativeread-entity
the text is malformed, the format is unknown or a number is outside i64 or finite f64parse
the format is unknown or the width is negativeserialize
the text is malformed, a format is unknown or the width is negativeconvert
the value has a host type with no document form (one the language's standard JSON encoder also refuses), a number outside i64 or finite f64, a decimal or time with no exact native form, a failing conversion method, or a cyclefrom-value
the node breaks the preorder rules or has an invalid kind or numberadd
a node breaks the preorder rules or has an invalid kind or numberadd-many
the builder has no root or a container is still openseal
id is not a node of the documentread, children
start is past the last node or capacity is negativeread-many
id is not an object node of the documentmember, members
the node is not an integer numberi64
the node is not a number or its value overflows f64f64
the arguments include an undeclared macro parameterbuild-macro, expand-macro
the file is not a database, an option is invalid or selected plugins are incompatibleopen
the parameters or run options are invalidrun, run
the parameters or subscription options are invalidsubscribe
max_wait is negativenext, indexes-sync
the patch is not an entity-keyed object, or a link names an ID outside the user entity rangemerge-patch
the kind, action, revision or page limits are invalid, or the selected plan cannot run the current authored definitionplan
the kind or the pattern is invaliddefinitions
a bulk build is already in progress on the databasebulk-begin
no bulk build is in progressbulk-add, bulk-finish
a name is empty, the plugin has no call operation with the name, or the plugin refuses the requestplugin-call
a name is empty, the plugin has no stream operation with the name, or the plugin refuses the requestplugin-stream
the stream has finished or does not accept writeswrite
the stream does not support reads, or length is negativeread
the stream does not support seeks, whence is unknown, or the position is negative or past the i64 rangeseek
the stream has finished or has no finish stepfinish
the token is empty or longer than 4096 bytesactivate
entity is not a user entityobjects-get, objects-path
the parent or the name is invalid, or the parent is a fileobjects-lookup
the parent is invalid or is a fileobjects-children
the digest is not 64 hexadecimal digitsobjects-files, objects-manifest, objects-open
the array is empty or malformed, a name is invalid, or a parent is a fileobjects-create
the entity is a directory or invalid, the digest is malformed, or expected_revision is negativeobjects-update
the request is malformed, the destination is a file or inside the node, the kinds differ, or a replaced directory is not emptyobjects-move
the entity is invalid, the directory is not empty, or expected_revision is negativeobjects-remove
options is not an object, or an option is invalid, duplicated or unsupportedreactors-sync, backups-sync, sdk-sync

:invalid-json

WhenOperations
JSON text is malformedparse, convert

:compile-failed

WhenOperations
the expression does not compilebuild
the expansion does not compilebuild-macro
the expanded expression does not compileexpression

:evaluation-failed

WhenOperations
the expression fails on the inputevaluate
the query fails or exceeds max_costrun
the page does not rendernext
a page does not renderpages, all-pages
a rerun of the query failed. Every later call reports this failurenext
the mutation failsrun
the plugin cannot read its stored stateplugin-call, plugin-stream
stored bytes do not match their digestread
stored tree metadata or the manifest of a named payload is corruptedobjects-get, objects-lookup, objects-children, objects-path
the stored manifest is corruptedobjects-manifest, objects-open

:out-of-memory

Codes: out_of_memory.

:not-found

Codes: not_found.

WhenOperations
the object has no member with the keymember
the macro refers to an unknown macrobuild-macro, expand-macro
the parent directory is missing, or the file is missing and create is falseopen
no definition is stored at the pathquery, mutation, definition
no expression is stored at the pathexpression
the stored query definition was deletedrun
the definition or exact historical plan revision does not existplan
the plugin reports that the request names nothing it holdsplugin-call, plugin-stream
no object node has the entityobjects-get
the parent has no child with the name, or the parent does not existobjects-lookup
the parent does not existobjects-children
the node or one of its ancestors does not existobjects-path
no payload with the digest is publishedobjects-manifest, objects-open
a parent does not exist or a digest is not publishedobjects-create
the file does not exist or the digest is not publishedobjects-update
the node or the destination does not existobjects-move
the node does not existobjects-remove

:locked

WhenOperations
another process holds the lock after lock_timeoutopen

:conflict

WhenOperations
an enabled plugin finds the database inconsistent with its copies: backups refuse diverging copies with code backup_history_divergent, naming themopen
concurrent writes prevent the commitrun
an entity revision check fails or a concurrent writer prevents the commit; a revision mismatch reports the entity and expected and actual revisionsmerge-patch
the authored definition or accepted plan changed before the explicit control committedplan
another write committed to the database during the buildbulk-finish
the plugin's write lost to a concurrent change, or the database holds writesplugin-call
the database holds writesplugin-stream, finish, objects-upload
the database holds writes while the plugin stores the byteswrite
a name is already taken in its parent or appears twice, or the database holds writesobjects-create
expected_revision is stale, or the database holds writesobjects-update, objects-remove
the name is occupied without replace, expected_revision is stale, or the database holds writesobjects-move

:invalid-definition

WhenOperations
the macro is invalid or expands recursivelybuild-macro, expand-macro
the definition is invalidquery, mutation
a macro it calls is invalid or expands recursivelyexpression
the loaded query definition is invalidrun
the query or its callable definitions are invalidsubscribe
the mutation selection or definition is invalidrun
the patched definition is invalidpatch-definition

:schema-violation

WhenOperations
the write breaks a schemarun

:invalid-commit-time

WhenOperations
the #_tx commit time is not later than the last commitmerge-patch

:closed

Codes: closed.

:rejected

WhenOperations
a mutation target or write guard refuses the writerun
the database refuses the patch; the code and diagnostic path name the reason and keymerge-patch
the database refuses the patch; the build has failed and later adds report the same statusbulk-add
the database refuses a patch; an initial build publishes nothing and fallback keeps earlier commitsbulk-finish

:unsupported

Codes: abi_version, core_digest.

WhenOperations
found differs from the ABI version of the bindingcheck-version

:cancelled

Codes: cancelled.

WhenOperations
the subscription is cancelled or closednext

:timeout

WhenOperations
max_wait passed firstindexes-sync
the plugin's wait passed its limitplugin-call
maxWait passed before the work finishedreactors-sync, sdk-sync
maxWait passed before every target confirmedbackups-sync

:unavailable

WhenOperations
an enabled plugin cannot reach what the open needs: backups refuse with backup_targets_unreachable, backup_target_unreadable or backup_objects_requiredopen
the patch sets stardust/history and no enabled plugin purges historyrun, merge-patch
the plugin is unknown or the database does not enable itplugin-call, plugin-stream
the database does not enable the objects pluginobjects-get, objects-lookup, objects-children, objects-path, objects-files, objects-manifest, objects-create, objects-update, objects-move, objects-remove, objects-upload, objects-open
the database does not enable the reactors pluginreactors-status, reactors-sync
the database does not enable the backups pluginbackups-status, backups-sync
the database does not enable the sdk pluginsdk-status, sdk-sync

:failed

WhenOperations
the plugin's work failedplugin-call
the plugin's work failed; status describes the failurereactors-sync, backups-sync, sdk-sync

:unlicensed

Codes: unlicensed.

WhenOperations
the token is refused; the error names the reasonactivate

Refusal examples

The generator captured each result from the native library.

Describe the backup runtime

clojure22 B
(sd/backups-status db)
Result / 165 B
{
  "code": "unavailable",
  "message": "the plugin is not enabled",
  "path": null,
  "field": null,
  "entity": null,
  "offset": null,
  "status": "unavailable"
}

Wait until every target stored the history

clojure103 B
(with-open [sync-options (sd/parse "{maxWait {#dur PT5S}}" :dust)]
  (sd/backups-sync db sync-options))
Result / 165 B
{
  "code": "unavailable",
  "message": "the plugin is not enabled",
  "path": null,
  "field": null,
  "entity": null,
  "offset": null,
  "status": "unavailable"
}

convert

duplicate-text holds this document:

json14 B
"{:a 1 :a 2}"
clojure112 B
(with-open [source (sd/parse duplicate-text :json)]
  (sd/parse (:text (sd/read source (sd/root source))) :edn))
Result / 181 B
{
  "code": "invalid_edn",
  "message": "invalid EDN (Duplicate_Key) at offset 6",
  "path": null,
  "field": null,
  "entity": null,
  "offset": 6,
  "status": "invalid_argument"
}

Refuse a metadata-only transaction

patch-text holds this document:

json38 B
{
  "#_tx": {
    "author": "x"
  }
}
clojure75 B
(with-open [patch (sd/parse patch-text :json)]
  (sd/merge-patch db patch))
Result / 199 B
{
  "code": "transaction_only",
  "message": "a patch of only #_tx is refused: #_tx annotates a write",
  "path": "#_tx",
  "field": null,
  "entity": null,
  "offset": null,
  "status": "rejected"
}

Refuse a repeated commit time

future-text holds this document:

json120 B
{
  "#_d": {
    "x": 1
  },
  "#_tx": {
    "stardust/committedAt": {
      "#utc": "2200-01-01T00:00:00Z"
    }
  }
}

older-text holds this document:

json120 B
{
  "#_e": {
    "x": 2
  },
  "#_tx": {
    "stardust/committedAt": {
      "#utc": "2200-01-01T00:00:00Z"
    }
  }
}
clojure152 B
(with-open [future (sd/parse future-text :json)
            older (sd/parse older-text :json)]
  (sd/merge-patch db future)
  (sd/merge-patch db older))
Result / 227 B
{
  "code": "invalid_commit_time",
  "message": "stardust/committedAt must be strictly newer than the latest commit time",
  "path": null,
  "field": null,
  "entity": null,
  "offset": null,
  "status": "invalid_commit_time"
}

Refuse an invalid query definition

definition-text holds this document:

json29 B
{
  "find": [
    "?x"
  ]
}
clojure84 B
(with-open [definition (sd/parse definition-text :json)]
  (sd/query db definition))
Result / 168 B
{
  "code": "unbound_variable",
  "message": "Unbound_Variable",
  "path": null,
  "field": null,
  "entity": null,
  "offset": null,
  "status": "invalid_definition"
}

Report a missing stored query

clojure30 B
(sd/query db "people/missing")
Result / 174 B
{
  "code": "not_found",
  "message": "no definition at this path",
  "path": "people/missing",
  "field": null,
  "entity": null,
  "offset": null,
  "status": "not_found"
}

Report a malformed byte at offset zero

malformed-text holds these bytes:

text1 B
]
clojure31 B
(sd/parse malformed-text :dust)
Result / 169 B
{
  "code": "invalid_dust",
  "message": "Invalid_Syntax at offset 0",
  "path": null,
  "field": null,
  "entity": null,
  "offset": 0,
  "status": "invalid_argument"
}

Report malformed DUST

malformed-text holds these bytes:

text1 B
[
clojure31 B
(sd/parse malformed-text :dust)
Result / 169 B
{
  "code": "invalid_dust",
  "message": "Unexpected_End at offset 2",
  "path": null,
  "field": null,
  "entity": null,
  "offset": 2,
  "status": "invalid_argument"
}