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