FixZasobPath.php 16 KB

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