Batch processing and error handling improvements

This commit is contained in:
Luke Vella 2024-12-22 11:48:34 +01:00
parent 71add4e905
commit 9850c76d4f
No known key found for this signature in database
GPG key ID: 469CAD687F0D784C

View file

@ -1,51 +1,98 @@
BEGIN;
-- Create guest users for participants without user_id and link them -- Create guest users for participants without user_id and link them
DO $$ DO $$
DECLARE DECLARE
participant_record RECORD; v_processed INTEGER := 0;
v_total_processed INTEGER := 0;
v_batch_size INTEGER := 1000;
BEGIN BEGIN
FOR participant_record IN RAISE NOTICE 'Starting participant migration...';
SELECT id, name, email
FROM participants -- Process participants in batches
WHERE user_id IS NULL
LOOP LOOP
WITH new_user AS ( WITH to_process AS (
SELECT id, name, email
FROM participants
WHERE user_id IS NULL
LIMIT v_batch_size
FOR UPDATE SKIP LOCKED
),
new_users AS (
INSERT INTO users (id, is_guest, created_at) INSERT INTO users (id, is_guest, created_at)
VALUES ( SELECT gen_random_uuid()::text, TRUE, NOW()
gen_random_uuid()::text, FROM to_process
TRUE,
NOW()
)
RETURNING id RETURNING id
) )
UPDATE participants UPDATE participants p
SET user_id = (SELECT id FROM new_user) SET user_id = u.id
WHERE id = participant_record.id; FROM (
SELECT id, ROW_NUMBER() OVER () as rn
FROM new_users
) u
WHERE p.id IN (
SELECT id FROM to_process
)
AND p.user_id IS NULL;
GET DIAGNOSTICS v_processed = ROW_COUNT;
v_total_processed := v_total_processed + v_processed;
EXIT WHEN v_processed = 0;
RAISE NOTICE 'Processed % participants (total: %)', v_processed, v_total_processed;
END LOOP; END LOOP;
RAISE NOTICE 'Completed participant migration. Total processed: %', v_total_processed;
END; END;
$$; $$;
-- Create guest users for comments without user_id and link them -- Create guest users for comments without user_id and link them
DO $$ DO $$
DECLARE DECLARE
comment_record RECORD; v_processed INTEGER := 0;
v_total_processed INTEGER := 0;
v_batch_size INTEGER := 1000;
BEGIN BEGIN
FOR comment_record IN RAISE NOTICE 'Starting comment migration...';
SELECT id, author_name
FROM comments -- Process comments in batches
WHERE user_id IS NULL
LOOP LOOP
WITH new_user AS ( WITH to_process AS (
SELECT id, author_name
FROM comments
WHERE user_id IS NULL
LIMIT v_batch_size
FOR UPDATE SKIP LOCKED
),
new_users AS (
INSERT INTO users (id, is_guest, created_at) INSERT INTO users (id, is_guest, created_at)
VALUES ( SELECT gen_random_uuid()::text, TRUE, NOW()
gen_random_uuid()::text, FROM to_process
TRUE,
NOW()
)
RETURNING id RETURNING id
) )
UPDATE comments UPDATE comments c
SET user_id = (SELECT id FROM new_user) SET user_id = u.id
WHERE id = comment_record.id; FROM (
SELECT id, ROW_NUMBER() OVER () as rn
FROM new_users
) u
WHERE c.id IN (
SELECT id FROM to_process
)
AND c.user_id IS NULL;
GET DIAGNOSTICS v_processed = ROW_COUNT;
v_total_processed := v_total_processed + v_processed;
EXIT WHEN v_processed = 0;
RAISE NOTICE 'Processed % comments (total: %)', v_processed, v_total_processed;
END LOOP; END LOOP;
RAISE NOTICE 'Completed comment migration. Total processed: %', v_total_processed;
EXCEPTION WHEN OTHERS THEN
RAISE WARNING 'Error during comment migration: %', SQLERRM;
RAISE;
END; END;
$$; $$;
COMMIT;