54 lines
2.0 KiB
SQL
54 lines
2.0 KiB
SQL
-- postgres-migrations disable-transaction
|
|
-- Backfill prefixes table records
|
|
-- We run this with 50k batch size to avoid long running transaction
|
|
DO $$
|
|
DECLARE
|
|
batch_size INTEGER := 50000;
|
|
total_scanned INTEGER := 0;
|
|
row_returned INTEGER := 0;
|
|
last_name TEXT COLLATE "C" := NULL;
|
|
last_bucket_id TEXT COLLATE "C" := NULL;
|
|
BEGIN
|
|
LOOP
|
|
-- Fetch a batch of objects ordered by name COLLATE "C"
|
|
WITH batch as (
|
|
SELECT id, bucket_id, name, owner
|
|
FROM storage.objects
|
|
WHERE (last_name IS NULL OR ((name COLLATE "C", bucket_id) > (last_name, last_bucket_id)))
|
|
ORDER BY name COLLATE "C", bucket_id
|
|
LIMIT batch_size
|
|
),
|
|
batch_count as (
|
|
SELECT COUNT(*) as count FROM batch
|
|
),
|
|
cursor as (
|
|
SELECT name as last_name, bucket_id as last_bucket FROM batch b
|
|
ORDER BY name COLLATE "C" DESC, bucket_id DESC LIMIT 1
|
|
),
|
|
all_prefixes as (
|
|
SELECT UNNEST(storage.get_prefixes(name)) as prefix, bucket_id
|
|
FROM batch
|
|
),
|
|
insert_prefixes as (
|
|
INSERT INTO storage.prefixes (bucket_id, name)
|
|
SELECT bucket_id, prefix FROM all_prefixes
|
|
WHERE coalesce(prefix, '') != ''
|
|
ON CONFLICT DO NOTHING
|
|
)
|
|
SELECT count, cursor.last_name, cursor.last_bucket FROM cursor, batch_count INTO row_returned, last_name, last_bucket_id;
|
|
|
|
RAISE NOTICE 'Object Row returned: %', row_returned;
|
|
RAISE NOTICE 'Last Object: %', last_name;
|
|
|
|
total_scanned := total_scanned + row_returned;
|
|
|
|
IF row_returned IS NULL OR row_returned < batch_size THEN
|
|
RAISE NOTICE 'Total Object scanned: %', coalesce(total_scanned, 0);
|
|
COMMIT;
|
|
EXIT;
|
|
ELSE
|
|
COMMIT;
|
|
END IF;
|
|
END LOOP;
|
|
END;
|
|
$$; |