1+ CREATE OR REPLACE FUNCTION "storage "." objects_update_level_trigger" ()
2+ RETURNS trigger
3+ AS $func$
4+ BEGIN
5+ -- Ensure this is an update operation and the name has changed
6+ IF TG_OP = ' UPDATE' AND (NEW." name" <> OLD." name" OR NEW." bucket_id" <> OLD." bucket_id" ) THEN
7+ -- Set the new level
8+ NEW." level" := " storage" ." get_level" (NEW." name" );
9+ END IF;
10+ RETURN NEW;
11+ END;
12+ $func$ LANGUAGE plpgsql VOLATILE;
13+
14+ CREATE OR REPLACE TRIGGER "objects_update_level_trigger "
15+ BEFORE UPDATE ON " storage" ." objects"
16+ FOR EACH ROW
17+ WHEN (NEW .name != OLD .name OR NEW .bucket_id != OLD .bucket_id )
18+ EXECUTE FUNCTION " storage" ." objects_update_level_trigger" ();
19+
20+
21+ CREATE OR REPLACE FUNCTION storage .delete_leaf_prefixes(bucket_ids text [], names text [])
22+ RETURNS void
23+ LANGUAGE plpgsql
24+ SECURITY DEFINER
25+ AS $$
26+ DECLARE
27+ v_rows_deleted integer ;
28+ BEGIN
29+ LOOP
30+ WITH candidates AS (
31+ SELECT DISTINCT
32+ t .bucket_id ,
33+ unnest(storage .get_prefixes (t .name )) AS name
34+ FROM unnest(bucket_ids, names) AS t(bucket_id, name)
35+ ),
36+ uniq AS (
37+ SELECT
38+ bucket_id,
39+ name,
40+ storage .get_level (name) AS level
41+ FROM candidates
42+ WHERE name <> ' '
43+ GROUP BY bucket_id, name
44+ ),
45+ leaf AS (
46+ SELECT
47+ p .bucket_id ,
48+ p .name ,
49+ p .level
50+ FROM storage .prefixes AS p
51+ JOIN uniq AS u
52+ ON u .bucket_id = p .bucket_id
53+ AND u .name = p .name
54+ AND u .level = p .level
55+ WHERE NOT EXISTS (
56+ SELECT 1
57+ FROM storage .objects AS o
58+ WHERE o .bucket_id = p .bucket_id
59+ AND o .level = p .level + 1
60+ AND o .name COLLATE " C" LIKE p .name || ' /%'
61+ )
62+ AND NOT EXISTS (
63+ SELECT 1
64+ FROM storage .prefixes AS c
65+ WHERE c .bucket_id = p .bucket_id
66+ AND c .level = p .level + 1
67+ AND c .name COLLATE " C" LIKE p .name || ' /%'
68+ )
69+ )
70+ DELETE
71+ FROM storage .prefixes AS p
72+ USING leaf AS l
73+ WHERE p .bucket_id = l .bucket_id
74+ AND p .name = l .name
75+ AND p .level = l .level ;
76+
77+ GET DIAGNOSTICS v_rows_deleted = ROW_COUNT;
78+ EXIT WHEN v_rows_deleted = 0 ;
79+ END LOOP;
80+ END;
81+ $$;
0 commit comments