Jordan Savant # Software Engineer

DROP PROCEDURE IF EXISTS `procedure_foo`;
DELIMITER $$
CREATE PROCEDURE `procedure_foo`()
BEGIN

    DECLARE done INTEGER DEFAULT FALSE;
    DECLARE token_id, membership_id, membership_domain_id, type_id INTEGER;
    DECLARE membership_name VARCHAR(60);
    DECLARE cur CURSOR FOR SELECT `id`, `name`, `domain_id` FROM `sf_membership`;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SELECT id INTO type_id FROM `acme_token_type` WHERE `name` = 'in_membership' LIMIT 1;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO membership_id, membership_name, membership_domain_id;
        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Double Insert Protection.
        SELECT COUNT(id) INTO token_id FROM `acme_token_entry` WHERE `token` IN
            (CONCAT('in_membership_', membership_id, '_active'), CONCAT('in_membership_', membership_id, '_pending'), CONCAT('in_membership_', membership_id, '_rejected')) LIMIT 1;
        IF token_id > 0 THEN
            ITERATE read_loop;
        END IF;

        -- Insert tokens:
        INSERT INTO `acme_token_entry` (`type_id`, `domain_id`, `is_system`, `token`, `label`, `access_level`) VALUES
            (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_active'), CONCAT('Active In Membership ', membership_name), 0),
            (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_pending'), CONCAT('Pending In Membership ', membership_name), 0),
            (type_id, membership_domain_id, 0, CONCAT('in_membership_', membership_id, '_rejected'), CONCAT('Rejected In Membership ', membership_name), 0);
    END LOOP;

    CLOSE cur;

END
$$
delimiter ;
CALL procedure_foo();
DROP PROCEDURE procedure_foo;