CREATE OR REPLACE FUNCTION clearLogs
(
x_airlockName CHARACTER VARYING,
x_stopDateTime TIMESTAMP
)
RETURNS BOOLEAN AS $$
DECLARE
listEventsID int4[] := '{}';
listEventsGroupsID int4[] := '{}';
eventID log_events.le_id%TYPE;
eventsGroupID log_events.le_leg_id%TYPE;
BEGIN
-- delete images associated to the events to delete
DELETE FROM log_images
WHERE li_le_id IN (
SELECT le_id
FROM airlocks INNER JOIN log_events ON a_id = le_a_id
LEFT OUTER JOIN log_events_groups ON le_leg_id = leg_id
WHERE le_datetime < x_stopDateTime
AND a_name = x_airlockName
AND le_do_not_delete = false
AND (le_leg_id IS NULL
-- we keep the group event if at least 1 event should not be deleted
-- or at least 1 event is too recent according to the stop date time
OR le_leg_id NOT IN (
SELECT DISTINCT le_leg_id FROM log_events
WHERE le_leg_id IS NOT NULL
AND (le_do_not_delete = true OR le_datetime >= x_stopDateTime)
)
)
);
-- then delete videos associated to the events to delete
DELETE FROM log_videos
WHERE lv_le_id IN (
SELECT le_id
FROM airlocks INNER JOIN log_events ON a_id = le_a_id
LEFT OUTER JOIN log_events_groups ON le_leg_id = leg_id
WHERE le_datetime < x_stopDateTime
AND a_name = x_airlockName
AND le_do_not_delete = false
AND (le_leg_id IS NULL
-- we keep the group event if at least 1 event should not be deleted
-- or at least 1 event is too recent according to the stop date time
OR le_leg_id NOT IN (
SELECT DISTINCT le_leg_id FROM log_events
WHERE le_leg_id IS NOT NULL
AND (le_do_not_delete = true OR le_datetime >= x_stopDateTime)
)
)
);
-- then delete the events
DELETE FROM log_events
WHERE le_id IN (
SELECT le_id
FROM airlocks INNER JOIN log_events ON a_id = le_a_id
LEFT OUTER JOIN log_events_groups ON le_leg_id = leg_id
WHERE le_datetime < x_stopDateTime
AND a_name = x_airlockName
AND le_do_not_delete = false
AND (le_leg_id IS NULL
-- we keep the group event if at least 1 event should not be deleted
-- or at least 1 event is too recent according to the stop date time
OR le_leg_id NOT IN (
SELECT DISTINCT le_leg_id FROM log_events
WHERE le_leg_id IS NOT NULL
AND (le_do_not_delete = true OR le_datetime >= x_stopDateTime)
)
)
);
-- finally delete the groups events
DELETE FROM log_events_groups
WHERE leg_id IN (
SELECT le_leg_id
FROM airlocks INNER JOIN log_events ON a_id = le_a_id
LEFT OUTER JOIN log_events_groups ON le_leg_id = leg_id
WHERE le_datetime < x_stopDateTime
AND a_name = x_airlockName
AND le_do_not_delete = false
AND (le_leg_id IS NULL
-- we keep the group event if at least 1 event should not be deleted
-- or at least 1 event is too recent according to the stop date time
OR le_leg_id NOT IN (
SELECT DISTINCT le_leg_id FROM log_events
WHERE le_leg_id IS NOT NULL
AND (le_do_not_delete = true OR le_datetime >= x_stopDateTime)
)
)
);
RETURN true;
END;
$$ LANGUAGE plpgsql;
Partager