Advertisement
Guest User

merge users from staging

a guest
Apr 8th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. BEGIN;
  3.  
  4. CREATE OR REPLACE FUNCTION staged_patron_update () RETURNS INT AS $func$
  5. DECLARE
  6.  
  7.     live_user   actor.usr%ROWTYPE;
  8.     live_card   actor.card%ROWTYPE;
  9.     live_maddr  actor.usr_address%ROWTYPE;
  10.     live_baddr  actor.usr_address%ROWTYPE;
  11.     live_statcat    actor.stat_cat%ROWTYPE;
  12.     live_statcat_entry  actor.stat_cat_entry_usr_map%ROWTYPE;
  13.  
  14.     staged_user staging.user_stage%ROWTYPE;
  15.     staged_card staging.card_stage%ROWTYPE;
  16.     staged_maddr    staging.mailing_address_stage%ROWTYPE;
  17.     staged_baddr    staging.billing_address_stage%ROWTYPE;
  18.     staged_statcat  staging.statcat_stage%ROWTYPE;
  19.  
  20.     tmp_dob     TEXT;
  21.  
  22.     update_count    int := 0;
  23. BEGIN
  24.  
  25.     FOR staged_user IN SELECT * FROM staging.user_stage WHERE complete IS FALSE ORDER BY row_id LOOP
  26.  
  27.         tmp_dob := staged_user.dob;
  28.         IF tmp_dob ~ E'^\\s+$' THEN
  29.             RAISE NOTICE 'User % has no DOB', staged_user.usrname;
  30.             tmp_dob = NULL;
  31.         END IF;
  32.  
  33.         PERFORM 1 FROM actor.usr WHERE usrname = staged_user.usrname;
  34.  
  35.         IF NOT FOUND THEN
  36.             RAISE NOTICE 'Adding user %', staged_user.usrname;
  37.             INSERT INTO actor.usr (usrname,profile,email,passwd,ident_type,first_given_name,family_name,day_phone,evening_phone,home_ou,dob)
  38.                 SELECT  usrname,profile,email,passwd,ident_type,first_given_name,family_name,day_phone,evening_phone,home_ou,tmp_dob::DATE
  39.                   FROM  staging.user_stage
  40.                   WHERE row_id = staged_user.row_id;
  41.         ELSE
  42.             RAISE NOTICE 'Updating user %', staged_user.usrname;
  43.             UPDATE  actor.usr
  44.               SET   profile = staged_user.profile,
  45.                 email = staged_user.email,
  46.                 passwd = staged_user.passwd,
  47.                 ident_type = staged_user.ident_type,
  48.                 first_given_name = staged_user.first_given_name,
  49.                 family_name = staged_user.family_name,
  50.                 day_phone = staged_user.day_phone,
  51.                 evening_phone = staged_user.evening_phone,
  52.                 home_ou = staged_user.home_ou,
  53.                 dob = tmp_dob::DATE
  54.               WHERE usrname = staged_user.usrname;
  55.         END IF;
  56.  
  57.         update_count = update_count + 1;
  58.  
  59.         UPDATE staging.user_stage SET complete = TRUE WHERE row_id = staged_user.row_id;
  60.  
  61.     END LOOP;
  62.  
  63.     FOR staged_card IN SELECT * FROM staging.card_stage WHERE complete IS FALSE ORDER BY row_id LOOP
  64.  
  65.         SELECT * INTO live_user FROM actor.usr WHERE usrname = staged_card.usrname;
  66.  
  67.         IF live_user.id IS NOT NULL THEN
  68.  
  69.             SELECT * INTO live_card FROM actor.card WHERE barcode = staged_card.barcode;
  70.  
  71.             IF live_card.id IS NULL THEN
  72.  
  73.                 IF live_user.id IS NOT NULL THEN
  74.                     RAISE NOTICE 'Inserting card % for user %', staged_card.barcode, staged_card.usrname;
  75.                     INSERT INTO actor.card (usr,barcode) VALUES (live_user.id, staged_card.barcode);
  76.  
  77.                     UPDATE actor.card SET active = FALSE WHERE usr = live_user.id AND barcode <> staged_card.barcode;
  78.  
  79.                     UPDATE  actor.usr
  80.                       SET   card = actor.card.id
  81.                       FROM  actor.card
  82.                       WHERE actor.usr.usrname = staged_user.usrname
  83.                         AND actor.card.usr = actor.usr.id
  84.                         AND actor.card.active IS TRUE;
  85.  
  86.                     update_count = update_count + 1;
  87.                 END IF;
  88.  
  89.             ELSE
  90.                 RAISE NOTICE 'Updating card % for user %', staged_card.barcode, staged_card.usrname;
  91.                 UPDATE actor.card SET usr = live_user.id WHERE id = live_card.id;
  92.                 UPDATE actor.usr SET card = live_card.id WHERE id = live_user.id;
  93.  
  94.                 UPDATE actor.card SET active = FALSE WHERE usr = live_user.id AND id <> live_card.id;
  95.  
  96.                 update_count = update_count + 1;
  97.             END IF;
  98.  
  99.             live_card.id = NULL;
  100.  
  101.         END IF;
  102.  
  103.         live_user.id = NULL;
  104.         UPDATE staging.card_stage SET complete = TRUE WHERE row_id = staged_card.row_id;
  105.  
  106.     END LOOP;
  107.  
  108.     FOR staged_maddr IN SELECT * FROM staging.mailing_address_stage WHERE complete IS FALSE ORDER BY row_id LOOP
  109.  
  110.         SELECT * INTO live_user FROM actor.usr WHERE usrname = staged_maddr.usrname;
  111.  
  112.         IF live_user.id IS NOT NULL THEN
  113.  
  114.             IF live_user.mailing_address IS NOT NULL THEN
  115.                 SELECT * INTO live_maddr FROM actor.usr_address WHERE id = live_user.mailing_address;
  116.             END IF;
  117.  
  118.             IF live_maddr.id IS NULL THEN
  119.                 RAISE NOTICE 'Inserting mailing address for user %', staged_maddr.usrname;
  120.                 INSERT INTO actor.usr_address (usr,street1,street2,city,state,country,post_code)
  121.                     VALUES (live_user.id,staged_maddr.street1,staged_maddr.street2,staged_maddr.city,staged_maddr.state,staged_maddr.country,staged_maddr.post_code);
  122.                 UPDATE actor.usr SET mailing_address = currval('actor.usr_address_id_seq') WHERE usrname = staged_maddr.usrname;
  123.             ELSE
  124.                 RAISE NOTICE 'Updating mailing address for user %', staged_maddr.usrname;
  125.                 UPDATE  actor.usr_address
  126.                   SET   street1 = staged_maddr.street1,
  127.                     street2 = staged_maddr.street2,
  128.                     city = staged_maddr.city,
  129.                     state = staged_maddr.state,
  130.                     country = staged_maddr.country,
  131.                     post_code = staged_maddr.post_code
  132.                   WHERE id = live_maddr.id;
  133.             END IF;
  134.  
  135.             live_maddr.id := NULL;
  136.  
  137.             update_count = update_count + 1;
  138.  
  139.         END IF;
  140.  
  141.         live_user.id = NULL;
  142.         UPDATE staging.mailing_address_stage SET complete = TRUE WHERE row_id = staged_maddr.row_id;
  143.  
  144.     END LOOP;
  145.  
  146.     FOR staged_baddr IN SELECT * FROM staging.billing_address_stage WHERE complete IS FALSE ORDER BY row_id LOOP
  147.  
  148.         SELECT * INTO live_user FROM actor.usr WHERE usrname = staged_baddr.usrname;
  149.  
  150.         IF live_user.id IS NOT NULL THEN
  151.  
  152.             IF live_user.billing_address IS NOT NULL THEN
  153.                 SELECT * INTO live_baddr FROM actor.usr_address WHERE id = live_user.billing_address;
  154.             END IF;
  155.  
  156.             IF live_baddr.id IS NULL THEN
  157.                 RAISE NOTICE 'Inserting billing address for user %', staged_baddr.usrname;
  158.                 INSERT INTO actor.usr_address (usr,street1,street2,city,state,country,post_code)
  159.                     VALUES (live_user.id,staged_baddr.street1,staged_baddr.street2,staged_baddr.city,staged_baddr.state,staged_baddr.country,staged_baddr.post_code);
  160.                 UPDATE actor.usr SET billing_address = currval('actor.usr_address_id_seq') WHERE usrname = staged_baddr.usrname;
  161.             ELSE
  162.                 RAISE NOTICE 'Updating billing address for user %', staged_baddr.usrname;
  163.                 UPDATE  actor.usr_address
  164.                   SET   street1 = staged_baddr.street1,
  165.                     street2 = staged_baddr.street2,
  166.                     city = staged_baddr.city,
  167.                     state = staged_baddr.state,
  168.                     country = staged_baddr.country,
  169.                     post_code = staged_baddr.post_code
  170.                   WHERE id = live_baddr.id;
  171.             END IF;
  172.  
  173.             live_baddr.id := NULL;
  174.  
  175.             update_count = update_count + 1;
  176.  
  177.         END IF;
  178.  
  179.         live_user.id = NULL;
  180.         UPDATE staging.billing_address_stage SET complete = TRUE WHERE row_id = staged_baddr.row_id;
  181.  
  182.     END LOOP;
  183.  
  184.     FOR staged_statcat IN SELECT * FROM staging.statcat_stage WHERE complete IS FALSE ORDER BY row_id LOOP
  185.  
  186.         SELECT * INTO live_user FROM actor.usr WHERE usrname = staged_statcat.usrname;
  187.  
  188.         IF live_user.id IS NOT NULL THEN
  189.  
  190.             SELECT * INTO live_statcat FROM actor.stat_cat WHERE name = staged_statcat.statcat and owner = live_user.home_ou;
  191.  
  192.             IF live_statcat_entry.id IS NOT NULL THEN
  193.  
  194.                 SELECT * INTO live_statcat_entry FROM actor.stat_cat_entry_usr_map WHERE stat_cat = live_statcat.id and target_usr = live_user.id;
  195.  
  196.                 IF live_statcat_entry.id IS NULL THEN
  197.                     RAISE NOTICE 'Inserting statcat %=>% for user %', staged_statcat.statcat, staged_statcat.value, staged_statcat.usrname;
  198.                     INSERT INTO actor.stat_cat_entry_usr_map (target_usr, stat_cat, stat_cat_entry)
  199.                         VALUES (live_user.id, live_statcat.id, staged_statcat.value);
  200.                 ELSE
  201.                     RAISE NOTICE 'Updating statcat %=>% for user %', staged_statcat.statcat, staged_statcat.value, staged_statcat.usrname;
  202.                     UPDATE  actor.stat_cat_entry_usr_map
  203.                       SET   stat_cat_entry = staged_statcat.value
  204.                       WHERE id = live_statcat_entry.id;
  205.                 END IF;
  206.  
  207.             END IF;
  208.  
  209.             live_statcat_entry.id := NULL;
  210.  
  211.             update_count = update_count + 1;
  212.  
  213.         END IF;
  214.  
  215.         live_user.id = NULL;
  216.         UPDATE staging.statcat_stage SET complete = TRUE WHERE row_id = staged_statcat.row_id;
  217.  
  218.     END LOOP;
  219.  
  220.     RETURN update_count;
  221. END;
  222. $func$ LANGUAGE PLPGSQL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement