/
TEX Specification
TEX Specification
EDM Trigger Schema specification version 0.1 2017-11-13
Reserved words:
- TRIGGER_SCHEMA
- TRIGGER_FUNCTION
SCHEMA MyExpressSchema; ENTITY MyEntity; attr1 : STRING; END_ENTITY; END_SCHEMA; TRIGGER_SCHEMA MyTriggerSchema FOR MyExpressSchema; DECLARE target_model INSTANCE OF MyExpressSchema; --------------------------------------------------------------------------- -- the system recognized events is proposed to define as INTEGER XPX pseudo constants -- then we can expand range of trigger events without enhancing grammar -- declaration can be assumed as something like: --------------------------------------------------------------------------- trigger_source = ENUMERATION OF( XPX_Create_Entity, -- raised after entity is created XPX_Delete_Entity, -- raised before an entity is deleted XPX_Read_Entity, -- any attribute is accessed XPX_Write_Entity, -- any attribute is modified XPX_Pre_Set_Attribute, -- raised before specified attribute is assigned (do we need PRE/POST?) XPX_Post_Set_Attribute, -- raised after specified attribute is assigned (do we need PRE/POST?) XPX_Pre_Unset_Attribute, -- raised before an attribute is set to UNSET XPX_Post_Unset_Attribute, -- raised after an attribute is set to UNSET XPX_Read_Attribute, -- any attribute is accessed XPX_Create_Model, -- raised after model is created XPX_Delete_Model, -- raised before model is deleted XPX_Read_Model, -- raised if any data in model accessed (pre) XPX_Write_Model, -- raised if any data in model written (pre) XPX_Commit_Write_Transaction, -- raised just before write transaction committed (what about tx levels?) XPX_Abort_Write_Transaction, -- raised just before write transaction aborted(what about tx levels?) ); --------------------------------------------------------------------------- -- An event is handeled as a system entity ala XPXEXCEPTION --------------------------------------------------------------------------- ENTITY XPXEVENT; xpxEventType : INTEGER; xpxEventTarget : GENERIC_ENTITY; xpxEventTime : _DATETIME; xpxEventSource : GENERIC_ENTITY; -- the schema/function active when event was raised xpxEventUser : GENERIC_ENTITY; -- user logged in when event was raised <... more ...> END_ENTITY; --------------------------------------------------------------------------- -- we use the DECLARE keyword to connect events to handlers -- Pattern: DECLARE trigger_function TRIGGER_FUNCTION(trigger_source) FOR (target); --------------------------------------------------------------------------- DECLARE EntityTrigger TRIGGER_FUNCTION(XPX_Create_Entity) FOR MyEntity; DECLARE AttributeTrigger TRIGGER_FUNCTION(XPX_Pre_SetAttribute) FOR MyEntity.MyAttribute; DECLARE ModelTrigger TRIGGER_FUNCTION(XPX_Create_Model) FOR target_model; TRIGGER_FUNCTION EntityTrigger(theEntity: GENERIC_ENTITY) : GENERIC; RETURN(?); END_TRIGGER_FUNCTION; TRIGGER_FUNCTION AttributeTrigger(theEntity: GENERIC_ENTITY) : GENERIC; -- look in DECLARE TRIGGER declarartion to identify attribute RETURN(?); END_TRIGGER_FUNCTION; TRIGGER_FUNCTION ModelTrigger(theModel: GENERIC_ENTITY) : GENERIC; -- theModel will refer to SDAI_MODEL instance RETURN(?); END_TRIGGER_FUNCTION; --------------------------------------------------------------------------- -- so for possibility to user defined events -- firstly the events need to be enumerated somehow. Not trivial as they are cross-schema and cross-model -- could be kept in a trigger schema, meaning both raise and catch must be done within that schema. -- anyway, if identified as integer constants we may declare them as such: --------------------------------------------------------------------------- CONSTANT somethingCreatedEvent : INTEGER := 1001; somethingDeletedEvent : INTEGER := 1002; END_CONSTANT; -- to raise events - easy way out is to use same technique as for XPX exception: PROCEDURE ThrowAnEvent(arg : GENERIC); xpxRaiseEvent(eventType,eventTarget,.....); EBD_PROCEDURE; -- to catch events is like catching trigger events, so we use same declaration -- Pattern: DECLARE eventHandler TRIGGER(eventType) FOR target; -- target is a model I think... DECLARE EventHandler TRIGGER_FUNCTION(somethingCreatedEvent) FOR target_model; DECLARE EventHandler TRIGGER_FUNCTION(somethingDeletedEvent) FOR target_model; TRIGGER_FUNCTION EventHandler(event : GENERIC_ENTITY) : GENERIC; LOCAL myEventType : INTEGER; END_LOCAL; myEventType := event.XPXEventType; RETURN(?); END_TRIGGER_FUNCTION; END_TRIGGER_SCHEMA;
Some alternates:
Proposed: DECLARE EventHandler TRIGGER_FUNCTION(somethingCreatedEvent) FOR target_model; Alt: DECLARE EventHandler(somethingDeletedEvent) TRIGGER_FUNCTION FOR target_model; DECLARE TRIGGER_FUNCTION EventHandler(somethingCreatedEvent) FOR target_model;
, multiple selections available,
Related content
TEX Predefined Events
TEX Predefined Events
More like this
EDM Trigger Schema
EDM Trigger Schema
More like this
xpxDefineTemporaryVariables
xpxDefineTemporaryVariables
More like this
Identifiers Reference Scope - Extended Reference
Identifiers Reference Scope - Extended Reference
More like this
Executable Statements
Executable Statements
More like this
xpxDefineTemporaryVariablesEx
xpxDefineTemporaryVariablesEx
More like this