FixZasobPath.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. class Route_FixZasobPath extends RouteBase {
  4. public function handleAuth() {
  5. if (!User::logged()) {
  6. throw new HttpException('Unauthorized', 401);
  7. }
  8. }
  9. public function defaultAction() {
  10. //$sqlList['Check'] = "SHOW PROCEDURE STATUS where `Name`='update_zasob_path_idx_rec'";
  11. SE_Layout::gora();
  12. //echo '<a href="/index.php?_route=FixZasobPath&_task=run">Zaktualizuj ścieżki zasobów</a>';
  13. ?>
  14. <div class="jumbotron">
  15. <div class="container">
  16. <form class="form-inline" method="POST">
  17. <input type="hidden" name="_route" value="FixZasobPath" />
  18. <input type="hidden" name="_task" value="run" />
  19. <button type="submit" id="fldExecuteBtn" class="btn btn-primary" autocomplete="off">
  20. Zaktualizuj ścieżki zasobów
  21. </button>
  22. </form>
  23. </div>
  24. </div>
  25. <script type="text/javascript">
  26. jQuery(document).ready(function () {
  27. jQuery('#fldExecuteBtn').on('click', function () {
  28. jQuery(this).text(jQuery(this).text() + '...').attr('disabled', 'disabled');
  29. jQuery(this).parent().submit();
  30. })
  31. });
  32. </script>
  33. <?php
  34. SE_Layout::dol();
  35. }
  36. public function checkPathsAction() {
  37. $sql = "
  38. select z.`ID`
  39. , z.`path` as zasob_path
  40. , wsk.`path_CRM_LISTA_ZASOBOW` as wsk_path
  41. , i.`idx_PATH` as idx_path
  42. from `CRM_LISTA_ZASOBOW` z
  43. join `_zasob_path_idx` i on(i.`ID`=z.`ID`)
  44. left join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=z.`ID`)
  45. where (z.`path`!=i.`idx_PATH` or wsk.`path_CRM_LISTA_ZASOBOW`!=i.`idx_PATH`)
  46. ";
  47. $rows = array();
  48. $db = DB::getDB();
  49. if ($db->has_errors()) {
  50. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  51. }
  52. $res = $db->query($sql);
  53. while ($r = $db->fetch($res)) {
  54. $rows[] = $r;
  55. }
  56. echo $sql;
  57. echo'<pre>';print_r($rows);echo'</pre>';
  58. die('OK');
  59. }
  60. public function runAction() {
  61. SE_Layout::gora();
  62. SE_Layout::menu();
  63. $this->_callProcedure();
  64. ?>
  65. <div class="container">
  66. <div class="alert alert-success">
  67. Zaktualizowano ścieżki zasobów
  68. </div>
  69. </div>
  70. <?php
  71. SE_Layout::dol();
  72. }
  73. public function runApiAction() {
  74. $this->_callProcedure();
  75. die('Zaktualizowano ścieżki zasobów');
  76. }
  77. private function _callProcedure() {
  78. $sql = "call `update_zasob_path_idx_rec`();";
  79. /* update fields:
  80. * `CRM_LISTA_ZASOBOW`.`path`
  81. * `CRM_WSKAZNIK`.`path_CRM_LISTA_ZASOBOW`
  82. */
  83. $db = DB::getDB();
  84. if ($db->has_errors()) {
  85. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  86. }
  87. $res = $db->query($sql);
  88. if ($db->has_errors()) {
  89. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  90. }
  91. }
  92. public function cleanAllPathsAction() {
  93. $sqlList = array();
  94. $sqlList['CleanPath_Zasob'] = "update `CRM_LISTA_ZASOBOW` p set p.`path`='' ";
  95. $sqlList['CleanPath_Wskaznik'] = "update `CRM_WSKAZNIK` k set k.`path_CRM_LISTA_ZASOBOW`='' ";
  96. $db = DB::getDB();
  97. if ($db->has_errors()) {
  98. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  99. }
  100. foreach ($sqlList as $sqlName => $sql) {
  101. $res = $db->query($sql);
  102. if ($db->has_errors()) {
  103. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  104. }
  105. }
  106. die('OK');
  107. }
  108. public function reinstallAction() {
  109. $this->reinstall();
  110. die('OK');
  111. }
  112. public function reinstall() {
  113. $sqlList = array();
  114. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `_zasob_path_idx`";
  115. $sqlList['InstallTable'] = "
  116. CREATE TABLE IF NOT EXISTS `_zasob_path_idx` (
  117. `ID` int(11) NOT NULL
  118. , `P_ID` int(11) NOT NULL DEFAULT '0'
  119. , `DESC` varchar(255) NOT NULL DEFAULT '0'
  120. , `idx_PATH` varchar(255) NOT NULL DEFAULT ''
  121. , `idx_PATH_DESC` varchar(255) NOT NULL DEFAULT ''
  122. , KEY `ID` (`ID`)
  123. , KEY `P_ID` (`P_ID`)
  124. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  125. ";
  126. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_zasob_path_idx_rec`";
  127. $sqlList['CreateProcedure'] = "
  128. CREATE PROCEDURE `update_zasob_path_idx_rec`()
  129. BEGIN
  130. SET @conf_last_exec_key = 'tbl_indexer_zasob_last_exec';
  131. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_key, NOW());
  132. truncate table `_zasob_path_idx`;
  133. -- delete from `_zasob_path_idx`;
  134. insert into `_zasob_path_idx` (`ID`,`P_ID`,`DESC`)
  135. select z.`ID`, coalesce(z.`PARENT_ID`, 0), z.`DESC`
  136. from `CRM_LISTA_ZASOBOW` z
  137. where 1=1
  138. ;
  139. update `_zasob_path_idx` as p set p.`idx_PATH`=concat('0-', p.`ID`), p.`idx_PATH_DESC`=concat('', p.`DESC`) where p.`P_ID`=0;
  140. update `_zasob_path_idx` as p set p.`idx_PATH`=concat('-1-', p.`ID`), p.`idx_PATH_DESC`=concat('-1/', p.`DESC`) where p.`P_ID`<0;
  141. SET @i = 0;
  142. SET @loopLomit = 100;
  143. SET @pinitCnt = 1;
  144. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  145. update `_zasob_path_idx` p join `_zasob_path_idx` pp on(pp.`ID`=p.`P_ID`)
  146. set p.`idx_PATH`=concat(pp.`idx_PATH`, '-', p.`ID`)
  147. , p.`idx_PATH_DESC`=concat(pp.`idx_PATH_DESC`, '/', p.`DESC`)
  148. where p.`idx_PATH`='' and pp.`idx_PATH`!='';
  149. SET @pinitCnt = ROW_COUNT();
  150. SET @i = @i + 1;
  151. END WHILE;
  152. update `CRM_LISTA_ZASOBOW` z join `_zasob_path_idx` i on(i.`ID`=z.`ID`)
  153. set z.`path`=i.`idx_PATH_DESC`;
  154. update `CRM_WSKAZNIK` wsk left join `_zasob_path_idx` i on(i.`ID`=wsk.`ID_ZASOB`)
  155. set wsk.`path_CRM_LISTA_ZASOBOW`=coalesce(i.`idx_PATH_DESC`, '?');
  156. update `CRM_UI_MSGS`
  157. set `A_STATUS`='OFF_HARD'
  158. , `actionExecutedTime`=NOW()
  159. , `A_RECORD_UPDATE_DATE`=NOW()
  160. , `A_RECORD_UPDATE_AUTHOR`='update_zasob_path_idx_rec'
  161. where `A_STATUS`='WAITING'
  162. and `app_className`='FixZasobPath'
  163. and `msg`='Update all paths'
  164. and `uiTargetType`='default_db_table'
  165. and `uiTargetName`='CRM_LISTA_ZASOBOW';
  166. END
  167. ";
  168. $sqlList['RemoveTrigger_BeforeInsertZasob'] = "DROP TRIGGER IF EXISTS `_CRM_LISTA_ZASOBOW_tree_INSERT`";
  169. $sqlList['CreateTrigger_BeforeInsertZasob'] = "
  170. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_INSERT` BEFORE INSERT ON `CRM_LISTA_ZASOBOW`
  171. FOR EACH ROW BEGIN
  172. -- SET NEW.path = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.PARENT_ID);
  173. SET NEW.path = (select CONCAT(
  174. (select IF (NEW.`PARENT_ID`>0
  175. , coalesce(
  176. (select p.`path` from `CRM_LISTA_ZASOBOW` p where p.`ID`=NEW.`PARENT_ID` limit 1)
  177. , '?')
  178. , ''
  179. ))
  180. , '/'
  181. , NEW.`DESC`
  182. ));
  183. END
  184. ";
  185. $sqlList['RemoveTrigger_AfterInsertZasob'] = "DROP TRIGGER IF EXISTS `_CRM_LISTA_ZASOBOW_tree_AFTER_INSERT`";
  186. $sqlList['CreateTrigger_AfterInsertZasob'] = "
  187. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_AFTER_INSERT` AFTER INSERT ON `CRM_LISTA_ZASOBOW`
  188. FOR EACH ROW BEGIN
  189. insert into `_zasob_path_idx` (`ID`, `P_ID`, `DESC`, `idx_PATH`, `idx_PATH_DESC`)
  190. values(
  191. NEW.`ID`
  192. , NEW.`PARENT_ID`
  193. , NEW.`DESC`
  194. , (select CONCAT(
  195. (select IF (NEW.`PARENT_ID`>0,
  196. coalesce(
  197. (select p.`idx_PATH` from `_zasob_path_idx` p where p.`ID`=NEW.`PARENT_ID` limit 1)
  198. , '?')
  199. , NEW.`PARENT_ID`
  200. ))
  201. , '-'
  202. , NEW.ID
  203. ))
  204. , (select CONCAT(
  205. (select IF (NEW.`PARENT_ID`>0
  206. , coalesce(
  207. (select p.`idx_PATH_DESC` from `_zasob_path_idx` p where p.`ID`=NEW.`PARENT_ID` limit 1)
  208. , '?')
  209. , ''
  210. ))
  211. , '/'
  212. , NEW.`DESC`
  213. ))
  214. );
  215. END
  216. ";
  217. $sqlList['RemoveTrigger_BeforeUpdateZasob'] = "DROP TRIGGER IF EXISTS `_CRM_LISTA_ZASOBOW_tree_UPDATE`";
  218. // throws errors:
  219. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixZasobPath:ERROR: Loop detected ID=PARENT_ID' doesn't exist
  220. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixZasobPath:ERROR: Parent item not exists' doesn't exist
  221. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixZasobPath:ERROR: Loop detected in path' doesn't exist
  222. $sqlList['CreateTrigger_BeforeUpdateZasob'] = "
  223. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_UPDATE` BEFORE UPDATE ON `CRM_LISTA_ZASOBOW`
  224. FOR EACH ROW BEGIN
  225. -- IF NEW.PARENT_ID<>OLD.PARENT_ID or NEW.`DESC`<>OLD.`DESC` THEN
  226. -- SET NEW.path = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.PARENT_ID);
  227. -- update CRM_WSKAZNIK ik set ik.path_CRM_LISTA_ZASOBOW=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID) where path_CRM_LISTA_ZASOBOW like concat('%',NEW.ID,'%');
  228. -- -- update CRM_LISTA_ZASOBOW ik set ik.path=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', ik.ID) where path like concat('%',OLD.`DESC`,'%') and ik.ID<>OLD.ID;
  229. IF NEW.`PARENT_ID`!=OLD.`PARENT_ID` or NEW.`DESC`!=OLD.`DESC` THEN
  230. IF OLD.`ID` = NEW.`PARENT_ID` THEN
  231. UPDATE `P5-MSG:Route_FixZasobPath:ERROR: Loop detected ID=P_ID` SET x=1;
  232. -- #1146 - Table 'biall.ERROR: Loop detected ID=PARENT_ID' doesn't exist
  233. END IF;
  234. IF NEW.`PARENT_ID` > 0 THEN
  235. -- check if zasob exists
  236. IF (select count(1) from `CRM_LISTA_ZASOBOW` p where p.`ID`=NEW.`PARENT_ID`) = 0 THEN
  237. UPDATE `P5-MSG:Route_FixZasobPath:ERROR: Parent item not exists` SET x=1;
  238. -- #1146 - Table 'biall.ERROR: Parent item not exists' doesn't exist
  239. END IF;
  240. -- check loop error
  241. -- state: 1276.path='0-868-1218-1276', 1218.path='0-868-1218'
  242. -- update P_ID=1276 where ID=1218 - should throw error
  243. IF (select IF(
  244. p.`idx_PATH` like concat('%-',OLD.ID,'-%')
  245. or p.`idx_PATH` like concat(OLD.ID,'-%')
  246. , 1
  247. , 0) from `_zasob_path_idx` p where p.`ID`=NEW.`PARENT_ID`) > 0 THEN
  248. UPDATE `P5-MSG:Route_FixZasobPath:ERROR: Loop detected in path` SET x=1;
  249. -- #1146 - Table 'biall.ERROR: Loop detected in path' doesn't exist
  250. END IF;
  251. END IF;
  252. SET NEW.`path` = (select CONCAT(
  253. (select IF (NEW.`PARENT_ID`>0
  254. , coalesce(
  255. (select p.`path` from `CRM_LISTA_ZASOBOW` p where p.`ID`=NEW.`PARENT_ID` limit 1)
  256. , '?')
  257. , IF (NEW.`PARENT_ID`<0
  258. , '-1'
  259. , ''
  260. )
  261. ))
  262. , '/'
  263. , NEW.`DESC`
  264. ));
  265. -- DONT: throw warning to update all pathes in `CRM_LISTA_ZASOBOW` with path under current?
  266. -- NOTE: throw error like that prevent update fields
  267. -- IF (select count(1) from `CRM_LISTA_ZASOBOW` p where p.`P_ID`=NEW.ID) > 0 THEN
  268. -- UPDATE `P5-MSG:Route_FixZasobPath:WARNING: Update all paths` SET x=1;
  269. -- END IF;
  270. -- DONT: update `CRM_WSKAZNIK`.`path_CRM_LISTA_ZASOBOW` - rows under NEW.ID has wrong path
  271. END IF;
  272. END
  273. ";
  274. $sqlList['RemoveTrigger_AfterUpdateZasob'] = "DROP TRIGGER IF EXISTS `_CRM_LISTA_ZASOBOW_tree_AFTER_UPDATE`";
  275. // throws errors:
  276. // #1146 - Table '{DATABASE_NAME}.WARNING: Update all paths' doesn't exist
  277. $sqlList['CreateTrigger_AfterUpdateZasob'] = "
  278. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_AFTER_UPDATE` AFTER UPDATE ON `CRM_LISTA_ZASOBOW`
  279. FOR EACH ROW BEGIN
  280. IF NEW.`PARENT_ID`!=OLD.`PARENT_ID` or NEW.`DESC`!=OLD.`DESC` THEN
  281. -- throw warning to update all pathes in `CRM_LISTA_ZASOBOW` with path under current?
  282. IF (select count(1) from `CRM_LISTA_ZASOBOW` p where p.`PARENT_ID`=NEW.ID) > 0 THEN
  283. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixZasobPath'
  284. and `msg`='Update all paths'
  285. and `uiTargetType`='default_db_table'
  286. and `uiTargetName`='CRM_LISTA_ZASOBOW'
  287. and `A_STATUS`='WAITING'
  288. ) = 0 THEN
  289. INSERT INTO `CRM_UI_MSGS` (`ID`
  290. , `app_className`, `msg`, `msgType`
  291. , `uiTargetType`, `uiTargetName`
  292. , `userTargetType`
  293. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  294. VALUES (NULL
  295. , 'FixZasobPath', 'Update all paths', 'danger'
  296. , 'default_db_table', 'CRM_LISTA_ZASOBOW'
  297. , 'everyone'
  298. , NOW(), NEW.A_RECORD_UPDATE_AUTHOR
  299. );
  300. END IF;
  301. UPDATE `P5-MSG:Route_FixZasobPath:WARNING: Update all paths` SET x=1;
  302. END IF;
  303. END IF;
  304. END
  305. ";
  306. $sqlList['RemoveTrigger_BeforeInsertWskaznik'] = "DROP TRIGGER IF EXISTS `_CRM_WSKAZNIK_tree_INSERT`";
  307. $sqlList['CreateTrigger_BeforeInsertWskaznik'] = "
  308. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_WSKAZNIK_tree_INSERT` BEFORE INSERT ON `CRM_WSKAZNIK`
  309. FOR EACH ROW BEGIN
  310. IF NEW.ID_ZASOB IS NOT NULL and NEW.ID_ZASOB>0 THEN
  311. -- SET NEW.path_CRM_LISTA_ZASOBOW = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID_ZASOB);
  312. SET NEW.`path_CRM_LISTA_ZASOBOW` = (select coalesce(
  313. (select p.`path` from `CRM_LISTA_ZASOBOW` p where p.`ID`=NEW.`ID_ZASOB` limit 1)
  314. , '?'));
  315. END IF;
  316. END
  317. ";
  318. $sqlList['RemoveTrigger_BeforeUpdateWskaznik'] = "DROP TRIGGER IF EXISTS `_CRM_WSKAZNIK_tree_UPDATE`";
  319. $sqlList['CreateTrigger_BeforeUpdateWskaznik'] = "
  320. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_WSKAZNIK_tree_UPDATE` BEFORE UPDATE ON `CRM_WSKAZNIK`
  321. FOR EACH ROW BEGIN
  322. IF NEW.ID_ZASOB IS NULL THEN
  323. SET NEW.path_CRM_LISTA_ZASOBOW = '';
  324. ELSEIF OLD.ID_ZASOB IS NULL or NEW.ID_ZASOB<>OLD.ID_ZASOB THEN
  325. -- SET NEW.path_CRM_LISTA_ZASOBOW = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID_ZASOB);
  326. IF NEW.ID_ZASOB>0 THEN
  327. SET NEW.`path_CRM_LISTA_ZASOBOW` = (select coalesce(
  328. (select p.`path` from `CRM_LISTA_ZASOBOW` p where p.`ID`=NEW.`ID_ZASOB` limit 1)
  329. , '?'));
  330. ELSE
  331. SET NEW.`path_CRM_LISTA_ZASOBOW` = '';
  332. END IF;
  333. END IF;
  334. END
  335. ";
  336. $sqlList['RemoveEvent_everyDay'] = "DROP EVENT IF EXISTS `_CRM_LISTA_ZASOBOW__CRM_WSKAZNIK_tree_event`";
  337. $sqlList['CreateEvent_everyDay'] = "
  338. CREATE EVENT `_CRM_LISTA_ZASOBOW__CRM_WSKAZNIK_tree_event`
  339. ON SCHEDULE EVERY 1 DAY STARTS '2015-05-15 05:00:00'
  340. ON COMPLETION NOT PRESERVE ENABLE
  341. DO BEGIN
  342. call `update_zasob_path_idx_rec`();
  343. END
  344. ";
  345. $db = DB::getDB();
  346. if ($db->has_errors()) {
  347. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  348. }
  349. foreach ($sqlList as $sqlName => $sql) {
  350. $res = $db->query($sql);
  351. if ($db->has_errors()) {
  352. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  353. }
  354. }
  355. }
  356. /*
  357. Table 'DB.P5-MSG:Route_FixZasobPath:WARNING: Update all paths' doesn't exist
  358. Table 'DB.P5-MSG:Route_FixZasobPath:ERROR: Loop detected ID=P_ID' doesn't exist
  359. Table 'DB.P5-MSG:Route_FixZasobPath:ERROR: Parent item not exists' doesn't exist
  360. Table 'DB.P5-MSG:Route_FixZasobPath:ERROR: Loop detected in path' doesn't exist
  361. */
  362. public function parseMessageFromStorage($msg) {
  363. switch ($msg) {
  364. case 'WARNING: Update all paths': {
  365. $msg = "Zaktualizuj ścieżki zasobów!";
  366. break;
  367. }
  368. case 'ERROR: Loop detected ID=P_ID': {
  369. $msg = "Nr rekordu nadrzędnego musi różnić się od nr rekordu";
  370. break;
  371. }
  372. case 'ERROR: Parent item not exists': {
  373. $msg = "Nie istnieje rekord o numerze podanym jako nr nadrzędny";
  374. break;
  375. }
  376. case 'ERROR: Loop detected in path': {
  377. $msg = "Nieprawidłowy nr nadrzędny";
  378. break;
  379. }
  380. }
  381. return $msg;
  382. }
  383. public function parseMessageFromMsgsSystem($msg) {
  384. switch ($msg) {
  385. case 'Update all paths': {
  386. $msg = "Zaktualizuj ścieżki zasobów";
  387. break;
  388. }
  389. }
  390. return $msg;
  391. }
  392. public function runByMessageFromMsgsSystem($msg, &$execNotes) {
  393. switch ($msg) {
  394. case 'Update all paths': {
  395. $execNotes .= 'call procedure... ';
  396. $this->_callProcedure();
  397. $execNotes .= ' done';
  398. break;
  399. }
  400. }
  401. }
  402. }
  403. /**
  404. * Old triggers before 2015-06-16:
  405. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_INSERT` BEFORE INSERT ON `CRM_LISTA_ZASOBOW`
  406. FOR EACH ROW BEGIN
  407. SET NEW.path = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.PARENT_ID);
  408. END
  409. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_LISTA_ZASOBOW_tree_UPDATE` BEFORE UPDATE ON `CRM_LISTA_ZASOBOW`
  410. FOR EACH ROW BEGIN
  411. IF NEW.PARENT_ID<>OLD.PARENT_ID or NEW.`DESC`<>OLD.`DESC` THEN
  412. SET NEW.path = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.PARENT_ID);
  413. update CRM_WSKAZNIK ik set ik.path_CRM_LISTA_ZASOBOW=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID) where path_CRM_LISTA_ZASOBOW like concat('%',NEW.ID,'%');
  414. -- update CRM_LISTA_ZASOBOW ik set ik.path=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', ik.ID) where path like concat('%',OLD.`DESC`,'%') and ik.ID<>OLD.ID;
  415. END IF;
  416. END
  417. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_WSKAZNIK_tree_INSERT` BEFORE INSERT ON `CRM_WSKAZNIK`
  418. FOR EACH ROW BEGIN
  419. SET NEW.path_CRM_LISTA_ZASOBOW = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID_ZASOB);
  420. END
  421. CREATE DEFINER=`root`@`localhost` TRIGGER `_CRM_WSKAZNIK_tree_UPDATE` BEFORE UPDATE ON `CRM_WSKAZNIK`
  422. FOR EACH ROW BEGIN
  423. IF NEW.ID_ZASOB<>OLD.ID_ZASOB THEN
  424. SET NEW.path_CRM_LISTA_ZASOBOW = CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/', NEW.ID_ZASOB);
  425. END IF;
  426. END
  427. CREATE EVENT `_CRM_LISTA_ZASOBOW__CRM_WSKAZNIK_tree_event` ON SCHEDULE EVERY 1 DAY STARTS '2015-05-15 05:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN
  428. update CRM_LISTA_ZASOBOW set path=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/',ID);
  429. update CRM_WSKAZNIK set path_CRM_LISTA_ZASOBOW=CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path('/',ID_ZASOB);
  430. END
  431. CREATE DEFINER=`root`@`localhost` FUNCTION `CRM_LISTA_ZASOBOW_hierarchy_sys_connect_by_path`(`delimiter` TEXT, `node` INT) RETURNS text CHARSET latin2
  432. READS SQL DATA
  433. BEGIN
  434. DECLARE _path TEXT;
  435. DECLARE _type CHAR(255);
  436. DECLARE _lvl INT;
  437. DECLARE _cpath TEXT;
  438. DECLARE _id INT;
  439. DECLARE _id_cur INT;
  440. DECLARE EXIT HANDLER FOR NOT FOUND RETURN _path;
  441. SET _id = COALESCE(node, @id);
  442. SET _path = '';
  443. SET _lvl=1;
  444. the_loop: LOOP
  445. SET _lvl =_lvl+1;
  446. IF _lvl>100 THEN
  447. RETURN concat('ERROR',_path);
  448. LEAVE the_loop;
  449. END IF;
  450. SELECT PARENT_ID,`DESC`,ID
  451. INTO _id,_type,_id_cur
  452. FROM CRM_LISTA_ZASOBOW
  453. WHERE id = _id AND COALESCE(id <> @start_with, TRUE);
  454. SET _path = CONCAT(_type, delimiter, _path);
  455. END LOOP the_loop;
  456. END
  457. */