From c070cb8feb7d55ff2338ef88c70f8b1780ee1413 Mon Sep 17 00:00:00 2001
From: Rene Krenn <rkrenn@sipwise.com>
Date: Mon, 15 Oct 2018 17:24:10 +0200
Subject: [PATCH] TT#45715 accounting.cdr_export_status tables

- currenty, there is only cdr.export_status and cdr.exported_at columns
to mark rows already written.
- to handle the AMA ticket export (and other exporters in the future), a
table "accounting.cdr_export_status" is introduced, defineing "streams".
for now there will be "defualt" (the good old cdr-exporter) and
"ama-simples" (for UPC AT)
- the table accounting.cdr_export_status_data stores individual vlaus
for "export_status" (unexported, ok, failed) and exported_at timestamp
per cdr and per cdr exort stream

- all cdr relation table triggers for emulating fk are refactored to be fast.

Change-Id: I52c3383f82ef841e7b18515dd7b73db42a43e2f9
---
 db_scripts/diff/15441.up | 200 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 200 insertions(+)
 create mode 100644 db_scripts/diff/15441.up

diff --git a/db_scripts/diff/15441.up b/db_scripts/diff/15441.up
new file mode 100644
index 00000000..a6bac759
--- /dev/null
+++ b/db_scripts/diff/15441.up
@@ -0,0 +1,200 @@
+use accounting;
+
+create table cdr_export_status (
+  id int(3) unsigned not null auto_increment,
+  type varchar(255) NOT NULL,
+  primary key (id),
+  unique key cesc_type_idx (type)
+) engine=InnoDB default charset=utf8;
+
+insert into cdr_export_status set id=null, type='default';
+insert into cdr_export_status set id=null, type='ama_simple';
+
+create table cdr_export_status_data ( 
+  cdr_id int(10) unsigned not null,
+  status_id int(3) unsigned not null,
+  exported_at datetime default null,
+  export_status enum('unexported','ok','failed') not null default 'unexported',
+  cdr_start_time decimal(13,3) not null,
+  primary key (cdr_id, status_id, cdr_start_time),
+  key cdrexportstatusdata_stime (cdr_start_time)
+) engine=InnoDB default charset=utf8;
+
+drop trigger if exists cdr_cascade_update_trig;
+delimiter ;;
+create trigger cdr_cascade_update_trig after update on accounting.cdr
+  for each row begin
+
+  update accounting.cdr_relation_data set cdr_id = NEW.id where cdr_id = OLD.id;
+  update accounting.cdr_cash_balance_data set cdr_id = NEW.id where cdr_id = OLD.id;
+  update accounting.cdr_time_balance_data set cdr_id = NEW.id where cdr_id = OLD.id;
+  update accounting.cdr_tag_data set cdr_id = NEW.id where cdr_id = OLD.id;
+  update accounting.cdr_export_status_data set cdr_id = NEW.id where cdr_id = OLD.id;
+
+  end;;
+delimiter ;
+
+drop trigger if exists cdr_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_cascade_delete_trig after delete on accounting.cdr
+  for each row begin
+
+  delete from accounting.cdr_relation_data where cdr_id = OLD.id;
+  delete from accounting.cdr_cash_balance_data where cdr_id = OLD.id;
+  delete from accounting.cdr_time_balance_data where cdr_id = OLD.id;
+  delete from accounting.cdr_tag_data where cdr_id = OLD.id;
+  delete from accounting.cdr_export_status_data where cdr_id = OLD.id;
+
+  end;;
+delimiter ;
+
+drop trigger if exists cdr_export_status_rest_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_export_status_rest_cascade_delete_trig before delete on accounting.cdr_export_status
+  for each row begin
+
+    select count(1) into @rel_count from (select 1 from accounting.cdr_export_status_data where status_id = OLD.id limit 1) as cnt;
+
+    if @rel_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_export_status, related data exists in accounting.cdr_export_status_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+####
+drop trigger if exists cdr_relation_rest_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_relation_rest_cascade_delete_trig before delete on accounting.cdr_relation
+  for each row begin
+
+    select count(1) into @rel_count from (select count(1) from accounting.cdr_relation_data where relation_id = OLD.id limit 1) as cnt;
+
+    if @rel_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_relation, related data exists in accounting.cdr_relation_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+drop trigger if exists cdr_tag_rest_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_tag_rest_cascade_delete_trig before delete on accounting.cdr_tag
+  for each row begin
+
+    select count(1) into @rel_count from (select count(1) from accounting.cdr_tag_data where tag_id = OLD.id limit 1) as cnt;
+
+    if @rel_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_tag, related data exists in accounting.cdr_tag_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+drop trigger if exists cdr_provider_rest_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_provider_rest_cascade_delete_trig before delete on accounting.cdr_provider
+  for each row begin
+
+    select count(1) into @rel_prov_count
+        from (select count(1) from accounting.cdr_relation_data where provider_id = OLD.id limit 1) as cnt;
+    select count(1) into @cash_balance_prov_count
+        from (select count(1) from accounting.cdr_cash_balance_data where provider_id = OLD.id limit 1) as cnt;
+    select count(1) into @time_balance_prov_count
+        from (select count(1) from accounting.cdr_time_balance_data where provider_id = OLD.id limit 1) as cnt;
+    select count(1) into @tag_prov_count
+        from (select count(1) from accounting.cdr_tag_data where provider_id = OLD.id limit 1) as cnt;
+
+    if @rel_prov_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_provider, related data exists in accounting.cdr_relation_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @cash_balance_prov_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_provider, related data exists in accounting.cdr_cash_balance_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @time_balance_prov_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_provider, related data exists in accounting.cdr_time_balance_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @tag_prov_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_provider, related data exists in accounting.cdr_tag_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+drop trigger if exists cdr_direction_rest_cascade_delete_trig;
+delimiter ;;
+create trigger cdr_direction_rest_cascade_delete_trig before delete on accounting.cdr_direction
+  for each row begin
+
+    select count(1) into @rel_dir_count
+        from (select count(1) from accounting.cdr_relation_data where direction_id = OLD.id limit 1) as cnt;
+    select count(1) into @cash_balance_dir_count
+        from (select count(1) from accounting.cdr_cash_balance_data where direction_id = OLD.id limit 1) as cnt;
+    select count(1) into @time_balance_dir_count
+        from (select count(1) from accounting.cdr_time_balance_data where direction_id = OLD.id limit 1) as cnt;
+    select count(1) into @tag_dir_count
+        from (select count(1) from accounting.cdr_tag_data where direction_id = OLD.id limit 1) as cnt;
+
+    if @rel_dir_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_direction, related data exists in accounting.cdr_relation_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @cash_balance_dir_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_direction, related data exists in accounting.cdr_cash_balance_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @time_balance_dir_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_direction, related data exists in accounting.cdr_time_balance_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+    if @tag_dir_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.cdr_direction, related data exists in accounting.cdr_tag_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+drop trigger if exists events_relation_rest_cascade_delete_trig;
+delimiter ;;
+create trigger events_relation_rest_cascade_delete_trig before delete on accounting.events_relation
+  for each row begin
+
+    select count(1) into @rel_count from (select count(1) from accounting.events_relation_data where relation_id = OLD.id limit 1) as cnt;
+
+    if @rel_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.events_relation, related data exists in accounting.events_relation_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+
+drop trigger if exists events_tag_rest_cascade_delete_trig;
+delimiter ;;
+create trigger events_tag_rest_cascade_delete_trig before delete on accounting.events_tag
+  for each row begin
+
+    select count(1) into @tag_count from (select count(1) from accounting.events_tag_data where tag_id = OLD.id limit 1) as cnt;
+
+    if @tag_count > 0 then
+        set @err_msg = 'Error deleting data from accounting.events_tag, related data exists in accounting.events_tag_data';
+        signal sqlstate '45000' set message_text = @err_msg;
+    end if;
+
+  end;;
+delimiter ;
+