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;