43 lines
1.8 KiB
PL/PgSQL
43 lines
1.8 KiB
PL/PgSQL
|
|
|
|
CREATE OR REPLACE FUNCTION storage.list_objects_with_delimiter(bucket_id text, prefix_param text, delimiter_param text, max_keys integer default 100, start_after text DEFAULT '', next_token text DEFAULT '')
|
|
RETURNS TABLE (name text, id uuid, metadata jsonb, updated_at timestamptz) AS
|
|
$$
|
|
BEGIN
|
|
RETURN QUERY EXECUTE
|
|
'SELECT DISTINCT ON(name COLLATE "C") * from (
|
|
SELECT
|
|
CASE
|
|
WHEN position($2 IN substring(name from length($1) + 1)) > 0 THEN
|
|
substring(name from 1 for length($1) + position($2 IN substring(name from length($1) + 1)))
|
|
ELSE
|
|
name
|
|
END AS name, id, metadata, updated_at
|
|
FROM
|
|
storage.objects
|
|
WHERE
|
|
bucket_id = $5 AND
|
|
name ILIKE $1 || ''%'' AND
|
|
CASE
|
|
WHEN $6 != '''' THEN
|
|
name COLLATE "C" > $6
|
|
ELSE true END
|
|
AND CASE
|
|
WHEN $4 != '''' THEN
|
|
CASE
|
|
WHEN position($2 IN substring(name from length($1) + 1)) > 0 THEN
|
|
substring(name from 1 for length($1) + position($2 IN substring(name from length($1) + 1))) COLLATE "C" > $4
|
|
ELSE
|
|
name COLLATE "C" > $4
|
|
END
|
|
ELSE
|
|
true
|
|
END
|
|
ORDER BY
|
|
name COLLATE "C" ASC) as e order by name COLLATE "C" LIMIT $3'
|
|
USING prefix_param, delimiter_param, max_keys, next_token, bucket_id, start_after;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_objects_bucket_id_name
|
|
ON storage.objects (bucket_id, (name COLLATE "C")); |