FixProjectPath.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. class Route_FixProjectPath extends RouteBase {
  4. public function defaultAction() {
  5. echo 'TODO: F.' . __FUNCTION__;
  6. //$sqlList['Check'] = "SHOW PROCEDURE STATUS where `Name`='update_project_path_idx_rec'";
  7. }
  8. public function checkPathsAction() {
  9. $sql = "
  10. select p.`ID`
  11. , p.`path` as proj_path
  12. , k.`path` as koresp_path
  13. , i.`idx_PATH` as idx_path
  14. from `IN7_MK_BAZA_DYSTRYBUCJI` p
  15. join `_project_path_idx` i on(i.`ID`=p.`ID`)
  16. left join `IN7_DZIENNIK_KORESP` k on(k.`ID_PROJECT`=p.`ID`)
  17. where (p.`path`!=i.`idx_PATH` or k.`path`!=i.`idx_PATH`)
  18. ";
  19. $rows = array();
  20. $db = DB::getDB();
  21. if ($db->has_errors()) {
  22. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  23. }
  24. $res = $db->query($sql);
  25. while ($r = $db->fetch($res)) {
  26. $rows[] = $r;
  27. }
  28. echo $sql;
  29. echo'<pre>';print_r($rows);echo'</pre>';
  30. die('OK');
  31. }
  32. public function runAction() {
  33. $sql = "call `update_project_path_idx_rec`();";
  34. // TODO: update fields:
  35. // `IN7_MK_BAZA_DYSTRYBUCJI`.`path`
  36. // `IN7_DZIENNIK_KORESP`.`path`
  37. // `PROBLEMS`.`ID_PROJECT_path`
  38. $db = DB::getDB();
  39. if ($db->has_errors()) {
  40. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  41. }
  42. $res = $db->query($sql);
  43. if ($db->has_errors()) {
  44. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  45. }
  46. die('OK');
  47. }
  48. public function reinstallAction() {
  49. // TODO: reinstall triggers for after insert/update `IN7_MK_BAZA_DYSTRYBUCJI`?
  50. // TODO: reinstall triggers for after insert/update `IN7_DZIENNIK_KORESP` and `PROBLEMS`?
  51. // coalesce((select p.`path` from `IN7_MK_BAZA_DYSTRYBUCJI` p where p.`ID`=4480 limit 1), 'Brak projektu')
  52. $sqlList = array();
  53. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `_project_path_idx`";
  54. $sqlList['InstallTable'] = "
  55. CREATE TABLE IF NOT EXISTS `_project_path_idx` (
  56. `ID` int(11) NOT NULL
  57. , `P_ID` int(11) NOT NULL DEFAULT '0'
  58. , `idx_PATH` varchar(255) NOT NULL DEFAULT ''
  59. , KEY `ID` (`ID`)
  60. , KEY `P_ID` (`P_ID`)
  61. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  62. ";
  63. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_project_path_idx_rec`";
  64. $sqlList['CreateProcedure'] = "
  65. CREATE PROCEDURE `update_project_path_idx_rec`()
  66. BEGIN
  67. SET @conf_last_exec_key = 'tbl_indexer_project_last_exec';
  68. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_key, NOW());
  69. truncate table `_project_path_idx`;
  70. -- delete from `_project_path_idx`;
  71. insert into `_project_path_idx` (`ID`,`P_ID`)
  72. select p.`ID`, p.`P_ID`
  73. from `IN7_MK_BAZA_DYSTRYBUCJI` p
  74. where 1=1
  75. ;
  76. update `_project_path_idx` as p set p.`idx_PATH`=concat('0-', p.`ID`) where p.`P_ID` is null or p.`P_ID`=0;
  77. update `_project_path_idx` as p set p.`idx_PATH`=concat('-1-', p.`ID`) where p.`P_ID`=-1;
  78. SET @i = 0;
  79. SET @loopLomit = 100;
  80. SET @pinitCnt = 1;
  81. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  82. update `_project_path_idx` p join `_project_path_idx` pp on(pp.`ID`=p.`P_ID`)
  83. set p.`idx_PATH`=concat(pp.`idx_PATH`, '-', p.`ID`)
  84. where p.`idx_PATH`='' and pp.`idx_PATH`!='';
  85. SET @pinitCnt = ROW_COUNT();
  86. SET @i = @i + 1;
  87. END WHILE;
  88. END ;
  89. ";
  90. $sqlList['RemoveTrigger_BeforeInsertProject'] = "DROP TRIGGER IF EXISTS `_IN7_MK_BAZA_DYSTRYBUCJI_tree_INSERT`";
  91. $sqlList['CreateTrigger_BeforeInsertProject'] = "
  92. CREATE TRIGGER `_IN7_MK_BAZA_DYSTRYBUCJI_tree_INSERT` BEFORE INSERT ON `IN7_MK_BAZA_DYSTRYBUCJI`
  93. FOR EACH ROW BEGIN
  94. -- SET NEW.path = IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.P_ID);
  95. SET NEW.path = (select CONCAT(
  96. (select IF (NEW.`P_ID`>0,
  97. coalesce(
  98. (select p.`path` from `IN7_MK_BAZA_DYSTRYBUCJI` p where p.`ID`=NEW.`P_ID` limit 1)
  99. , '?')
  100. , NEW.`P_ID`
  101. ))
  102. , '-'
  103. , (select AUTO_INCREMENT from information_schema.TABLES where TABLE_SCHEMA=DATABASE() AND TABLE_NAME='IN7_MK_BAZA_DYSTRYBUCJI')
  104. ));
  105. END
  106. ";
  107. $db = DB::getDB();
  108. if ($db->has_errors()) {
  109. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  110. }
  111. foreach ($sqlList as $sqlName => $sql) {
  112. $res = $db->query($sql);
  113. if ($db->has_errors()) {
  114. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  115. }
  116. }
  117. die('OK');
  118. }
  119. }
  120. /**
  121. * Old triggers before 2015-06-10:
  122. CREATE TRIGGER `_IN7_MK_BAZA_DYSTRYBUCJI_tree_INSERT` BEFORE INSERT ON `IN7_MK_BAZA_DYSTRYBUCJI`
  123. FOR EACH ROW BEGIN
  124. SET NEW.path = IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.P_ID);
  125. END
  126. CREATE TRIGGER `_IN7_MK_BAZA_DYSTRYBUCJI_tree_UPDATE` BEFORE UPDATE ON `IN7_MK_BAZA_DYSTRYBUCJI`
  127. FOR EACH ROW BEGIN
  128. IF NEW.P_ID<>OLD.P_ID THEN
  129. SET NEW.path = IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.P_ID);
  130. update IN7_DZIENNIK_KORESP ik set ik.path=IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.ID) where path like concat('%',NEW.ID,'%');
  131. -- update PROBLEMS ik set ik.ID_PROJET_path=IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.ID) where ID_PROJET_path like concat('%',NEW.ID,'%');
  132. END IF;
  133. END
  134. CREATE TRIGGER `_IN7_DZIENNIK_KORESP_tree_INSERT` BEFORE INSERT ON `IN7_DZIENNIK_KORESP`
  135. FOR EACH ROW BEGIN
  136. IF NEW.ID_PROJECT IS NOT NULL THEN
  137. SET NEW.path = IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.ID_PROJECT);
  138. END IF;
  139. END
  140. CREATE TRIGGER `_IN7_DZIENNIK_KORESP_tree_UPDATE` BEFORE UPDATE ON `IN7_DZIENNIK_KORESP`
  141. FOR EACH ROW BEGIN
  142. IF NEW.ID_PROJECT is null THEN
  143. SET NEW.path = '';
  144. ELSEIF OLD.ID_PROJECT IS NULL or NEW.ID_PROJECT<>OLD.ID_PROJECT THEN
  145. SET NEW.path = IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-', NEW.ID_PROJECT);
  146. END IF;
  147. END
  148. CREATE FUNCTION `IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path`(`delimiter` TEXT, `node` INT) RETURNS text CHARSET latin2
  149. READS SQL DATA
  150. BEGIN
  151. DECLARE _path TEXT;
  152. DECLARE _type CHAR(255);
  153. DECLARE _lvl INT;
  154. DECLARE _cpath TEXT;
  155. DECLARE _id INT;
  156. DECLARE _id_cur INT;
  157. DECLARE EXIT HANDLER FOR NOT FOUND RETURN _path;
  158. SET _id = COALESCE(node, @id);
  159. SET _path = _id;
  160. SET _lvl=1;
  161. the_loop: LOOP
  162. SET _lvl =_lvl+1;
  163. IF _lvl>100 THEN
  164. RETURN concat('ERROR',_path);
  165. LEAVE the_loop;
  166. END IF;
  167. SELECT P_ID,M_DIST_TYPE,ID
  168. INTO _id,_type,_id_cur
  169. FROM IN7_MK_BAZA_DYSTRYBUCJI
  170. WHERE id = _id
  171. AND COALESCE(id <> @start_with, TRUE);
  172. SET _path = CONCAT(_id, delimiter, _path);
  173. END LOOP the_loop;
  174. END
  175. CREATE EVENT `_IN7_MK_BAZA_DYSTRYBUCJI__IN7_DZIENNIK_KORESP_tree_event` ON SCHEDULE EVERY 1 DAY STARTS '2015-05-15 05:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN
  176. update IN7_MK_BAZA_DYSTRYBUCJI set path=IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-',ID);
  177. update IN7_DZIENNIK_KORESP set path=IN7_MK_BAZA_DYSTRYBUCJI_hierarchy_sys_connect_by_path('-',ID_PROJECT);
  178. END
  179. */