dlite-entity#
API for instances and entities.
There is only data and transformations. All data are instances of their metadata and metadata are instances of their meta-metadata, etc…
In DLite, instances are struct’s starting with DLiteInstance_HEAD, which is a macro defining a few key fields that all instances has:
uuid: Instances are uniquely identified by their UUID. If an instance has an URI, its UUID is generated from it (as a version 5 SHA1-based UUID using the DNS namespace). Otherwise the UUID is random (generated as a version 4 UUID).
uri: An optional unique name identifying the instance (related to its UUID as described above). For metadata the URI is mandantory and should be of the form “namespace/version/name”.
refcount: Reference count. Do not access this directly.
meta: Pointer to the metadata describing the instance. All instances may be cast to an DLiteInstance, which is a minimal struct representing all instances.
Metadata
In DLite, instances are described by specialised instances called metadata. Metadata are struct’s starting with the fields provided by the DLiteMeta_HEAD macro. Since metadata themselves are instances, you can always cast a DLiteMeta (a struct representing any metadata) to a DLiteInstance. This also means that metadata is described by their meta-metadata, and so forth. To break this (in principle infinite) chain of abstractions, dlite provides a root abstraction, called BasicMetadataSchema, that all instances in DLite are instances of. The BasicMetadataSchema, has itself as metadata and must therefore be able to describe itself.
Most of the fields provided by the DLiteMeta_HEAD macro are not intended to be accessed by the user, except maybe for ndimensions, nproperties, nrelations, dimensions, properties and relations, which may be handy.
Memory model
All instances, including metadata, uses the same memory model. They are allocated in one chunk of memory holding both header, dimensions and property values. The only exception are dimensional properties, whos values are allocated on the heap. Care is taken to use the system padding rules when the memory is layed out, such that it can be mapped to a (possible generated) struct. Allocating dimensional properties seperately has two benefits:
the size of the memory chunk for an instance is described by its metadata (it is independent on the length of the dimensions of the instance itself)
it allows to change the length of the dimensions of a data instance (but not for metadata, since they are immutable)
The following table summarises the memory layout of an instance:
segment |
nmemb |
size |
offset |
|---|---|---|---|
header |
1 |
meta->headersize |
0 |
dimensions |
meta->ndimensions |
sizeof(size_t) |
meta->dimoffset |
properties |
meta->nproperties |
[a] |
meta->propoffsets |
relations |
meta->nrelations |
sizeof(DLiteRelation) |
meta->reloffset |
propdims |
meta->npropdims |
sizeof(size_t) |
meta->propdimsoffset |
propdiminds [b] |
nproperties |
sizeof(size_t) |
meta->propdimindsoffset |
propoffsets [b] |
nproperties |
sizeof(size_t) |
[a]: The size of properties depends on their size and whether they are dimensional or not.
[b]: Only metadata instances have the last two segments.
header
The header for all instances must start with DLiteInstance_HEAD. This is a bare minimal, but sufficient for most data instances. It contains the UUID and (optionally) URI identifying the instance as well as a reference count and a pointer th the metadata describing the instance. Metadata and special data instances like collections, extends this.
The header of all metadata must start with DLiteMeta_HEAD (which itself starts with DLiteInstance_HEAD.
dimensions
The length of each dimension of the current instance.
properties
The value of each property of the current instance. The metadata for this instance defines the type and size for all properties. The size that the ith property occupies in an instance is given by meta->properties[i].size, except if the property has dimensions, in which case it is a pointer (of size sizeof(void *)) to a continuous allocated array with the property values.
Some property types, like dliteStringPtr and dliteProperty may allocate additional memory.
relations
Array of relations for the current instance.
propdims
Array of evaluated property dimension sizes (calculated from dimensions). Use the DLITE_PROP_DIM() macro to access these values.
propdiminds
Array with indices into propdims for the first dimension of each property. Note that only metadata has this segment.
propoffsets
Memory offset of each property of its instances. Don’t access this array directly, use the DLITE_PROP() macro instead. Note that only metadata instances has this segment.
Note that the allocated size of data instances are fully defined by their metadata. However, this is not true for metadata since it depends on nproperties - the number of properties it defines. Use the DLITE_INSTANCE_SIZE() macro to get the allocated size of an instance.
Typedefs and structs
-
DLITE_HASH_SIZE#
The size in bytes of sha3 hash used by transactions. Should be 32, 48 or 64.
-
DLiteInstance_HEAD#
Initial segment of all DLite instances.
-
DLiteMeta_HEAD#
Initial segment of all DLite metadata. With instance we here refer to the dataset described by this metadata.
For convinience we include
ndimensions,npropertiesandnrelationsin the header of all MetaData, so we don’t have to check the existence of these dimensions in the meta-metadata. A consequence is that all meta-metadata must include these as the first 3 dimensions, regardless of whether they actually are used (as in the case for Entity, which don’t have relations).
-
enum DLiteFlag#
Flags for describing the state of an instance. This should be as minimalistic as possible, but a flag for immutability is needed.
Values:
-
enumerator dliteImmutable#
Whether instance is immutable.
-
enumerator dliteImmutable#
-
typedef int (*DLiteInit)(struct _DLiteInstance *inst)#
Function for additional initialisation of an instance. If defined, this function is called at end of dlite_instance_create(). Returns non-zero on error.
-
typedef int (*DLiteDeInit)(struct _DLiteInstance *inst)#
Function for additional de-initialisation of a metadata instance. If defined, this function is called at beginning of dlite_instance_free(). Returns non-zero on error.
-
typedef int (*DLiteGetHash)(const DLiteInstance *inst, unsigned char *hash, int hashsize)#
Function used by extended metadata to replace the standard hash calculation in dlite_instance_get_hash(). The calculated hash is stored in
hash, wherehashsizeis the size ofhashin bytes. It should be 32, 48 or 64. Returns non-zero on error.
-
typedef int (*DLiteGetDimension)(const DLiteInstance *inst, size_t i)#
Function for accessing internal dimension sizes of extended metadata. If provided it will be called by dlite_instance_save(), dlite_instance_get_dimension_size() and related functions. Returns size of dimension
ior -1 on error.
-
typedef int (*DLiteSetDimension)(DLiteInstance *inst, size_t i, size_t value)#
Function for setting internal dimension sizes of extended metadata. If provided, it will be called by dlite_instance_set_dimension_size() and related functions. Returns zero on success. If the extended metadata does not support setting size of dimension
i, 1 is returned. On other errors, a negative value is returned.
-
typedef int (*DLiteLoadProperty)(const DLiteInstance *inst, size_t i)#
Function used by extended metadata to load internal state from property number
i. If provided, this function will be called by dlite_instance_set_property() and related functions. Returns non-zero on error.
-
typedef int (*DLiteSaveProperty)(DLiteInstance *inst, size_t i)#
Function used by extended metadata to save internal state to property number
i. If provided, this function will be called by dlite_instance_save(), dlite_instance_get_property() and related functions. Returns non-zero on error.
Macros
-
DLITE_NDIM(inst)#
Expands to number of dimensions –> (size_t)
-
DLITE_DIMS(inst)#
Expands to pointer to array of dimension values –> (size_t *)
-
DLITE_DIM(inst, n)#
Expands to length of dimension
n–> (size_t)
-
DLITE_DIMS_DESCR(inst)#
Expands to array of dimension descriptions –> (DLiteDimension *)
-
DLITE_DIM_DESCR(inst, n)#
Expands to description of dimensions
n–> (DLiteDimension *)
-
DLITE_NPROP(inst)#
Expands to number of properties –> (size_t).
-
DLITE_PROP(inst, n)#
Expands to pointer to the value of property
n–> (void *)Note: for arrays this pointer must be dereferred (since all arrays are allocated on the heap).
-
DLITE_PROP_NDIM(inst, n)#
Expands to number of dimensions of property
n–> (int)
-
DLITE_PROP_DIMS(inst, n)#
Expands to array of dimension sizes for property
n–> (size_t *)
-
DLITE_PROP_DIM(inst, n, m)#
Expands to size of the
mth dimension of propertyn–> (size_t)
-
DLITE_PROPS_DESCR(inst)#
Expands to array of property descriptions –> (DLiteProperty *)
-
DLITE_PROP_DESCR(inst, n)#
Expands to pointer to description of property
n–> (DLiteProperty *)
-
DLITE_NRELS(inst)#
Expands to number of relations –> (size_t)
-
DLITE_RELS(inst)#
Expands to pointer to array of relations –> (DLiteRelation *)
-
DLITE_REL(inst, n)#
Expands to pointer to relation
n–> (DLiteRelation *)
-
DLITE_PROPOFFSETSOFFSET(inst)#
Expands to the offset of propoffsets memory section –> (size_t)
-
DLITE_INSTANCE_SIZE(inst)#
Expands to the allocated size of a data or metadata instance –> (size_t)
Framework internals and debugging
-
void dlite_instance_debug(const DLiteInstance *inst)#
Prints instance to stdout. Intended for debugging.
-
size_t dlite_instance_size(const DLiteMeta *meta, const size_t *shape)#
Returns the allocated size of an instance with metadata
metaand dimensionsdims. The length ofdimsis given bymeta->_ndimensions. Mostly intended for internal use.Returns -1 on error.
-
char **dlite_istore_get_uuids(int *nuuids)#
Returns a newly allocated NULL-terminated array of string pointers with uuids available in the internal storage (istore).
Mostly intended for internal/debugging use.
Instance API
-
DLiteInstance *dlite_instance_create(const DLiteMeta *meta, const size_t *dims, const char *id)#
Returns a new dlite instance from Entiry
metaand dimensionsdims. The lengths ofdimsis found inmeta->_ndimensions.The
idargment may be NULL, a valid UUID or an unique identifier to this instance (e.g. an uri). In the first case, a random UUID will be generated. In the second case, the instance will get the provided UUID. In the third case, an UUID will be generated fromid. In addition, the instanc’s uri member will be assigned toid.All properties are initialised to zero and arrays for all dimensional properties are allocated and initialised to zero.
On error, NULL is returned.
-
DLiteInstance *dlite_instance_create_from_id(const char *metaid, const size_t *dims, const char *id)#
Like dlite_instance_create() but takes the uri or uuid of the metadata as the first argument.
Returns NULL on error.
-
int dlite_instance_incref(DLiteInstance *inst)#
Increases reference count on
inst.Returns the new reference count.
-
int dlite_instance_decref(DLiteInstance *inst)#
Decrease reference count to
inst. If the reference count reaches zero, the instance is free’ed.Returns the new reference count.
-
DLiteInstance *dlite_instance_has(const char *id, bool check_storages)#
Checks whether an instance with the given
idexists.If
check_storagesis true, the storage plugin path is searched if the instance is not found in the in-memory store. This is equivalent to dlite_instance_get(), except that a borrowed reference is returned and no error is reported if the instance cannot be found.Returns a pointer to the instance (borrowed reference) if it exists or NULL otherwise.
-
DLiteInstance *dlite_instance_get(const char *id)#
Returns a new reference to instance with given
idor NULL if no such instance can be found.If the instance exists in the in-memory store it is returned (with its refcount increased by one). Otherwise it is searched for in the storage plugin path (initiated from the DLITE_STORAGES environment variable).
It is an error if the instance cannot be found.
-
DLiteInstance *dlite_instance_get_casted(const char *id, const char *metaid)#
Like dlite_instance_get(), but maps the instance with the given id to an instance of
metaid. Ifmetaidis NULL, it falls back to dlite_instance_get(). Returns NULL on error.
-
DLiteInstance *dlite_instance_load(const DLiteStorage *s, const char *id)#
Loads instance identified by
idfrom storagesand returns a new and fully initialised dlite instance.In case the storage only contains one instance, it is possible to set
idto NULL. However, it is an error to setidto NULL if the storage contains more than one instance.On error, NULL is returned.
-
DLiteInstance *dlite_instance_load_loc(const char *driver, const char *location, const char *options, const char *id)#
A convenient function for loading an instance with given id from a storage specified with the
driver,locationandoptionsarguments (see dlite_storage_open()).The
idargument may be NULL if the storage contains only one instance.Returns the instance or NULL on error.
-
DLiteInstance *dlite_instance_load_url(const char *url)#
A convinient function that loads an instance given an URL of the form
wheredriver://loc?options#id
loccorresponds to theuriargument of dlite_storage_open(). Iflocis not given, the instance is loaded from the metastore usingid.Returns the instance or NULL on error.
-
DLiteInstance *dlite_instance_load_casted(const DLiteStorage *s, const char *id, const char *metaid)#
Like dlite_instance_load(), but allows casting the loaded instance into an instance of metadata identified by
metaid. Ifmetaidis NULL, no casting is performed.Some storages accept that
idis NULL if the storage only contain one instance. In that case that instance is returned.For the cast to be successful requires that the correct mappings have been registered.
Returns NULL on error or if no mapping can be found.
-
int dlite_instance_save(DLiteStorage *s, const DLiteInstance *inst)#
Saves instance
instto storages. Returns non-zero on error.
-
int dlite_instance_save_loc(const char *driver, const char *location, const char *options, const DLiteInstance *inst)#
A convinient function that saves instance
instto the storage specified bydriver,locationandoptions.Returns non-zero on error.
-
int dlite_instance_save_url(const char *url, const DLiteInstance *inst)#
A convinient function that saves instance
instto the storage specified byurl, which should be of the formReturns non-zero on error.driver://loc?options
-
DLiteInstance *dlite_instance_memload(const char *driver, const unsigned char *buf, size_t size, const char *id, const char *options, const char *metaid)#
Loads instance
idfrom memory bufferbufof sizesizeand return it. Returns NULL on error.
-
int dlite_instance_memsave(const char *driver, unsigned char *buf, size_t size, const DLiteInstance *inst, const char *options)#
Stores instance
instto memory bufferbufof sizesize.Returns number of bytes written to
buf(or would have been written tobufifbufis not large enough). Returns a negative error code on error.
-
unsigned char *dlite_instance_to_memory(const char *driver, const DLiteInstance *inst, const char *options)#
Saves instance to a newly allocated memory buffer. Returns NULL on error.
-
const char *dlite_instance_get_uuid(const DLiteInstance *inst)#
Returns a pointer to instance UUID.
-
const char *dlite_instance_get_uri(const DLiteInstance *inst)#
Returns a pointer to instance URI.
-
const char *dlite_instance_get_meta_uuid(const DLiteInstance *inst)#
Returns a pointer to the UUID of the instance metadata.
-
const char *dlite_instance_get_meta_uri(const DLiteInstance *inst)#
Returns a pointer to the URI of the instance metadata.
-
bool dlite_instance_has_dimension(DLiteInstance *inst, const char *name)#
Returns true if instance has a dimension with the given name.
-
size_t dlite_instance_get_ndimensions(const DLiteInstance *inst)#
Returns number of dimensions or -1 on error.
-
size_t dlite_instance_get_nproperties(const DLiteInstance *inst)#
Returns number of properties or -1 on error.
-
size_t dlite_instance_get_dimension_size_by_index(const DLiteInstance *inst, size_t i)#
Returns size of dimension
ior -1 on error.
-
void *dlite_instance_get_property_by_index(const DLiteInstance *inst, size_t i)#
Returns a pointer to data corresponding to property with index
ior NULL on error.The returned pointer points to the actual data and should not be dereferred for arrays.
-
int dlite_instance_set_property_by_index(DLiteInstance *inst, size_t i, const void *ptr)#
Sets property
ito the value pointed to byptr. Returns non-zero on error.
-
int dlite_instance_get_property_ndims_by_index(const DLiteInstance *inst, size_t i)#
Returns number of dimensions of property with index
ior -1 on error.
-
int dlite_instance_get_property_shape_by_index(const DLiteInstance *inst, size_t i, size_t j)#
Returns size of shape
jin propertyior -1 on error.
-
size_t *dlite_instance_get_property_dims_by_index(const DLiteInstance *inst, size_t i)#
Returns a malloc’ed array of dimensions of property
ior NULL on error.
-
int dlite_instance_get_dimension_size(const DLiteInstance *inst, const char *name)#
Returns size of dimension
ior -1 on error.
-
void *dlite_instance_get_property(const DLiteInstance *inst, const char *name)#
Returns a pointer to data corresponding to
nameor NULL on error.
-
int dlite_instance_set_property(DLiteInstance *inst, const char *name, const void *ptr)#
Copies memory pointed to by
ptrto propertyname. Returns non-zero on error.
-
bool dlite_instance_has_property(const DLiteInstance *inst, const char *name)#
Returns true if instance has a property with the given name.
-
int dlite_instance_get_property_ndims(const DLiteInstance *inst, const char *name)#
Returns number of dimensions of property
nameor -1 on error.
-
size_t dlite_instance_get_property_dimssize(const DLiteInstance *inst, const char *name, size_t j)#
Returns size of dimension
jof propertynameor NULL on error.
-
int dlite_instance_is_data(const DLiteInstance *inst)#
Returns non-zero if
instis a data instance.
-
int dlite_instance_is_meta(const DLiteInstance *inst)#
Returns non-zero if
instis metadata.This is simply the inverse of dlite_instance_is_data().
-
int dlite_instance_is_metameta(const DLiteInstance *inst)#
Returns non-zero if
instis meta-metadata.Meta-metadata contains either a “properties” property (of type DLiteProperty) or a “relations” property (of type DLiteRelation) in addition to a “dimensions” property (of type DLiteDimension).
-
int dlite_instance_print_property(char *dest, size_t n, const DLiteInstance *inst, const char *name, int width, int prec, DLiteTypeFlag flags)#
Write a string representation of property
nametodest.Arrays will be written with a JSON-like syntax.
No more than
nbytes are written todest(incl. the terminating NUL).The
widthandprecarguments corresponds to the printf() minimum field width and precision/length modifier. If you set them to -1, a suitable value will selected according totype. To ignore their effect, setwidthto zero orprecto -2.The
flagsprovides some format options. If zero (default) bools and strings are expected to be quoted.Returns number of bytes written to
dest. If the output is truncated because it exceedsn, the number of bytes that would have been written ifnwas large enough is returned. On error, a negative value is returned.
-
int dlite_instance_print_property_by_index(char *dest, size_t n, const DLiteInstance *inst, size_t i, int width, int prec, DLiteTypeFlag flags)#
Lite dlite_print_property() but takes property index
ias argument instead of property name.
-
int dlite_instance_aprint_property(char **dest, size_t *n, size_t pos, const DLiteInstance *inst, const char *name, int width, int prec, DLiteTypeFlag flags)#
Lite dlite_print_property() but prints to allocated buffer.
Prints to position
posin*dest, which should point to a buffer of size*n.*destis reallocated if needed.Returns number or bytes written or a negative number on error.
-
int dlite_instance_aprint_property_by_index(char **dest, size_t *n, size_t pos, const DLiteInstance *inst, size_t i, int width, int prec, DLiteTypeFlag flags)#
Lite dlite_aprint_property() but takes property index
ias argument instead of property name.
-
int dlite_instance_scan_property(const char *src, const DLiteInstance *inst, const char *name, DLiteTypeFlag flags)#
Scans property
namefromsrc.The
flagsprovides some format options. If zero (default) bools and strings are expected to be quoted.Returns number of characters consumed from
srcor a negative number on error.
-
int dlite_instance_scan_property_by_index(const char *src, const DLiteInstance *inst, size_t i, DLiteTypeFlag flags)#
Lite dlite_scan_property() but takes property index
ias argument instead of property name.
-
int dlite_instance_sync_to_dimension_sizes(DLiteInstance *inst)#
Updates dimension sizes from internal state by calling the getdim() method of extended metadata. Does nothing, if the metadata has no getdim() method.
Returns non-zero on error.
-
int dlite_instance_sync_from_dimension_sizes(DLiteInstance *inst)#
Updates internal state of extended metadata from instance dimensions using setdim(). Does nothing, if the metadata has no setdim().
Returns non-zero on error.
-
int dlite_instance_sync_to_properties(DLiteInstance *inst)#
Help function that update properties from the saveprop() method of extended metadata. Does nothing, if the metadata has no saveprop() method.
Returns non-zero on error.
-
int dlite_instance_sync_from_properties(DLiteInstance *inst)#
Updates internal state of extended metadata from instance properties using loadprop(). Does nothing, if the metadata has no loadprop().
Returns non-zero on error.
-
int dlite_instance_set_dimension_sizes(DLiteInstance *inst, const int *dims)#
Updates the size of all dimensions in
inst. The new dimension sizes are provided inshape, which must be of lengthinst->ndimensions. Dimensions corresponding to negative elements inshapewill remain unchanged.All properties whos dimension are changed will be reallocated and new memory will be zeroed. The values of properties with two or more dimensions, where any but the first dimension is updated, should be considered invalidated.
Returns non-zero on error.
-
int dlite_instance_set_dimension_size_by_index(DLiteInstance *inst, size_t i, size_t size)#
Like dlite_instance_set_dimension_sizes(), but only updates the size of dimension
ito sizesize. Returns non-zero on error.
-
int dlite_instance_set_dimension_size(DLiteInstance *inst, const char *name, size_t size)#
Like dlite_instance_set_dimension_sizes(), but only updates the size of dimension
nameto sizesize. Returns non-zero on error.
-
DLiteInstance *dlite_instance_copy(const DLiteInstance *inst, const char *newid)#
Copies instance
instto a newly created instance.If
newidis NULL, the new instance will have no URI and a random UUID. Ifnewidis a valid UUID, the new instance will have the given UUID and no URI. Otherwise, the URI of the new instance will benewidand the UUID assigned accordingly.Returns NULL on error.
-
DLiteArray *dlite_instance_get_property_array_by_index(const DLiteInstance *inst, size_t i, int order)#
Returns a new DLiteArray object for property number
iin instanceinst.ordercan be ‘C’ for row-major (C-style) order and ‘F’ for column-manor (Fortran-style) order.The returned array object only describes, but does not own the underlying array data, which remains owned by the instance.
Scalars are treated as a one-dimensional array or length one.
Returns NULL on error.
-
DLiteArray *dlite_instance_get_property_array(const DLiteInstance *inst, const char *name, int order)#
Returns a new DLiteArray object for property
namein instanceinst.ordercan be ‘C’ for row-major (C-style) order and ‘F’ for column-manor (Fortran-style) order.The returned array object only describes, but does not own the underlying array data, which remains owned by the instance.
Scalars are treated as a one-dimensional array or length one.
Returns NULL on error.
-
int dlite_instance_copy_property(const DLiteInstance *inst, const char *name, int order, void *dest)#
Copy value of property
nameto memory pointed to bydest. It must be large enough to hole all the data. The meaning ororderis: ‘C’: row-major (C-style) order, no reordering. ‘F’: coloumn-major (Fortran-style) order, transposed order.Return non-zero on error.
-
int dlite_instance_copy_property_by_index(const DLiteInstance *inst, int i, int order, void *dest)#
Like dlite_instance_copy_property(), but the property is specified by its index
iinstead of name.
-
int dlite_instance_cast_property_by_index(const DLiteInstance *inst, int i, DLiteType type, size_t size, const size_t *shape, const int *strides, void *dest, DLiteTypeCast castfun)#
Copies and possible type-cast value of property number
ito memory pointed to bydestusingcastfun. The destination memory is described by argumentstype,sizeshapeandstrides. It must be large enough to hole all the data.If
castfunis NULL, it defaults to dlite_type_copy_cast().Return non-zero on error.
-
int dlite_instance_assign_property(const DLiteInstance *inst, const char *name, int order, const void *src)#
Assigns property
nameto memory pointed to bysrc. The meaning oforderis: ‘C’: row-major (C-style) order, no reordering. ‘F’: coloumn-major (Fortran-style) order, transposed order.Return non-zero on error.
-
int dlite_instance_assign_casted_property_by_index(const DLiteInstance *inst, int i, DLiteType type, size_t size, const size_t *shape, const int *strides, const void *src, DLiteTypeCast castfun)#
Assigns property
iby copying and possible type-cast memory pointed to bysrcusingcastfun. The memory pointed to bysrcis described by argumentstype,sizeshapeandstrides.If
castfunis NULL, it defaults to dlite_type_copy_cast().Return non-zero on error.
-
char *dlite_instance_default_uri(const DLiteInstance *inst)#
Return a newly allocated default instance URI constructed from the metadata URI and the UUID of the instance, as
<meta_uri>/<uuid>.Returns NULL on error.
-
int dlite_instance_get_hash(const DLiteInstance *inst, unsigned char *hash, int hashsize)#
Calculates a hash of instance
inst. The calculated hash is stored inhash, wherehashsizeis the size ofhashin bytes. It should be 32, 48 or 64.Return non-zero on error.
Transactions
-
void dlite_instance_freeze(DLiteInstance *inst)#
Make instance immutable. This can never be reverted.
Note** Immutability of the underlying data cannot be enforced in C as long as the someone has a pointer to the instance. However, functions like dlite_instance_set_property() and dlite_instance_set_dimension_size() will refuse to change the instance if it is immutable. Furthermore, if the instance is used as a parent in a transaction, any changes to the underlying data will be detected by calling dlite_instance_verify_transaction().
-
int dlite_instance_is_frozen(const DLiteInstance *inst)#
Returns non-zero if instance is immutable (frozen).
-
int dlite_instance_snapshot(DLiteInstance *inst)#
Make a snapshop of mutable instance
inst.The
instwill be a transaction whos parent is the snapshot. Ifinstalready has a parent, that will now be the parent of the snapshot.The reason that
instmust be mutable, is that its hash will change due to change in its parent.The snapshot will be assigned an URI of the form “snapshot-XXXXXXXXXXXX” (or inst->uri::snapshot-XXXXXXXXXXXX if inst->uri is not NULL) where each X is replaces with a random character.
On error non-zero is returned and
instis unchanged.
-
const DLiteInstance *dlite_instance_get_snapshot(const DLiteInstance *inst, int n)#
Returns a borrowed reference to shapshot number
nofinst, wherencounts backward frominst. Hence,n=0returnsinst,n=1returns the parent ofinst, etc…Snapshots may be pulled back into memory using dlite_instance_get(). Use dlite_instance_pull() if you know the storage that the snapshots are stored in.
Returns NULL on error.
-
const DLiteInstance *dlite_instance_pull_snapshot(const DLiteInstance *inst, DLiteStorage *s, int n)#
Like dlite_instance_get_snapshot(), except that stored snapshots are pulled from
sto memory.Returns a borrowed reference to snapshot
nor NULL on error.
-
int dlite_instance_push_snapshot(const DLiteInstance *inst, DLiteStorage *s, int n)#
Push all ancestors of snapshot
nfrom memory to storages, wheren=0corresponds toinst,n=1to the parent ofinst, etc…No snapshot is pulled back from storage, so if the snapshots are already in storage, this function has no effect.
This function starts pushing closest to the root to ensure that the transaction is in a consistent state at all times.
Returns zero on success or the (positive) index of the snapshot that fails to push.
-
int dlite_instance_print_transaction(const DLiteInstance *inst)#
Prints transaction to stdout. Returns non-zero on error.
-
int dlite_instance_set_parent(DLiteInstance *inst, const DLiteInstance *parent)#
Turn instance
instinto a transaction node with parentparent.This require that
instis mutable, andparentis immutable.If
instalready has a parent, it will be replaced.Use dlite_instance_freeze() and dlite_instance_is_frozen() to make and check that an instance is immutable, respectively.
Returns non-zero on error.
-
int dlite_instance_has_parent(const DLiteInstance *inst)#
Returns non-zero if
insthas a parent.
-
int dlite_instance_verify_hash(const DLiteInstance *inst, uint8_t *hash, int recursive)#
Verify that the hash of instance
inst.If
hashis not NULL, this function verifies that the hash ofinstcorresponds to the memory pointed to byhash. The size of the memory should beDLITE_HASH_SIZEbytes.If
hashis NULL andinsthas a parent, this function will instead verify that the parent hash stored ininstcorresponds to the value of the parent.If
recursiveis non-zero, all ancestors ofinstare also included in the verification.Returns zero if the hash is valid. Otherwise non-zero is returned and an error message is issued.
- Todo:
If
recursiveis non-zero andinstis a collection or has properties of typedliteRef, we should also verify the instances that are referred to. This is currently not implemented, because we have to detect cyclic references to avoid infinite recursion.
-
int dlite_instance_verify_transaction(const DLiteInstance *inst)#
Verifies a transaction.
Equivalent to calling
dlite_instance_very_hash(inst, NULL, 1).Returns zero if the hash is valid. Otherwise non-zero is returned and an error message is issued.
Metadata API
-
DLiteMeta *dlite_meta_create(const char *uri, const char *description, size_t ndimensions, const DLiteDimension *dimensions, size_t nproperties, const DLiteProperty *properties)#
Specialised function that returns a new metadata created from the given arguments. It is an instance of DLITE_ENTITY_SCHEMA.
-
int dlite_meta_init(DLiteMeta *meta)#
Initialises internal data of metadata
meta.Note, even though this function is called internally in dlite_instance_create(), it has to be called again after properties has been assigned to the metadata. This because
_npropdimsand__propdimindsdepends on the property dimensions.Returns non-zero on error.
-
int dlite_meta_incref(DLiteMeta *meta)#
Increase reference count to meta-metadata.
Returns the new reference count.
-
int dlite_meta_decref(DLiteMeta *meta)#
Decrease reference count to meta-metadata. If the reference count reaches zero, the meta-metadata is free’ed.
Returns the new reference count.
-
DLiteMeta *dlite_meta_get(const char *id)#
Returns a new reference to metadata with given
idor NULL if no such instance can be found.
-
DLiteMeta *dlite_meta_load(const DLiteStorage *s, const char *id)#
Loads metadata identified by
idfrom storagesand returns a new fully initialised meta instance.
-
DLiteMeta *dlite_meta_load_url(const char *url)#
Like dlite_instance_load_url(), but loads metadata instead. Returns the metadata or NULL on error.
-
int dlite_meta_save(DLiteStorage *s, const DLiteMeta *meta)#
Saves metadata
metato storages. Returns non-zero on error.
-
int dlite_meta_save_url(const char *url, const DLiteMeta *meta)#
Saves metadata
metatourl. Returns non-zero on error.
-
int dlite_meta_get_dimension_index(const DLiteMeta *meta, const char *name)#
Returns index of dimension named
nameor -1 on error.
-
int dlite_meta_get_property_index(const DLiteMeta *meta, const char *name)#
Returns index of property named
nameor -1 on error.
-
const DLiteDimension *dlite_meta_get_dimension_by_index(const DLiteMeta *meta, size_t i)#
Returns a pointer to dimension with index
ior NULL on error.
-
const DLiteDimension *dlite_meta_get_dimension(const DLiteMeta *meta, const char *name)#
Returns a pointer to dimension named
nameor NULL on error.
-
const DLiteProperty *dlite_meta_get_property_by_index(const DLiteMeta *meta, size_t i)#
Returns a pointer to property with index
ior NULL on error.
-
const DLiteProperty *dlite_meta_get_property(const DLiteMeta *meta, const char *name)#
Returns a pointer to property named
nameor NULL on error.
-
int dlite_meta_is_metameta(const DLiteMeta *meta)#
Returns non-zero if
metais meta-metadata (i.e. its instances are metadata).Note
If
metacontains either a “properties” property (of type DLiteProperty) or a “relations” property (of type DLiteRelation) in addition to a “dimensions” property (of type DLiteDimension), then it is able to describe metadata and is considered to be meta-metadata. Otherwise it is not.
-
bool dlite_meta_has_dimension(const DLiteMeta *meta, const char *name)#
Returns true if
metahas a dimension with the given name.
-
bool dlite_meta_has_property(const DLiteMeta *meta, const char *name)#
Returns true if
metahas a property with the given name.
Dimensions
-
DLiteDimension *dlite_dimension_create(const char *name, const char *description)#
Returns a newly malloc’ed DLiteDimension or NULL on error.
The
descriptionarguments may be NULL.
-
void dlite_dimension_free(DLiteDimension *dim)#
Frees a DLiteDimension.
Properties
-
DLiteProperty *dlite_property_create(const char *name, DLiteType type, size_t size, const char *unit, const char *description)#
Returns a newly malloc’ed DLiteProperty or NULL on error.
It is created with no dimensions. Use dlite_property_add_dim() to add dimensions to the property.
The arguments
unit, anddescriptionmay be NULL.
-
void dlite_property_clear(DLiteProperty *prop)#
Clear DLiteProperty.
Free all memory referred to by the property and it, but free
propitself.
-
void dlite_property_free(DLiteProperty *prop)#
Frees a DLiteProperty.
-
int dlite_property_add_dim(DLiteProperty *prop, const char *expr)#
Add dimension expression
exprto property. Returns non-zero on error.
-
int dlite_property_print(char *dest, size_t n, const void *ptr, const DLiteProperty *p, const size_t *shape, int width, int prec, DLiteTypeFlag flags)#
Writes a string representation of data for property
ptodest.The pointer
ptrshould point to the memory where the data is stored. The meaning and layout of the data is described by propertyp. The actual sizes of the property dimension is provided byshape. Use dlite_instance_get_property_dims_by_index() or the DLITE_PROP_DIMS macro for accessingshape.No more than
nbytes are written todest(incl. the terminating NUL). Arrays will be written with a JSON-like syntax.The
widthandprecarguments corresponds to the printf() minimum field width and precision/length modifier. If you set them to -1, a suitable value will selected according totype. To ignore their effect, setwidthto zero orprecto -2.Returns number of bytes written to
dest. If the output is truncated because it exceedsn, the number of bytes that would have been written ifnwas large enough is returned. On error, a negative value is returned.
-
int dlite_property_aprint(char **dest, size_t *n, size_t pos, const void *ptr, const DLiteProperty *p, const size_t *shape, int width, int prec, DLiteTypeFlag flags)#
Like dlite_type_print(), but prints to allocated buffer.
Prints to position
posin*dest, which should point to a buffer of size*n.*destis reallocated if needed.Returns number or bytes written or a negative number on error.
-
int dlite_property_scan(const char *src, void *ptr, const DLiteProperty *p, const size_t *shape, DLiteTypeFlag flags)#
Scans property from
srcand write it to memory pointed to byptr.The property is described by
p.For arrays,
ptrshould points to the first element and will not be not dereferenced. Evaluated dimension sizes are given byshape.The
flagsprovides some format options. If zero (default) bools and strings are expected to be quoted.Returns number of characters consumed from
srcor a negative number on error.
-
int dlite_property_jscan(const char *src, const jsmntok_t *item, const char *key, void *ptr, const DLiteProperty *p, const size_t *shape, DLiteTypeFlag flags)#
Scan property from JSON data.
Arguments:
src: JSON data to scan.
item: Pointer into array of JSMN tokens corresponding to the item to scan.
key: The key corresponding to the scanned value when scanning from a JSON object. May be NULL otherwise.
ptr: Pointer to memory that the scanned value will be written to. For arrays,
ptrshould points to the first element and will not be not dereferenced.p: DLite property describing the data to scan.
shape: Evaluated shape of property to scan.
flags: Format options. If zero (default) strings are expected to be quoted.
Returns:
Number of characters consumed from
srcor a negative number on error.
MetaModel - a data model for metadata
An interface for easy creation of metadata programically. This is especially useful in bindings to other languages like Fortran where code generation is more difficult.
-
DLiteMetaModel *dlite_metamodel_create(const char *uri, const char *metaid)#
Create and return a new empty metadata model. may be NULL.
Returns NULL on error.
-
void dlite_metamodel_free(DLiteMetaModel *model)#
Frees metadata model.
-
int dlite_metamodel_set_dimension_value(DLiteMetaModel *model, const char *name, size_t value)#
Sets actual value of dimension
name, wherenamemust correspond to a named dimension in the metadata of this model.
-
int dlite_metamodel_add_value(DLiteMetaModel *model, const char *name, const void *value)#
Adds a data value to
modelcorresponding to propertynameof the metadata for this model.Note that
modelonly stores a pointer tovalue. This means thatvaluemust not be reallocated or free’ed whilemodelis in use.This can e.g. be used to add description.
Returns non-zero on error.
-
int dlite_metamodel_set_value(DLiteMetaModel *model, const char *name, const void *value)#
Like dlite_metamodel_add_value(), but if a value exists, it is replaced instead of added.
Returns non-zero on error.
-
int dlite_metamodel_add_string(DLiteMetaModel *model, const char *name, const char *s)#
Adds a string to
modelcorresponding to propertynameof the metadata for this model.Returns non-zero on error.
-
int dlite_metamodel_set_string(DLiteMetaModel *model, const char *name, const char *s)#
Like dlite_metamodel_add_string(), but if the string already exists, it is replaced instead of added.
Returns non-zero on error.
-
int dlite_metamodel_add_dimension(DLiteMetaModel *model, const char *name, const char *description)#
Adds a dimension to the property named “dimensions” of the metadata for
model.The name and description of the new dimension is given by
nameanddescription, respectively.descriptionmay be NULL.Returns non-zero on error.
-
int dlite_metamodel_add_property(DLiteMetaModel *model, const char *name, const char *typename, const char *unit, const char *description)#
Adds a new property to the property named “properties” of the metadata for
model.Arguments:
model: datamodel that the property is added to
name: name of new property
typename: type of new property, ex. “string80”, “int64”, “string”,…
unit: unit of new type. May be NULL
description: description of property. May be NULL
Use dlite_metamodel_add_property_dim() to add dimensions to the property.
Returns non-zero on error.
-
int dlite_metamodel_add_property_dim(DLiteMetaModel *model, const char *name, const char *expr)#
Add dimension expression
exprto propertyname(which must have been added with dlite_metamodel_add_property()).Returns non-zero on error.
-
const char *dlite_metamodel_missing_value(const DLiteMetaModel *model)#
If
modelis missing a value described by a property in its metadata, return a pointer to the name of the first missing value.If all values are assigned, NULL is returned.
-
const void *dlite_metamodel_get_property(const DLiteMetaModel *model, const char *name)#
Returns a pointer to the value, dimension or property added with the given name.
Returns NULL on error.
-
struct DLiteParent#
- #include <dlite-entity.h>
Reference to parent instance. Used by transactions.
Public Members
-
const struct _DLiteInstance *parent#
Pointer to parent instance. May be NULL, in which case the parent must be accessed via uuid.
-
char uuid[DLITE_UUID_LENGTH + 1]#
UUID of parent instance.
-
uint8_t hash[DLITE_HASH_SIZE]#
Hash of parent instance.
-
const struct _DLiteInstance *parent#
-
struct _DLiteInstance#
- #include <dlite-entity.h>
Base definition of a DLite instance, that all instance (and metadata) objects can be cast to. Is never actually instansiated.
Opaque type for an instance.
-
struct _DLiteDimension#
- #include <dlite-entity.h>
DLite dimension
-
struct _DLiteProperty#
- #include <dlite-entity.h>
DLite property
Public Members
-
char *name#
Name of this property.
-
size_t size#
Size of one data element.
-
char *ref#
Reference to metadata URI for type=dliteRef.
-
int ndims#
Number of dimension of the described data. Zero if scalar.
-
char **shape#
Array of dimension strings. May be NULL.
-
char *unit#
Unit of the described data. May be NULL.
-
char *description#
Human described of the described data.
-
char *name#
-
struct DLiteMeta#
- #include <dlite-entity.h>
Base definition of a DLite metadata, that all metadata objects can be cast to.
It may be instansiated, e.g. by the basic metadata schema.