|
virtual Sint32 | commit ()=0 |
| Commits the transaction. More...
|
|
virtual void | abort ()=0 |
| Aborts the transaction. More...
|
|
virtual bool | is_open () const =0 |
| Indicates whether the transaction is open. More...
|
|
virtual base::IInterface * | create (const char *type_name, Uint32 argc=0, const base::IInterface *argv[]=0)=0 |
| Creates an object of the type type_name . More...
|
|
template<class T> |
T * | create (const char *type_name, Uint32 argc=0, const base::IInterface *argv[]=0) |
| Creates an object of the type type_name . More...
|
|
template<class T> |
T * | create () |
| Creates an object of the type T . More...
|
|
virtual Sint32 | store (base::IInterface *db_element, const char *name, Uint8 privacy=LOCAL_SCOPE)=0 |
| Stores the element db_element in the database under the name name and with the privacy level privacy . More...
|
|
virtual const base::IInterface * | access (const char *name)=0 |
| Retrieves an element from the database. More...
|
|
template<class T> |
const T * | access (const char *name) |
| Retrieves an element from the database. More...
|
|
virtual base::IInterface * | edit (const char *name)=0 |
| Retrieves an element from the database and returns it ready for editing. More...
|
|
template<class T> |
T * | edit (const char *name) |
| Retrieves an element from the database and returns it ready for editing. More...
|
|
virtual Sint32 | copy (const char *source, const char *target, Uint8 privacy=LOCAL_SCOPE)=0 |
| Creates a copy of a database element. More...
|
|
virtual Sint32 | remove (const char *name, bool only_localized=false)=0 |
| Marks the element with the name name for removal from the database. More...
|
|
virtual const char * | name_of (const base::IInterface *db_element) const =0 |
| Returns the name of a database element. More...
|
|
virtual const char * | get_time_stamp () const =0 |
| Returns the time stamp describing the current "time". More...
|
|
virtual const char * | get_time_stamp (const char *element) const =0 |
| Returns the time stamp of the last change of a database element. More...
|
|
virtual bool | has_changed_since_time_stamp (const char *element, const char *time_stamp) const =0 |
| Checks whether an element has been stored or changed in the database since a given time stamp. More...
|
|
virtual const char * | get_id () const =0 |
| Returns the ID of this transaction. More...
|
|
virtual IScope * | get_scope () const =0 |
| Returns the scope of this transaction. More...
|
|
virtual IArray * | list_elements (const char *root_element, const char *name_pattern=0, const IArray *type_names=0) const =0 |
| Returns scene elements of a subgraph originating at a given scene element. More...
|
|
virtual Sint32 | get_privacy_level (const char *name) const =0 |
| Returns the privacy level of the element with the name name . More...
|
|
virtual Uint32 | retain () const =0 |
| Increments the reference count. More...
|
|
virtual Uint32 | release () const =0 |
| Decrements the reference count. More...
|
|
virtual const IInterface * | get_interface (const Uuid &interface_id) const =0 |
| Acquires a const interface from another. More...
|
|
template<class T> |
const T * | get_interface () const |
| Acquires a const interface from another. More...
|
|
virtual IInterface * | get_interface (const Uuid &interface_id)=0 |
| Acquires a mutable interface from another. More...
|
|
template<class T> |
T * | get_interface () |
| Acquires a mutable interface from another. More...
|
|
virtual Uuid | get_iid () const =0 |
| Returns the interface ID of the most derived interface. More...
|
|
|
typedef Interface_declare< id1, ... > | Self |
| Own type. More...
|
|
typedef Uuid_t< id1, ... > | IID |
| Declares the interface ID (IID) of this interface. More...
|
|
typedef Uuid_t<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0> | IID |
| Declares the interface ID (IID) of this interface. More...
|
|
static bool | compare_iid (const Uuid &iid) |
| Compares the interface ID iid against the interface ID of this interface and of its ancestors. More...
|
|
static bool | compare_iid (const Uuid &iid) |
| Compares the interface ID iid against the interface ID of this interface. More...
|
|
A transaction provides a consistent view on the database.
This view on the database is isolated from changes by other (parallel) transactions. Eventually, each transaction must be either committed or aborted, i.e., all changes become either atomically visible to transactions started afterwards, or not at all.
Transactions are associated with a scope of the database and can be created with mi::neuraylib::IScope::create_transaction().
Transactions are not thread-safe. If you use a particular transaction from multiple threads, then you have to serialize all transaction uses. This does not only apply to methods of mi::neuraylib::ITransaction, but all methods that implicitly use the transaction. For example, such a use can happen by methods of DB elements returned from access() or edit() calls, or by objects returned from factories taking the transaction as an argument, like mi::neuraylib::IMdl_factory::create_module_builder().
- Concurrent accesses to database elements within a transaction
Access to database elements is provided by access() (read-only) and edit() (for modification). The interface pointers returned by these methods must be released when you are done, in particular before the transaction is committed or aborted.
- Note that it is possible to access the same database element concurrently in the same transaction. Concurrently means that the interface pointer obtained from an earlier access() or edit() call has not yet been released and the same database element is accessed once more using access() or edit(). It is advisable to avoid such concurrent accesses since it can easily lead to difficult to understand effects. The semantics are as follows:
-
multiple access() calls: Since all obtained interface pointers are const there is no way to modify the database elements.
-
access() call after edit() calls: The interface pointer returned from access() reflects the changes as they are done via the interface pointer returned from the last edit() call.
-
edit() call after access() calls: The changes done via the interface pointer returned from edit() are not observable through any interface pointer returned from the access() calls.
-
multiple edit() calls: The changes done via the individual interface pointers are not observable through the other interface pointers, except for the changes done via the interface pointer obtained first at the time the second interface pointer is obtained. The changes from the interface pointer from the last edit() call survive, independent of the order in which the pointers are released.
- Note that these semantics do not only apply to access() and edit() calls. They also apply to other API methods that access other database elements, e.g., mi::IRef::get_reference(), which internally calls access().
- Concurrent transactions
If the same database element is edited in multiple overlapping transactions, the changes from the transaction created last survive, independent of the order in which the transactions are committed.
template<class T>
T * mi::neuraylib::ITransaction::create |
( |
| ) |
|
|
inline |
Creates an object of the type T
.
Objects created with this method are typically Types and Scene elements. Note that most types can also be created via the API component mi::neuraylib::IFactory which does not require the context of a transaction.
This method can not be used to create MDL modules, definitions, or function calls. To create instances of mi::neuraylib::IFunction_call, use the method mi::neuraylib::IFunction_definition::create_function_call().
The created object will be initialized in a manner dependent upon the passed type name. Each class has its own policy on initialization. So, one should not make any assumptions on the values of the various class members.
Note that there are two versions of this templated member function, one that takes no arguments, and another one that takes one or three arguments (the type name, and two optional arguments passed to the constructor or factory). The version with no arguments can only be used to create a subset of supported types derived from mi::IData: it supports only those types where the type name can be deduced from the template parameter, i.e., it does not support arrays, structures, maps, and pointers. The version with one or three arguments can be used to create any type (but requires the type name as parameter, which is redundant for many types). Attempts to use the version with no arguments with a template parameter where the type name can not be deduced results in compiler errors.
This templated member function is a wrapper of the non-template variant for the user's convenience. It eliminates the need to call mi::base::IInterface::get_interface(const Uuid&) on the returned pointer, since the return type already is a pointer to the type T
specified as template parameter.
- Template Parameters
-
T | The interface type of the class to create. |
- Returns
- A pointer to the created object.
template<class T>
T * mi::neuraylib::ITransaction::create |
( |
const char * |
type_name, |
|
|
Uint32 |
argc = 0 , |
|
|
const base::IInterface * |
argv[] = 0 |
|
) |
| |
|
inline |
Creates an object of the type type_name
.
Objects created with this method are typically Types and Scene elements. Note that most types can also be created via the API component mi::neuraylib::IFactory which does not require the context of a transaction.
This method can not be used to create MDL modules, definitions, or function calls. To create instances of mi::neuraylib::IFunction_call, use the method mi::neuraylib::IFunction_definition::create_function_call().
The created object will be initialized in a manner dependent upon the passed type name. Each class has its own policy on initialization. So, one should not make any assumptions on the values of the various class members.
Note that there are two versions of this templated member function, one that takes no arguments, and another one that takes one or three arguments (the type name, and two optional arguments passed to the constructor or factory). The version with no arguments can only be used to create a subset of supported types derived from mi::IData: it supports only those types where the type name can be deduced from the template parameter, i.e., it does not support arrays, structures, maps, and pointers. The version with one or three arguments can be used to create any type (but requires the type name as parameter, which is redundant for many types). Attempts to use the version with no arguments with a template parameter where the type name can not be deduced results in compiler errors.
This templated member function is a wrapper of the non-template variant for the user's convenience. It eliminates the need to call mi::base::IInterface::get_interface(const Uuid&) on the returned pointer, since the return type already is a pointer to the type T
specified as template parameter.
- Parameters
-
type_name | The type name of the object to create. See Types for possible type names. In addition, Scene elements can be created by passing the name of the requested interfaces without namespace qualifiers and the leading "I" , e.g., "Image" for mi::neuraylib::IImage. Note that you can not create instances of mi::neuraylib::IAttribute_set or mi::neuraylib::IScene_element, only instances of the derived interfaces. |
argc | The number of elements in argv . Passed to the constructor of factory of the object to create. |
argv | The array of arguments passed to the constructor. Passed to the constructor of factory of the object to create. |
- Template Parameters
-
T | The interface type of the class to create. |
- Returns
- A pointer to the created object, or
NULL
if type_name
is invalid (NULL
pointer), not a valid type name, or does not create an object of type T
.
Creates an object of the type type_name
.
Objects created with this method are typically Types and Scene elements. Note that most types can also be created via the API component mi::neuraylib::IFactory which does not require the context of a transaction.
This method can not be used to create MDL modules, definitions, or function calls. To create instances of mi::neuraylib::IFunction_call, use the method mi::neuraylib::IFunction_definition::create_function_call().
The created object will be initialized in a manner dependent upon the passed type name. Each class has its own policy on initialization. So, one should not make any assumptions on the values of the various class members.
- Parameters
-
type_name | The type name of the object to create. See Types for possible type names. In addition, Scene elements can be created by passing the name of the requested interfaces without namespace qualifiers and the leading "I" , e.g., "Image" for mi::neuraylib::IImage. Note that you can not create instances of mi::neuraylib::IAttribute_set or mi::neuraylib::IScene_element, only instances of the derived interfaces. |
argc | The number of elements in argv . Passed to the constructor of factory of the object to create. |
argv | The array of arguments passed to the constructor. Passed to the constructor of factory of the object to create. |
- Returns
- A pointer to the created object, or
NULL
if type_name
is invalid (NULL
pointer) or not a valid type name.
virtual IArray * mi::neuraylib::ITransaction::list_elements |
( |
const char * |
root_element, |
|
|
const char * |
name_pattern = 0 , |
|
|
const IArray * |
type_names = 0 |
|
) |
| const |
|
pure virtual |
Returns scene elements of a subgraph originating at a given scene element.
The method iterates over all elements of a subgraph originating at the given scene element and returns their names. Optionally, the results can be filtered by a regular expression for the element names and a list for type names.
Note that the runtime of the method depends on the number of elements in the subgraph. It might be expensive to call this method for large subgraphs.
The returned scene elements are in such an order that all elements referenced by a given element are listed before that element ("before" in the sense of "using smaller array
indices").
- Parameters
-
root_element | The root of the subgraph to traverse. |
name_pattern | An extended regular expression that acts as filter on the names of returned scene elements (see [OGBS7]). The regular expression is matched to any part of the scene element name, not just to the entire scene element name. The value NULL is handled as ".*" . |
type_names | A list of type names that acts as filter on the names of returned scene elements. Only scene elements with a matching type name pass the filter. The value NULL lets all scene elements pass the filter irrespective of their type name. |
- Returns
- A list of name of scene elements in the subgraph matching the given regular expression and type name filter, or
NULL
in case of an invalid root element name or an invalid regular expression.
virtual Sint32 mi::neuraylib::ITransaction::remove |
( |
const char * |
name, |
|
|
bool |
only_localized = false |
|
) |
| |
|
pure virtual |
Marks the element with the name name
for removal from the database.
- Global removals
The purpose of global removals is to mark all versions of a database element for garbage collection. Such a marker has no effect while the element is still referenced (in any scope) by other elements or while the transaction where the removal request was made is still open. When these conditions do no longer apply, the element becomes eligible for garbage collection and must no longer be used in any way. There is no guarantee when the garbage collection will actually remove the element.
This implies that a remove() call might actually remove an element that was stored later under the same name. This can potentially lead to invalid tag accesses. Those cases can be avoided by using mi::neuraylib::IDatabase::garbage_collection() after a transaction was committed and before starting the next one to force garbage collection of all possible elements.
- Local removals
The purpose of local removals is to undo the effects of an earlier localization via mi::neuraylib::ITransaction::copy(). A local removal request requires that the element exists in the scope of the transaction, and at least one more version of that element exists in one of the parent scopes. The effect of a local removal request is to immediately hide the version the scope of the transaction (the local copy), and to make the next version in one of the parent scopes accessible from the very same transaction. The hidden local copy will be lazily removed by the garbage collection of the DB. There is no guarantee when this will happen.
- Parameters
-
name | The name of the element in the database to mark for removal. |
only_localized | false for global removals (the default) or true for local removals. The flag is ignored in favor of global removals if the transaction belongs to the global scope. |
- Returns
- - 0: Success (including subsequent global removals on elements already marked for global removal).
- -1: For global removals: there is no DB element named
name
visible in this transaction. For local removals: there is no DB element named name
in the scope of this transaction or there is no version of that DB element in one of the parent scopes.
- -2: Invalid parameters (
NULL
pointer).
- -3: The transaction is not open.