elysia_cron_update.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?php
  2. /*******************************************************************************
  3. * ELYSIA CRON VERSION UPDATE
  4. ******************************************************************************/
  5. function elysia_cron_check_version_update() {
  6. $ver = variable_get('elysia_cron_version', 0);
  7. if ($ver < 20111012) {
  8. $ver = _ec_variable_get('elysia_cron_version', 0);
  9. }
  10. if (!$ver || $ver < 20090218) {
  11. $unchanged = array(
  12. 'elysia_cron_last_context',
  13. 'elysia_cron_last_run',
  14. 'elysia_cron_disabled',
  15. 'elysia_cron_semaphore',
  16. 'elysia_cron_key',
  17. 'elysia_cron_allowed_hosts',
  18. 'elysia_cron_default_rule',
  19. 'elysia_cron_script',
  20. 'elysia_cron_runtime_replacement',
  21. 'elysia_cron_version',
  22. );
  23. $rs = db_query("select * from {variable} where name like 'elysia_cron_%%'");
  24. while ($v = db_fetch_object($rs)) {
  25. if (!in_array($v->name, $unchanged)) {
  26. $vn = false;
  27. if (preg_match('/^elysia_cron_ctx_(.*)_(running|disabled|last_run|last_aborted|abort_count|execution_count|last_execution_time|avg_execution_time|max_execution_time|last_shutdown_time|last_abort_function)/', $v->name, $r)) {
  28. switch ($r[2]) {
  29. case 'running':
  30. $vn = 'ecc_' . _ec_get_name($r[1]) . '_r';
  31. break;
  32. case 'disabled':
  33. $vn = 'ecc_' . _ec_get_name($r[1]) . '_d';
  34. break;
  35. case 'last_run':
  36. $vn = 'ecc_' . _ec_get_name($r[1]) . '_lr';
  37. break;
  38. case 'last_aborted':
  39. $vn = 'ecc_' . _ec_get_name($r[1]) . '_la';
  40. break;
  41. case 'abort_count':
  42. $vn = 'ecc_' . _ec_get_name($r[1]) . '_ac';
  43. break;
  44. case 'execution_count':
  45. $vn = 'ecc_' . _ec_get_name($r[1]) . '_ec';
  46. break;
  47. case 'last_execution_time':
  48. $vn = 'ecc_' . _ec_get_name($r[1]) . '_let';
  49. break;
  50. case 'avg_execution_time':
  51. $vn = 'ecc_' . _ec_get_name($r[1]) . '_aet';
  52. break;
  53. case 'max_execution_time':
  54. $vn = 'ecc_' . _ec_get_name($r[1]) . '_met';
  55. break;
  56. case 'last_shutdown_time':
  57. $vn = 'ecc_' . _ec_get_name($r[1]) . '_lst';
  58. break;
  59. case 'last_abort_function':
  60. $vn = 'ecc_' . _ec_get_name($r[1]) . '_laf';
  61. break;
  62. }
  63. }
  64. elseif (preg_match('/^elysia_cron_(.*)_(rule|disabled|context|running|last_run|last_execution_time|execution_count|avg_execution_time|max_execution_time)/', $v->name, $r)) {
  65. switch ($r[2]) {
  66. case 'rule':
  67. $vn = 'ec_' . _ec_get_name($r[1]) . '_rul';
  68. break;
  69. case 'disabled':
  70. $vn = 'ec_' . _ec_get_name($r[1]) . '_d';
  71. break;
  72. case 'context':
  73. $vn = 'ec_' . _ec_get_name($r[1]) . '_c';
  74. break;
  75. case 'running':
  76. $vn = 'ec_' . _ec_get_name($r[1]) . '_r';
  77. break;
  78. case 'last_run':
  79. $vn = 'ec_' . _ec_get_name($r[1]) . '_lr';
  80. break;
  81. case 'last_execution_time':
  82. $vn = 'ec_' . _ec_get_name($r[1]) . '_let';
  83. break;
  84. case 'execution_count':
  85. $vn = 'ec_' . _ec_get_name($r[1]) . '_ec';
  86. break;
  87. case 'avg_execution_time':
  88. $vn = 'ec_' . _ec_get_name($r[1]) . '_aet';
  89. break;
  90. case 'max_execution_time':
  91. $vn = 'ec_' . _ec_get_name($r[1]) . '_met';
  92. break;
  93. }
  94. }
  95. if ($vn) {
  96. variable_set($vn, unserialize($v->value));
  97. }
  98. else {
  99. elysia_cron_error('Error in update, cant convert %name (value: %value)', array('%name' => $v->name, '%value' => $v->value), true);
  100. }
  101. variable_del($v->name);
  102. }
  103. }
  104. variable_set('elysia_cron_version', 20090218);
  105. }
  106. if ($ver < 20090920) {
  107. variable_set('elysia_cron_version', 20090920);
  108. }
  109. if ($ver < 20100507) {
  110. if (EC_DRUPAL_VERSION >= 6) {
  111. // D6
  112. drupal_install_schema('elysia_cron');
  113. // In ver 20111020 disabled has been renamed to disable, revert it now
  114. if (EC_DRUPAL_VERSION >= 7) {
  115. // D7
  116. // Must use "$v" for PHP5.3 running D6 version (detect the error even if it doesn't pass here)
  117. db_change_field($v = 'elysia_cron', 'disable', 'disabled', array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE));
  118. }
  119. elseif (EC_DRUPAL_VERSION >= 6) {
  120. // D6
  121. $ret = array();
  122. db_change_field($ret, 'elysia_cron', 'disable', 'disabled', array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE));
  123. }
  124. }
  125. else {
  126. // D5
  127. switch ($GLOBALS['db_type']) {
  128. case 'mysqli':
  129. case 'mysql':
  130. db_query("create table if not exists {elysia_cron} (
  131. name varchar(120) not null,
  132. disabled tinyint(1) not null default '0',
  133. rule varchar(32),
  134. weight int(11) not null default '0',
  135. context varchar(32),
  136. running int(11) not null default '0',
  137. last_run int(11) not null default '0',
  138. last_aborted tinyint(1) not null default '0',
  139. abort_count int(11) not null default '0',
  140. last_abort_function varchar(32),
  141. last_execution_time int(11) not null default '0',
  142. execution_count int(11) not null default '0',
  143. avg_execution_time float(5,2) not null default '0',
  144. max_execution_time int(11) not null default '0',
  145. last_shutdown_time int(11) not null default '0',
  146. primary key (name)
  147. )");
  148. break;
  149. case 'pgsql':
  150. db_query("create table {elysia_cron} (
  151. name varchar(120) not null,
  152. disabled smallint not null default '0',
  153. rule varchar(32),
  154. weight integer not null default '0',
  155. context varchar(32),
  156. running int not null default '0',
  157. last_run integer not null default '0',
  158. last_aborted smallint not null default '0',
  159. abort_count integer not null default '0',
  160. last_abort_function varchar(32),
  161. last_execution_time integer not null default '0',
  162. execution_count integer not null default '0',
  163. avg_execution_time float not null default '0',
  164. max_execution_time integer not null default '0',
  165. last_shutdown_time integer not null default '0',
  166. primary key (name)
  167. )");
  168. }
  169. }
  170. $rs = db_query("select * from {variable} where name like 'ec_%%' or name like 'ecc_%%'");
  171. $data = array();
  172. $todelete = array();
  173. while ($v = db_fetch_object($rs)) {
  174. $name = false;
  175. if (preg_match('/^ecc_(.+)_(r|d|lr|la|ac|ec|let|aet|met|lst|laf)/', $v->name, $r)) {
  176. $name = ':' . $r[1];
  177. }
  178. elseif (preg_match('/^ec_(.+)_(rul|d|c|w|r|lr|let|ec|aet|met)/', $v->name, $r)) {
  179. $name = $r[1];
  180. }
  181. if ($name) {
  182. if (!isset($data[$name])) {
  183. $data[$name] = array('name' => $name);
  184. }
  185. switch ($r[2]) {
  186. case 'r':
  187. $f = 'running';
  188. break;
  189. case 'd':
  190. $f = 'disabled';
  191. break;
  192. case 'rul':
  193. $f = 'rule';
  194. break;
  195. case 'w':
  196. $f = 'weight';
  197. break;
  198. case 'c':
  199. $f = 'context';
  200. break;
  201. case 'lr':
  202. $f = 'last_run';
  203. break;
  204. case 'la':
  205. $f = 'last_aborted';
  206. break;
  207. case 'ac':
  208. $f = 'abort_count';
  209. break;
  210. case 'laf':
  211. $f = 'last_abort_function';
  212. break;
  213. case 'let':
  214. $f = 'last_execution_time';
  215. break;
  216. case 'ec':
  217. $f = 'execution_count';
  218. break;
  219. case 'aet':
  220. $f = 'avg_execution_time';
  221. break;
  222. case 'met':
  223. $f = 'max_execution_time';
  224. break;
  225. case 'lst':
  226. $f = 'last_shutdown_time';
  227. break;
  228. }
  229. $data[$name][$f] = unserialize($v->value);
  230. $todelete[] = $v->name;
  231. }
  232. }
  233. $ifields = array('disabled', 'weight', 'running', 'last_run', 'last_aborted', 'abort_count', 'last_execution_time', 'execution_count', 'avg_execution_time', 'max_execution_time', 'last_shutdown_time');
  234. foreach ($data as $v) {
  235. foreach ($ifields as $f) {
  236. if (empty($v[$f])) {
  237. $v[$f] = 0;
  238. }
  239. }
  240. db_query("insert into {elysia_cron} (name, disabled, rule, weight, context, running, last_run, last_aborted, abort_count, last_abort_function, last_execution_time, execution_count, avg_execution_time, max_execution_time, last_shutdown_time)
  241. values ('%s', %d, '%s', %d, '%s', %d, %d, %d, %d, '%s', %d, %d, %f, %d, %d)",
  242. $v['name'], $v['disabled'], $v['rule'], $v['weight'], $v['context'], $v['running'], $v['last_run'], $v['last_aborted'], $v['abort_count'], $v['last_abort_function'], $v['last_execution_time'], $v['execution_count'], $v['avg_execution_time'], $v['max_execution_time'], $v['last_shutdown_time']
  243. );
  244. }
  245. db_query("update {elysia_cron} set context = null where context = ''");
  246. db_query("update {elysia_cron} set rule = null where rule = ''");
  247. foreach ($todelete as $v) {
  248. variable_del($v);
  249. db_query("DELETE FROM {variable} WHERE name = '%s'", $v);
  250. }
  251. variable_set('elysia_cron_version', 20100507);
  252. unset($GLOBALS['_ec_variables']);
  253. }
  254. // D7 VERSION FROM NOW ON...
  255. if ($ver < 20110323) {
  256. if (EC_DRUPAL_VERSION >= 7) {
  257. // D7
  258. // Must use "$v" for PHP5.3 running D6 version (detect the error even if it doesn't pass here)
  259. db_change_field($v = 'elysia_cron', 'weight', 'weight', array('type' => 'int', 'not null' => FALSE));
  260. }
  261. elseif (EC_DRUPAL_VERSION >= 6) {
  262. // D6
  263. $ret = array();
  264. db_change_field($ret, 'elysia_cron', 'weight', 'weight', array('type' => 'int', 'not null' => FALSE));
  265. }
  266. else {
  267. // D5
  268. db_query("alter table {elysia_cron} change weight weight int(11)");
  269. }
  270. variable_set('elysia_cron_version', 20110323);
  271. }
  272. if ($ver < 20111007) {
  273. $default_rules = variable_get('elysia_cron_default_rules', $GLOBALS['elysia_cron_default_rules']);
  274. if (!empty($default_rules['*/6 * * * *']) && $default_rules['*/6 * * * *'] == 'Every 6 hours') {
  275. unset($default_rules['*/6 * * * *']);
  276. $default_rules['0 */6 * * *'] = 'Every 6 hours';
  277. variable_set('elysia_cron_default_rules', $default_rules);
  278. }
  279. variable_set('elysia_cron_version', 20111007);
  280. }
  281. if ($ver < 20111012) {
  282. // I only need to rebuild variable cache, so i just set the new version
  283. variable_set('elysia_cron_version', 20111012);
  284. }
  285. if ($ver < 20111020) {
  286. if (EC_DRUPAL_VERSION >= 7) {
  287. // D7
  288. // Must use "$v" for PHP5.3 running D6 version (detect the error even if it doesn't pass here)
  289. db_change_field($v = 'elysia_cron', 'disabled', 'disable', array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE));
  290. }
  291. elseif (EC_DRUPAL_VERSION >= 6) {
  292. // D6
  293. $ret = array();
  294. db_change_field($ret, 'elysia_cron', 'disabled', 'disable', array('type' => 'int', 'size' => 'tiny', 'not null' => FALSE));
  295. }
  296. else {
  297. // D5
  298. db_query("alter table {elysia_cron} change disabled disable tinyint(1)");
  299. }
  300. db_query("update {elysia_cron} set disable = NULL where disable = 0");
  301. variable_set('elysia_cron_version', 20111020);
  302. }
  303. }