SimulateDBTask.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. /**
  3. * table `_DB_TASKS`
  4. * int ID
  5. * str(30) A_RECORD_CREATE_DATE
  6. * str(40) A_RECORD_CREATE_AUTHOR
  7. * str(30) A_RECORD_UPDATE_DATE
  8. * str(40) A_RECORD_UPDATE_AUTHOR
  9. * str TRANSACTION_ID - uniq? task transaction id
  10. * str DB_TABLE
  11. * text DB_OBJ
  12. * text PARAMS
  13. * int RESULT_ID
  14. * int TASK_DONE - default 0, if done 1
  15. *
  16. CREATE TABLE IF NOT EXISTS `_DB_TASKS` (
  17. `ID` int(11) NOT NULL AUTO_INCREMENT,
  18. `A_RECORD_CREATE_DATE` varchar(30) NOT NULL,
  19. `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL,
  20. `A_RECORD_UPDATE_DATE` varchar(30) NOT NULL,
  21. `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL,
  22. `TRANSACTION_ID` varchar(255) NOT NULL,
  23. `TASK` VARCHAR(32) NOT NULL,
  24. `DB_TABLE` varchar(255) NOT NULL,
  25. `DB_OBJ` text NOT NULL,
  26. `PARAMS` text NOT NULL,
  27. `RESULT_ID` int(11) NOT NULL DEFAULT '0',
  28. `TASK_DONE` int(11) NOT NULL DEFAULT '0',
  29. PRIMARY KEY (`ID`)
  30. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;
  31. */
  32. class SimulateDBTask {
  33. var $_db = null;
  34. var $_tbl = '_DB_TASKS';
  35. var $_transaction_id = null;
  36. var $_create_date = null;
  37. var $_task_list = array();
  38. function __construct($db, $transaction_id) {
  39. $this->_db = $db;
  40. $this->_transaction_id = $transaction_id;
  41. $this->_create_date = date('Y-m-d-H:i:s');
  42. }
  43. /**
  44. * Add database task.
  45. *
  46. * @returns int - task id
  47. */
  48. function add($task, $table, $obj, $params = array()) {
  49. $sql_data = array();
  50. $sql_data["`A_RECORD_CREATE_DATE`"] = "'{$this->_create_date}'";
  51. $sql_data["`A_RECORD_CREATE_AUTHOR`"] = "'" . User::getName() . "'";
  52. $sql_data["`TRANSACTION_ID`"] = "'{$this->_transaction_id}'";
  53. $sql_data["`TASK`"] = "'{$task}'";
  54. $sql_data["`DB_TABLE`"] = "'{$table}'";
  55. $sql_data["`DB_OBJ`"] = "'" . $this->_decode_obj($obj) . "'";
  56. $sql_data["`PARAMS`"] = "'" . $this->_decode_obj($params) . "'";
  57. $sql_data["`TASK_DONE`"] = "'0'";
  58. $sql = "insert into `{$this->_tbl}` (" . implode(", ", array_keys($sql_data)) . ") values (" . implode(", ", array_values($sql_data)) . ");";
  59. $this->_db->query($sql);
  60. return $this->_db->insert_id();
  61. }
  62. function has_todo() {
  63. $tasks = $this->_fetch_task_list();
  64. $undone = 0;
  65. foreach ($tasks as $key => $val) {
  66. if ($val->TASK_DONE == 0) {
  67. $undone++;
  68. }
  69. }
  70. return ($undone > 0);
  71. }
  72. function has_tasks() {
  73. $tasks = $this->_fetch_task_list();
  74. return !empty($tasks);
  75. }
  76. function _fetch_task_list($force = false) {
  77. $this->_task_list = array();
  78. if (!empty($this->_task_list) && $force == false) {
  79. return $this->_task_list;
  80. }
  81. $sql = "select t.*
  82. from `{$this->_tbl}` as t
  83. where
  84. t.`TRANSACTION_ID`='{$this->_transaction_id}'
  85. order by `ID` ASC
  86. ";
  87. $res = $this->_db->query($sql);
  88. while ($r = $this->_db->fetch($res)) {
  89. $this->_task_list [$r->ID]= $r;
  90. }
  91. return $this->_task_list;
  92. }
  93. function get_result($task_id) {
  94. $this->_fetch_task_list();
  95. if (!array_key_exists($task_id, $this->_task_list)) {
  96. return null;
  97. }
  98. return $this->_task_list[$task_id]->RESULT_ID;
  99. }
  100. function set_result($task_id, $res_id) {
  101. $sql_data = array();
  102. $sql_data[] = "`A_RECORD_UPDATE_DATE`='" . date('Y-m-d-H:i:s') ."'";
  103. $sql_data[] = "`A_RECORD_UPDATE_AUTHOR`='" . User::getName() . "'";
  104. $sql_data[] = "`RESULT_ID`='{$res_id}'";
  105. $sql_data[] = "`TASK_DONE`='1'";
  106. $sql = "update `{$this->_tbl}` set " . implode("\n , ", $sql_data) . " where ID='{$task_id}';";
  107. $this->_db->query($sql);
  108. $this->_task_list[$task_id]->RESULT_ID = $res_id;
  109. }
  110. function force_run_task($task_id) {
  111. $tasks = $this->_fetch_task_list();
  112. if (empty($tasks)) {
  113. echo 'Brak tasków';
  114. return true;
  115. }
  116. if (empty($tasks[$task_id])) {
  117. echo 'Brak taska';
  118. return true;
  119. }
  120. $v_task = $tasks[$task_id];
  121. // encode all obj and params
  122. // run task, save result
  123. $v_task->DB_OBJ = $this->_encode_obj($v_task->DB_OBJ);
  124. $v_task->params_arr = $this->_encode_to_arr($v_task->PARAMS);
  125. if (!empty($v_task->params_arr)) {
  126. foreach ($v_task->params_arr as $k_field => $v_res_id) {
  127. $v_task->DB_OBJ->$k_field = $this->get_result($v_res_id);
  128. }
  129. }
  130. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">tasks['.$task_id.'] (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task);echo'</pre>';
  131. if ($v_task->RESULT_ID > 0) {
  132. echo 'Task został juz wykonany wcześniej - wynik ' . $v_task->RESULT_ID;
  133. return true;
  134. }
  135. echo 'running task';
  136. $k_task_id = $task_id;
  137. switch ($v_task->TASK) {
  138. case 'UPDATE_OBJ':
  139. echo '<p>' . "TODO: Run task ID {$k_task_id}: \$this->_db->UPDATE_OBJ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  140. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  141. $affected = $this->_db->UPDATE_OBJ($v_task->DB_TABLE, $v_task->DB_OBJ);
  142. echo '<p>'."result: $affected".'</p>';
  143. $this->set_result($k_task_id, $affected);
  144. break;
  145. case 'ADD_NEW_OBJ':
  146. echo '<p>' . "TODO: Run task ID {$k_task_id}: \$this->_db->ADD_NEW_OBJ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  147. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  148. $new_id = $this->_db->ADD_NEW_OBJ($v_task->DB_TABLE, $v_task->DB_OBJ);
  149. echo '<p>'."result: $new_id".'</p>';
  150. $this->set_result($k_task_id, $new_id);
  151. break;
  152. case 'INSERT':
  153. echo '<p>' . "TODO: Run task ID {$k_task_id}: insert ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  154. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  155. $task_arr = (array)$v_task->DB_OBJ;
  156. $sql_arr = array();
  157. foreach ($task_arr as $key => $val) {
  158. $sql_arr["`{$key}`"] = "'{$val}'";
  159. }
  160. $sql = "insert into `{$v_task->DB_TABLE}` (" . implode(',', array_keys($sql_arr)) . ") values (" . implode(',', array_values($sql_arr)) . ");";
  161. $this->_db->query($sql);
  162. $new_id = $this->_db->insert_id();
  163. echo '<p>'."result: $new_id".'</p>';
  164. $this->set_result($k_task_id, $new_id);
  165. break;
  166. default:
  167. echo '<p>'."Unknown task ({$v_task->TASK}) for ID = {$k_task_id}".'</p>';
  168. }
  169. }
  170. function run() {
  171. $tasks = $this->_fetch_task_list();
  172. if (empty($tasks)) {
  173. return true;
  174. }
  175. foreach ($tasks as $k_task_id => $v_task) {
  176. if ($v_task->TASK_DONE) {
  177. continue;
  178. }
  179. // encode all obj and params
  180. // run task, save result
  181. $v_task->DB_OBJ = $this->_encode_obj($v_task->DB_OBJ);
  182. $v_task->params_arr = $this->_encode_to_arr($v_task->PARAMS);
  183. if (!empty($v_task->params_arr)) {
  184. foreach ($v_task->params_arr as $k_field => $v_res_id) {
  185. $v_task->DB_OBJ->$k_field = $this->get_result($v_res_id);
  186. }
  187. }
  188. switch ($v_task->TASK) {
  189. case 'UPDATE_OBJ':
  190. echo '<p>' . "TODO: Run task ID {$k_task_id}: \$this->_db->UPDATE_OBJ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  191. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  192. $affected = $this->_db->UPDATE_OBJ($v_task->DB_TABLE, $v_task->DB_OBJ);
  193. echo '<p>'."result: $affected".'</p>';
  194. $this->set_result($k_task_id, $affected);
  195. break;
  196. case 'ADD_NEW_OBJ':
  197. echo '<p>' . "TODO: Run task ID {$k_task_id}: \$this->_db->ADD_NEW_OBJ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  198. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  199. $new_id = $this->_db->ADD_NEW_OBJ($v_task->DB_TABLE, $v_task->DB_OBJ);
  200. echo '<p>'."result: $new_id".'</p>';
  201. $this->set_result($k_task_id, $new_id);
  202. break;
  203. case 'INSERT':
  204. echo '<p>' . "TODO: Run task ID {$k_task_id}: insert ('{$v_task->DB_TABLE}', DB_OBJ)" . '</p>';
  205. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">DB_OBJ (F.' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($v_task->DB_OBJ);echo'</pre>';
  206. $task_arr = (array)$v_task->DB_OBJ;
  207. $sql_arr = array();
  208. foreach ($task_arr as $key => $val) {
  209. $sql_arr["`{$key}`"] = "'{$val}'";
  210. }
  211. $sql = "insert into `{$v_task->DB_TABLE}` (" . implode(',', array_keys($sql_arr)) . ") values (" . implode(',', array_values($sql_arr)) . ");";
  212. $this->_db->query($sql);
  213. $new_id = $this->_db->insert_id();
  214. echo '<p>'."result: $new_id".'</p>';
  215. $this->set_result($k_task_id, $new_id);
  216. break;
  217. default:
  218. echo '<p>'."Unknown task ({$v_task->TASK}) for ID = {$k_task_id}".'</p>';
  219. }
  220. }
  221. }
  222. function _decode_obj($obj) {
  223. $lines = array();
  224. foreach ($obj as $k_field => $v_value) {
  225. $lines[] = "{$k_field}: {$v_value}";
  226. }
  227. return implode("\n", $lines);
  228. }
  229. function _encode_to_arr($str) {
  230. $ret = array();
  231. if (empty($str)) {
  232. return null;
  233. }
  234. $lines = explode("\n", $str);
  235. foreach ($lines as $v_line) {
  236. $v_args = explode(': ', $v_line, 2);
  237. // TODO: BUG A_PROBLEM_DESC: "ANEKS - Stare dane: ..." i w nowej linii "ANEKS - Stare dane: ..." z popdzedniego wpisu
  238. // if (false != strpos(' ', $v_args[0])) {
  239. // continue;
  240. // }
  241. $ret[ $v_args[0] ] = $v_args[1];
  242. }
  243. return $ret;
  244. }
  245. function _encode_obj($str) {
  246. if (empty($str)) {
  247. return null;
  248. }
  249. $ret = $this->_encode_to_arr($str);
  250. return (object)$ret;
  251. }
  252. function get_tasks() {
  253. $tasks = $this->_fetch_task_list();
  254. return $tasks;
  255. }
  256. }