From 1710f50ea063e9bf29b042670acd40a66f295718 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Tue, 8 Mar 2016 16:00:14 +0100 Subject: [PATCH] MT#16777 Add lnp rewrite columns and routing num Add new caller/callee_lnp columns for rewrite rules. Update triggers to populate dialplan from rwr. Populate new caller/callee_lnp columns with rwr seq numbers. Change-Id: I6c2e6175357c06608fd28e956a9e2892f32502b3 --- db_scripts/diff/15221.down | 351 +++++++++++++++++++++++++ db_scripts/diff/15221.up | 514 +++++++++++++++++++++++++++++++++++++ 2 files changed, 865 insertions(+) create mode 100644 db_scripts/diff/15221.down create mode 100644 db_scripts/diff/15221.up diff --git a/db_scripts/diff/15221.down b/db_scripts/diff/15221.down new file mode 100644 index 00000000..052e3c24 --- /dev/null +++ b/db_scripts/diff/15221.down @@ -0,0 +1,351 @@ +SET AUTOCOMMIT=0; + +USE billing; + +alter table lnp_numbers + drop column routing_number; + +USE provisioning; + +DELETE FROM voip_rewrite_rules WHERE direction = 'lnp'; +ALTER TABLE voip_rewrite_rules + CHANGE COLUMN direction direction ENUM('in', 'out') NOT NULL DEFAULT 'in'; + +ALTER TABLE voip_rewrite_rule_sets + DROP COLUMN caller_lnp_dpid, + DROP COLUMN callee_lnp_dpid; + +DELETE FROM voip_preferences + WHERE attribute IN ('rewrite_caller_lnp_dpid', 'rewrite_callee_lnp_dpid'); + +DROP TRIGGER voip_rwrulesets_crepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_crepl_trig BEFORE INSERT ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + IF NEW.caller_in_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.caller_in_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.callee_in_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.callee_in_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.caller_out_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.caller_out_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.callee_out_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.callee_out_dpid = (SELECT LAST_INSERT_ID()); + END IF; + + DELETE a FROM voip_rwrs_sequence a, voip_rwrs_sequence b WHERE a.id < b.id; +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrulesets_urepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_urepl_trig AFTER UPDATE ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + IF NEW.caller_in_dpid != OLD.caller_in_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.caller_in_dpid WHERE dpid <=> OLD.caller_in_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + END IF; + + IF NEW.callee_in_dpid != OLD.callee_in_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.callee_in_dpid WHERE dpid <=> OLD.callee_in_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + END IF; + + IF NEW.caller_out_dpid != OLD.caller_out_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.caller_out_dpid WHERE dpid <=> OLD.caller_out_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + END IF; + + IF NEW.callee_out_dpid != OLD.callee_out_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.callee_out_dpid WHERE dpid <=> OLD.callee_out_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + END IF; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrulesets_drepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_drepl_trig BEFORE DELETE ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.caller_in_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.callee_in_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.caller_out_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.callee_out_dpid; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_crepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_crepl_trig AFTER INSERT ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE new_set_id int(11) unsigned; + + IF NEW.enabled = 1 THEN + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + INSERT INTO kamailio.dialplan (dpid,pr,match_op,match_exp,match_len,subst_exp,repl_exp,attrs) + VALUES(new_set_id,NEW.priority,1,NEW.match_pattern,0,NEW.match_pattern,NEW.replace_pattern,''); + END IF; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_urepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_urepl_trig AFTER UPDATE ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE old_set_id int(11) unsigned; + DECLARE new_set_id int(11) unsigned; + + IF OLD.enabled = 1 AND NEW.enabled = 1 THEN + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + UPDATE kamailio.dialplan + SET dpid = new_set_id, + pr = NEW.priority, + match_exp = NEW.match_pattern, + subst_exp = NEW.match_pattern, + repl_exp = NEW.replace_pattern + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + ELSEIF OLD.enabled = 0 AND NEW.enabled = 1 THEN + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + INSERT INTO kamailio.dialplan (dpid,pr,match_op,match_exp,match_len,subst_exp,repl_exp,attrs) + VALUES(new_set_id,NEW.priority,1,NEW.match_pattern,0,NEW.match_pattern,NEW.replace_pattern,''); + ELSEIF OLD.enabled = 1 AND NEW.enabled = 0 THEN + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + DELETE FROM kamailio.dialplan + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + END IF; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_drepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_drepl_trig BEFORE DELETE ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE old_set_id int(11) unsigned; + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + DELETE FROM kamailio.dialplan + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + +END ;; +DELIMITER ; + +COMMIT; diff --git a/db_scripts/diff/15221.up b/db_scripts/diff/15221.up new file mode 100644 index 00000000..8a9263c2 --- /dev/null +++ b/db_scripts/diff/15221.up @@ -0,0 +1,514 @@ +SET AUTOCOMMIT=0; + +USE billing; + +alter table lnp_numbers + add column routing_number varchar(31) default null after number; + +USE provisioning; + +ALTER TABLE voip_rewrite_rules + CHANGE COLUMN direction direction ENUM('in', 'out', 'lnp') NOT NULL DEFAULT 'in'; + +ALTER TABLE voip_rewrite_rule_sets + ADD COLUMN caller_lnp_dpid INT(11) UNSIGNED DEFAULT NULL, + ADD COLUMN callee_lnp_dpid INT(11) UNSIGNED DEFAULT NULL; + +set @pid = 0; +select id into @pid from voip_preference_groups where name = 'Number Manipulations'; +insert into voip_preferences + (voip_preference_groups_id, attribute, label, type, max_occur, + usr_pref, prof_pref, dom_pref, peer_pref, contract_pref, + modify_timestamp, internal, expose_to_customer, data_type, read_only, + description) + values + (@pid, 'rewrite_caller_lnp_dpid', 'Internal # for lnp caller rewrite rule set', 1, 1, + 1, 1, 1, 1, 0, + now(), 1, 0, 'int', 0, + NULL), + (@pid, 'rewrite_callee_lnp_dpid', 'Internal # for lnp callee rewrite rule set', 1, 1, + 1, 1, 1, 1, 0, + now(), 1, 0, 'int', 0, + NULL); + +DROP TRIGGER voip_rwrulesets_crepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_crepl_trig BEFORE INSERT ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + IF NEW.caller_in_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.caller_in_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.callee_in_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.callee_in_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.caller_out_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.caller_out_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.callee_out_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.callee_out_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.caller_lnp_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.caller_lnp_dpid = (SELECT LAST_INSERT_ID()); + END IF; + IF NEW.callee_lnp_dpid IS NULL THEN + INSERT INTO voip_rwrs_sequence VALUES(); + SET NEW.callee_lnp_dpid = (SELECT LAST_INSERT_ID()); + END IF; + + DELETE a FROM voip_rwrs_sequence a, voip_rwrs_sequence b WHERE a.id < b.id; +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrulesets_urepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_urepl_trig AFTER UPDATE ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + IF NEW.caller_in_dpid != OLD.caller_in_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.caller_in_dpid WHERE dpid <=> OLD.caller_in_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.caller_in_dpid + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + END IF; + + IF NEW.callee_in_dpid != OLD.callee_in_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.callee_in_dpid WHERE dpid <=> OLD.callee_in_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.callee_in_dpid + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + END IF; + + IF NEW.caller_out_dpid != OLD.caller_out_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.caller_out_dpid WHERE dpid <=> OLD.caller_out_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.caller_out_dpid + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + END IF; + + IF NEW.callee_out_dpid != OLD.callee_out_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.callee_out_dpid WHERE dpid <=> OLD.callee_out_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.callee_out_dpid + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + END IF; + + IF NEW.caller_lnp_dpid != OLD.caller_lnp_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.caller_lnp_dpid WHERE dpid <=> OLD.caller_lnp_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.caller_lnp_dpid + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.caller_lnp_dpid + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.caller_lnp_dpid + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.caller_lnp_dpid + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + END IF; + + IF NEW.callee_lnp_dpid != OLD.callee_lnp_dpid THEN + UPDATE kamailio.dialplan SET dpid = NEW.callee_lnp_dpid WHERE dpid <=> OLD.callee_lnp_dpid; + UPDATE voip_usr_preferences a, voip_preferences b + SET a.value = NEW.callee_lnp_dpid + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + UPDATE voip_dom_preferences a, voip_preferences b + SET a.value = NEW.callee_lnp_dpid + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + UPDATE voip_peer_preferences a, voip_preferences b + SET a.value = NEW.callee_lnp_dpid + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + UPDATE voip_prof_preferences a, voip_preferences b + SET a.value = NEW.callee_lnp_dpid + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + END IF; +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrulesets_drepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrulesets_drepl_trig BEFORE DELETE ON voip_rewrite_rule_sets + FOR EACH ROW BEGIN + + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + DELETE a FROM voip_usr_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + DELETE a FROM voip_dom_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + DELETE a FROM voip_peer_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_in_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_in_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_in_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_out_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_out_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_out_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_caller_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.caller_lnp_dpid; + DELETE a FROM voip_prof_preferences a, voip_preferences b + WHERE b.attribute <=> 'rewrite_callee_lnp_dpid' + AND a.attribute_id <=> b.id + AND a.value <=> OLD.callee_lnp_dpid; + + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.caller_in_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.callee_in_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.caller_out_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.callee_out_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.caller_lnp_dpid; + DELETE FROM kamailio.dialplan WHERE dpid <=> OLD.callee_lnp_dpid; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_crepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_crepl_trig AFTER INSERT ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE new_set_id int(11) unsigned; + + IF NEW.enabled = 1 THEN + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'lnp' THEN + SELECT IF(NEW.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + INSERT INTO kamailio.dialplan (dpid,pr,match_op,match_exp,match_len,subst_exp,repl_exp,attrs) + VALUES(new_set_id,NEW.priority,1,NEW.match_pattern,0,NEW.match_pattern,NEW.replace_pattern,''); + END IF; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_urepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_urepl_trig AFTER UPDATE ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE old_set_id int(11) unsigned; + DECLARE new_set_id int(11) unsigned; + + IF OLD.enabled = 1 AND NEW.enabled = 1 THEN + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'lnp' THEN + SELECT IF(OLD.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'lnp' THEN + SELECT IF(NEW.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + UPDATE kamailio.dialplan + SET dpid = new_set_id, + pr = NEW.priority, + match_exp = NEW.match_pattern, + subst_exp = NEW.match_pattern, + repl_exp = NEW.replace_pattern + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + ELSEIF OLD.enabled = 0 AND NEW.enabled = 1 THEN + + IF NEW.direction = 'in' THEN + SELECT IF(NEW.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'out' THEN + SELECT IF(NEW.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + ELSEIF NEW.direction = 'lnp' THEN + SELECT IF(NEW.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO new_set_id FROM voip_rewrite_rule_sets WHERE id <=> NEW.set_id; + END IF; + + INSERT INTO kamailio.dialplan (dpid,pr,match_op,match_exp,match_len,subst_exp,repl_exp,attrs) + VALUES(new_set_id,NEW.priority,1,NEW.match_pattern,0,NEW.match_pattern,NEW.replace_pattern,''); + ELSEIF OLD.enabled = 1 AND NEW.enabled = 0 THEN + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'lnp' THEN + SELECT IF(OLD.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + DELETE FROM kamailio.dialplan + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + END IF; + +END;; +DELIMITER ; + +DROP TRIGGER voip_rwrules_drepl_trig; +DELIMITER ;; +CREATE TRIGGER voip_rwrules_drepl_trig BEFORE DELETE ON voip_rewrite_rules + FOR EACH ROW BEGIN + + DECLARE old_set_id int(11) unsigned; + + IF OLD.direction = 'in' THEN + SELECT IF(OLD.field = 'caller', caller_in_dpid, callee_in_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'out' THEN + SELECT IF(OLD.field = 'caller', caller_out_dpid, callee_out_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + ELSEIF OLD.direction = 'lnp' THEN + SELECT IF(OLD.field = 'caller', caller_lnp_dpid, callee_lnp_dpid) + INTO old_set_id FROM voip_rewrite_rule_sets WHERE id <=> OLD.set_id; + END IF; + + DELETE FROM kamailio.dialplan + WHERE dpid <=> old_set_id + AND pr <=> OLD.priority + AND match_exp <=> OLD.match_pattern + AND subst_exp <=> OLD.match_pattern + AND repl_exp <=> OLD.replace_pattern; + +END ;; +DELIMITER ; + +delimiter ;; +create procedure tmp_update_rwr_seq() begin + declare done boolean default false; + declare _id int(11) unsigned; + declare last_seq int(11) unsigned; + declare caller_cur cursor for select id from provisioning.voip_rewrite_rule_sets where caller_lnp_dpid is null; + declare callee_cur cursor for select id from provisioning.voip_rewrite_rule_sets where callee_lnp_dpid is null; + declare continue handler for not found set done := true; + + open caller_cur; + testloop: loop + fetch caller_cur into _id; + if done then + leave testloop; + end if; + insert into voip_rwrs_sequence values(); + set last_seq := last_insert_id(); + update provisioning.voip_rewrite_rule_sets set caller_lnp_dpid = last_seq where id = _id; + end loop testloop; + close caller_cur; + + set done := false; + open callee_cur; + testloop: loop + fetch callee_cur into _id; + if done then + leave testloop; + end if; + insert into voip_rwrs_sequence values(); + set last_seq := last_insert_id(); + update provisioning.voip_rewrite_rule_sets set callee_lnp_dpid = last_seq where id = _id; + end loop testloop; + close callee_cur; + + delete from provisioning.voip_rwrs_sequence where id < last_seq; + +end;; +delimiter ; + +call tmp_update_rwr_seq(); + +drop procedure tmp_update_rwr_seq; + +COMMIT;