mirror of
https://github.com/penpot/penpot.git
synced 2026-03-19 08:53:39 +00:00
The main objective is prevent deletion of objects that can leave unreachable orphan objects which we are unable to correctly track. Additionally, this commit includes: 1. Properly implement safe cascade deletion of all participating tables on soft deletion in the objects-gc task; 2. Make the file thumbnail related tables also participate in the touch/refcount mechanism applyign to the same safety checks; 3. Add helper for db query lazy iteration using PostgreSQL support for server side cursors; 4. Fix efficiency issues on gc related task using server side cursors instead of custom chunked iteration for processing data. The problem resided when a large chunk of rows that has identical value on the deleted_at column and the chunk size is small (the default); when the custom chunked iteration only reads a first N items and skip the rest of the set to the next run. This has caused many objects to remain pending to be eliminated, taking up space for longer than expected. The server side cursor based iteration does not has this problem and iterates correctly over all objects. 5. Fix refcount issues on font variant deletion RPC methods
28 lines
1.2 KiB
SQL
28 lines
1.2 KiB
SQL
--- Fix legacy naming
|
|
ALTER INDEX media_object_pkey RENAME TO file_media_object_pkey;
|
|
ALTER INDEX media_object__file_id__idx RENAME TO file_media_object__file_id__idx;
|
|
|
|
--- Create index for the deleted_at column
|
|
CREATE INDEX IF NOT EXISTS file_media_object__deleted_at__idx
|
|
ON file_media_object (deleted_at, id, media_id)
|
|
WHERE deleted_at IS NOT NULL;
|
|
|
|
--- Drop now unnecesary trigger because this will be handled by the
|
|
--- application code
|
|
DROP TRIGGER file_media_object__on_delete__tgr ON file_media_object;
|
|
DROP FUNCTION on_delete_file_media_object ( ) CASCADE;
|
|
DROP TRIGGER file_media_object__on_insert__tgr ON file_media_object;
|
|
DROP FUNCTION on_media_object_insert () CASCADE;
|
|
|
|
--- Remove CASCADE from file FOREIGN KEY
|
|
ALTER TABLE file_media_object
|
|
DROP CONSTRAINT file_media_object_file_id_fkey,
|
|
ADD FOREIGN KEY (file_id) REFERENCES file(id) DEFERRABLE;
|
|
|
|
--- Add deletion protection
|
|
CREATE OR REPLACE TRIGGER deletion_protection__tgr
|
|
BEFORE DELETE ON file_media_object FOR EACH STATEMENT
|
|
WHEN ((current_setting('rules.deletion_protection', true) IN ('on', '')) OR
|
|
(current_setting('rules.deletion_protection', true) IS NULL))
|
|
EXECUTE PROCEDURE raise_deletion_protection();
|