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;