FixCrmProcesInitIdx.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('DebugExecutionTime');
  4. class Route_FixCrmProcesInitIdx extends RouteBase {
  5. public function handleAuth() {
  6. if (!User::logged()) {
  7. throw new HttpException('Unauthorized', 401);
  8. }
  9. }
  10. public function defaultAction() {
  11. SE_Layout::gora();
  12. ?>
  13. <a href="index.php?_route=FixCrmProcesInitIdx&_task=run">aktualizuj uprawnienia</a>
  14. <?php
  15. }
  16. public function runAction() {
  17. SE_Layout::gora();
  18. SE_Layout::menu();
  19. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  20. $dbgExecTime = new DebugExecutionTime();
  21. if ($DBG_TIME) $dbgExecTime->activate();
  22. $dbgExecTime->log('start');
  23. $this->_callProcedure();
  24. $dbgExecTime->log('procedure');
  25. $procExecTime = $dbgExecTime->getLastExecTime();
  26. //$totalExecTime = $dbgExecTime->getTotalExecTime();
  27. ?>
  28. <div class="container">
  29. <div class="alert alert-success">
  30. Zaktualizowano uprawnienia
  31. <br><span style="opacity:0.6;">(<?php echo number_format($procExecTime, 6); ?>s)</span>
  32. </div>
  33. </div>
  34. <?php
  35. if($DBG_TIME){
  36. $dbgExecTime->log('end');
  37. //$dbgExecTime->printDebug();
  38. }
  39. SE_Layout::dol();
  40. }
  41. public function runApiAction() {
  42. $this->_callProcedure();
  43. die('Zaktualizowano uprawnienia');
  44. }
  45. private function _callProcedure() {
  46. $sql = "call `update_proces_init_idx_rec`();";
  47. $db = DB::getDB();
  48. if ($db->has_errors()) {
  49. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  50. }
  51. $res = $db->query($sql);
  52. if ($db->has_errors()) {
  53. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  54. }
  55. }
  56. public function reinstallAction() {
  57. $this->reinstall();
  58. die('OK');
  59. }
  60. public function reinstall() {
  61. $sqlList = array();
  62. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  63. $sqlList['InstallTable'] = <<<SQL
  64. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  65. `ID` int(11) NOT NULL
  66. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  67. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  68. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  69. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  70. , `idx_PATH` text NOT NULL
  71. , KEY `ID` (`ID`)
  72. , KEY `PARENT_ID` (`PARENT_ID`)
  73. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  74. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  75. -- , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID`,`idx_PROCES_WITH_GROUPS_ID`)
  76. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  77. SQL;
  78. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  79. $sqlList['CreateProcedure'] = <<<SQL
  80. CREATE PROCEDURE `update_proces_init_idx_rec`()
  81. BEGIN
  82. SET @enabled = FALSE;
  83. SET @conf_last_exec_key = 'tbl_indexer_CRM_PROCES_last_exec';
  84. -- call debug_msg(@enabled, 'init procedure...');
  85. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  86. -- IF '1'=(select IF(`conf_val` < DATE_SUB(NOW(), INTERVAL 1 MINUTE), '1', '0') from `CRM_CONFIG` where `conf_key`=@conf_last_exec_key limit 1) THEN BEGIN
  87. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_key, NOW());
  88. -- lock tables `CRM_PROCES_idx` WRITE, `CRM_PROCES` WRITE, `CRM_CONFIG` READ, `CRM_WSKAZNIK` READ, `CRM_LISTA_ZASOBOW` READ;
  89. -- lock table `CRM_PROCES_idx` WRITE;
  90. -- select sleep(2);
  91. select 'truncate->delete...';
  92. truncate table `CRM_PROCES_idx`;
  93. -- delete from `CRM_PROCES_idx`;
  94. select 'insert into `CRM_PROCES_idx`...';
  95. insert into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  96. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  97. from `CRM_PROCES` p
  98. where p.`A_STATUS` in('NORMAL','WAITING')
  99. ;
  100. select 'while 1...';
  101. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0);
  102. -- call debug_msg(@enabled, (select concat_ws(' ', "all idx_PROCES_INIT_ID cleared", ROW_COUNT())));
  103. SET @i = 0;
  104. SET @loopLomit = 100;
  105. SET @pinitCnt = 1;
  106. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  107. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  108. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  109. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  110. SET @pinitCnt = ROW_COUNT();
  111. SET @i = @i + 1;
  112. END WHILE;
  113. select 'while 2...';
  114. update `CRM_PROCES_idx` i
  115. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID`
  116. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  117. )
  118. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  119. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  120. and z.`A_STATUS` in('NORMAL', 'WAITING')
  121. )
  122. set
  123. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID`
  124. where i.`idx_PROCES_INIT_ID`>0;
  125. SET @i = 0;
  126. SET @loopLomit = 100;
  127. SET @groupCnt = 1;
  128. WHILE @i < @loopLomit and @groupCnt > 0 DO
  129. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  130. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  131. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  132. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  133. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  134. SET @groupCnt = ROW_COUNT();
  135. SET @i = @i + 1;
  136. END WHILE;
  137. select 'GOTO_AND_RETURN...';
  138. insert into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  139. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  140. , pi.`idx_PROCES_WITH_GROUPS_ID`
  141. from `CRM_PROCES` p
  142. join `CRM_PROCES_idx` pi on(pi.`ID`=p.`ID`)
  143. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  144. and g.`TYPE`='PROCES_INIT'
  145. and g.`A_STATUS` in('NORMAL','WAITING')
  146. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  147. and p.`IF_TRUE_GOTO`>0
  148. )
  149. where p.`A_STATUS` in('NORMAL','WAITING')
  150. and 0=(select IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, 0, -1) from `CRM_PROCES_idx` i where i.`ID`=g.`ID`)
  151. ;
  152. SET @groupCnt = ROW_COUNT();
  153. update `CRM_PROCES_idx`
  154. set `idx_PROCES_WITH_GROUPS_ID`=0
  155. where `idx_PROCES_WITH_GROUPS_ID` is null
  156. and `TYPE`='PROCES_INIT'
  157. ;
  158. insert ignore into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  159. select i.`ID`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  160. from `CRM_PROCES_idx` i
  161. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  162. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  163. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  164. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  165. and i.`TYPE`!='GOTO_AND_RETURN'
  166. ;
  167. select 'delete idx_PROCES_WITH_GROUPS_ID...';
  168. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  169. -- TODO: multiple rows for proces id - goto_and_return
  170. select 'update `CRM_PROCES`...';
  171. update `CRM_PROCES` p
  172. set p.`idx_PROCES_INIT_ID`=(select i.`idx_PROCES_INIT_ID` from `CRM_PROCES_idx` i where i.`ID`=p.`ID` limit 1)
  173. -- update `CRM_PROCES` p
  174. -- join `CRM_PROCES_idx` i on(i.`ID`=p.`ID`)
  175. -- set p.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`
  176. -- , p.`idx_PROCES_WITH_GROUPS_ID`=i.`idx_PROCES_WITH_GROUPS_ID`
  177. ;
  178. -- unlock tables;
  179. -- END; END IF;
  180. END ;
  181. SQL;
  182. $db = DB::getDB();
  183. if ($db->has_errors()) {
  184. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  185. }
  186. foreach ($sqlList as $sqlName => $sql) {
  187. $res = $db->query($sql);
  188. if ($db->has_errors()) {
  189. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  190. }
  191. }
  192. }
  193. }