*************************** 1. row *************************** TRIGGER_CATALOG: NULL TRIGGER_SCHEMA: racktables_db TRIGGER_NAME: EntityLink-before-insert EVENT_MANIPULATION: INSERT EVENT_OBJECT_CATALOG: NULL EVENT_OBJECT_SCHEMA: racktables_db EVENT_OBJECT_TABLE: EntityLink ACTION_ORDER: 0 ACTION_CONDITION: NULL ACTION_STATEMENT: EntityLinkTrigger:BEGIN DECLARE parent_objtype, child_objtype, count INTEGER; # forbid linking an entity to itself IF NEW.parent_entity_type = NEW.child_entity_type AND NEW.parent_entity_id = NEW.child_entity_id THEN SET NEW.parent_entity_id = NULL; LEAVE EntityLinkTrigger; END IF; # in some scenarios, only one parent is allowed CASE CONCAT(NEW.parent_entity_type, '.', NEW.child_entity_type) WHEN 'location.location' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'location' AND child_entity_type = 'location' AND child_entity_id = NEW.child_entity_id; WHEN 'location.row' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'location' AND child_entity_type = 'row' AND child_entity_id = NEW.child_entity_id; WHEN 'row.rack' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'row' AND child_entity_type = 'rack' AND child_entity_id = NEW.child_entity_id; ELSE # some other scenario, assume it is valid SET count = 0; END CASE; IF count > 0 THEN SET NEW.parent_entity_id = NULL; LEAVE EntityLinkTrigger; END IF; IF NEW.parent_entity_type = 'object' AND NEW.child_entity_type = 'object' THEN # lock objects to prevent concurrent link establishment SELECT objtype_id INTO parent_objtype FROM Object WHERE id = NEW.parent_entity_id FOR UPDATE; SELECT objtype_id INTO child_objtype FROM Object WHERE id = NEW.child_entity_id FOR UPDATE; # only permit the link if object types are compatibile SELECT COUNT(*) INTO count FROM ObjectParentCompat WHERE parent_objtype_id = parent_objtype AND child_objtype_id = child_objtype; IF count = 0 THEN SET NEW.parent_entity_id = NULL; END IF; END IF; END ACTION_ORIENTATION: ROW ACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: OLD ACTION_REFERENCE_NEW_ROW: NEW CREATED: NULL SQL_MODE: DEFINER: racktables_user@192.168.18.17 *************************** 2. row *************************** TRIGGER_CATALOG: NULL TRIGGER_SCHEMA: racktables_db TRIGGER_NAME: EntityLink-before-update EVENT_MANIPULATION: UPDATE EVENT_OBJECT_CATALOG: NULL EVENT_OBJECT_SCHEMA: racktables_db EVENT_OBJECT_TABLE: EntityLink ACTION_ORDER: 0 ACTION_CONDITION: NULL ACTION_STATEMENT: EntityLinkTrigger:BEGIN DECLARE parent_objtype, child_objtype, count INTEGER; # forbid linking an entity to itself IF NEW.parent_entity_type = NEW.child_entity_type AND NEW.parent_entity_id = NEW.child_entity_id THEN SET NEW.parent_entity_id = NULL; LEAVE EntityLinkTrigger; END IF; # in some scenarios, only one parent is allowed CASE CONCAT(NEW.parent_entity_type, '.', NEW.child_entity_type) WHEN 'location.location' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'location' AND child_entity_type = 'location' AND child_entity_id = NEW.child_entity_id AND id != NEW.id; WHEN 'location.row' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'location' AND child_entity_type = 'row' AND child_entity_id = NEW.child_entity_id AND id != NEW.id; WHEN 'row.rack' THEN SELECT COUNT(*) INTO count FROM EntityLink WHERE parent_entity_type = 'row' AND child_entity_type = 'rack' AND child_entity_id = NEW.child_entity_id AND id != NEW.id; ELSE # some other scenario, assume it is valid SET count = 0; END CASE; IF count > 0 THEN SET NEW.parent_entity_id = NULL; LEAVE EntityLinkTrigger; END IF; IF NEW.parent_entity_type = 'object' AND NEW.child_entity_type = 'object' THEN # lock objects to prevent concurrent link establishment SELECT objtype_id INTO parent_objtype FROM Object WHERE id = NEW.parent_entity_id FOR UPDATE; SELECT objtype_id INTO child_objtype FROM Object WHERE id = NEW.child_entity_id FOR UPDATE; # only permit the link if object types are compatibile SELECT COUNT(*) INTO count FROM ObjectParentCompat WHERE parent_objtype_id = parent_objtype AND child_objtype_id = child_objtype; IF count = 0 THEN SET NEW.parent_entity_id = NULL; END IF; END IF; END ACTION_ORIENTATION: ROW ACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: OLD ACTION_REFERENCE_NEW_ROW: NEW CREATED: NULL SQL_MODE: DEFINER: racktables_user@192.168.18.17 *************************** 3. row *************************** TRIGGER_CATALOG: NULL TRIGGER_SCHEMA: racktables_db TRIGGER_NAME: Link-before-insert EVENT_MANIPULATION: INSERT EVENT_OBJECT_CATALOG: NULL EVENT_OBJECT_SCHEMA: racktables_db EVENT_OBJECT_TABLE: Link ACTION_ORDER: 0 ACTION_CONDITION: NULL ACTION_STATEMENT: LinkTrigger:BEGIN DECLARE tmp, porta_type, portb_type, count INTEGER; IF NEW.porta = NEW.portb THEN # forbid connecting a port to itself SET NEW.porta = NULL; LEAVE LinkTrigger; ELSEIF NEW.porta > NEW.portb THEN # force porta < portb SET tmp = NEW.porta; SET NEW.porta = NEW.portb; SET NEW.portb = tmp; END IF; # lock ports to prevent concurrent link establishment SELECT type INTO porta_type FROM Port WHERE id = NEW.porta FOR UPDATE; SELECT type INTO portb_type FROM Port WHERE id = NEW.portb FOR UPDATE; # only permit the link if ports are compatibile SELECT COUNT(*) INTO count FROM PortCompat WHERE (type1 = porta_type AND type2 = portb_type) OR (type1 = portb_type AND type2 = porta_type); IF count = 0 THEN SET NEW.porta = NULL; END IF; END ACTION_ORIENTATION: ROW ACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: OLD ACTION_REFERENCE_NEW_ROW: NEW CREATED: NULL SQL_MODE: DEFINER: racktables_user@192.168.18.17 *************************** 4. row *************************** TRIGGER_CATALOG: NULL TRIGGER_SCHEMA: racktables_db TRIGGER_NAME: Link-before-update EVENT_MANIPULATION: UPDATE EVENT_OBJECT_CATALOG: NULL EVENT_OBJECT_SCHEMA: racktables_db EVENT_OBJECT_TABLE: Link ACTION_ORDER: 0 ACTION_CONDITION: NULL ACTION_STATEMENT: LinkTrigger:BEGIN DECLARE tmp, porta_type, portb_type, count INTEGER; IF NEW.porta = NEW.portb THEN # forbid connecting a port to itself SET NEW.porta = NULL; LEAVE LinkTrigger; ELSEIF NEW.porta > NEW.portb THEN # force porta < portb SET tmp = NEW.porta; SET NEW.porta = NEW.portb; SET NEW.portb = tmp; END IF; # lock ports to prevent concurrent link establishment SELECT type INTO porta_type FROM Port WHERE id = NEW.porta FOR UPDATE; SELECT type INTO portb_type FROM Port WHERE id = NEW.portb FOR UPDATE; # only permit the link if ports are compatibile SELECT COUNT(*) INTO count FROM PortCompat WHERE (type1 = porta_type AND type2 = portb_type) OR (type1 = portb_type AND type2 = porta_type); IF count = 0 THEN SET NEW.porta = NULL; END IF; END ACTION_ORIENTATION: ROW ACTION_TIMING: BEFORE ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: OLD ACTION_REFERENCE_NEW_ROW: NEW CREATED: NULL SQL_MODE: DEFINER: racktables_user@192.168.18.17 4 rows in set, 1 warning (0.04 sec)