Migrator.class.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. class Migrator{
  3. private static $instance;
  4. private $instaled;
  5. private $phisical;
  6. private $uninstall = Array();
  7. private $downgrade = Array();
  8. private $upgrade = Array();
  9. private $install = Array();
  10. private function __construct(){
  11. $this->load_installed_plugins();
  12. $this->load_physical_plugins();
  13. }
  14. private static function newObj(){
  15. if (!isset( self::$instance )) {
  16. self::$instance = new Migrator();
  17. }
  18. return self::$instance;
  19. }
  20. public static function getInstance(){
  21. if (!isset(self::$instance)) {
  22. return self::newObj();
  23. }
  24. return self::$instance;
  25. }
  26. private function save(){
  27. $out = '';
  28. foreach ($this->instaled as $instaled){
  29. $out .= "[$instaled->name]\n";
  30. $out .= "name=$instaled->name\n";
  31. $out .= "version=$instaled->version\n\n";
  32. }
  33. file_put_contents(DIR_CONFIG.'/modules.ini', $out);
  34. }
  35. private function is_satisfy($name, $version){
  36. if(!isset($this->instaled[$name])){
  37. return false;
  38. }
  39. if($this->instaled[$name]->version >= $version){
  40. return true;
  41. }
  42. return false;
  43. }
  44. private function is_satisfy_array($array){
  45. foreach ($array as $item){
  46. if( !self::is_satisfy($item->name, $item->version) ){
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. public function update_plugin_version($name, $version){
  53. echo "Atualizando $name para versão $version\n";
  54. if( isset($this->instaled[$name]) ){
  55. $this->instaled[$name]->version = $version;
  56. return;
  57. }
  58. $this->instaled[$name] = new stdClass();
  59. $this->instaled[$name]->name = $name;
  60. $this->instaled[$name]->version = $version;
  61. }
  62. private function load_installed_plugins(){
  63. $installed = parse_ini_file(DIR_CONFIG.'/modules.ini', true);
  64. foreach ($installed as $key => $item) {
  65. $installed[$key] = (object) $item;
  66. }
  67. return $this->instaled = $installed;
  68. }
  69. private function load_physical_plugins(){
  70. $module_configs = Array();
  71. $plugins = Array();
  72. $rdi = new RecursiveDirectoryIterator(DIR_APP);
  73. foreach(new RecursiveIteratorIterator($rdi) as $file){
  74. if( strpos($file, 'version.php') ){
  75. $module_configs[] = str_replace('version.php','', $file);
  76. }
  77. }
  78. foreach ($module_configs as $module_config) {
  79. $plugin = new stdClass();
  80. include $module_config . 'version.php';
  81. $plugins[$plugin->name] = $plugin;
  82. if(is_file( $module_config . 'db/Migrate.php') ){
  83. //echo 'aaaaaaaaaaaa';
  84. include $module_config . 'db/Migrate.php';
  85. }
  86. }
  87. $this->phisical = $plugins;
  88. }
  89. public function physical_list(){
  90. return $this->phisical;
  91. }
  92. public function installed_list(){
  93. return $this->instaled;
  94. }
  95. public function instal_list(){
  96. return $this->install;
  97. }
  98. public function uninstal_list(){
  99. return $this->uninstall;
  100. }
  101. public function sort_plugins(){
  102. foreach ($this->phisical as $key => $plugin){
  103. if( !isset($this->instaled[$key]) ){
  104. $this->install[] = $plugin;
  105. continue;
  106. }
  107. if( $this->instaled[$key]->version < $plugin->version){
  108. $this->upgrade[] = $plugin;
  109. continue;
  110. }
  111. if( $this->instaled[$key]->version > $plugin->version){
  112. $this->downgrade[] = $plugin;
  113. continue;
  114. }
  115. $this->uninstall[] = $plugin;
  116. }
  117. }
  118. public function execute_plan(){
  119. $status = false;
  120. while(! $status ){
  121. $this->sort_plugins();
  122. $status = true;
  123. foreach ($this->install as $key => $item) {
  124. if( isset($item->require) ){
  125. if( !self::is_satisfy_array($item->require) ){ $status = false; continue; }
  126. }
  127. if(!self::is_satisfy($item->name, $item->version) ){
  128. if(!function_exists($item->name.'_upgrade')){
  129. $this->update_plugin_version($item->name, $item->version);
  130. $this->upgrade[] = $item;
  131. unset($this->install[$key]);
  132. continue;
  133. }
  134. call_user_func($item->name.'_upgrade', 0);
  135. $this->upgrade[] = $this->instaled[$item->name];
  136. unset($this->install[$key]);
  137. $status = false;
  138. }
  139. }
  140. foreach ($this->upgrade as $item) {
  141. if( isset($item->require) ){
  142. if( !self::is_satisfy_array($item->require) ){ $status = false; continue; }
  143. }
  144. if(!self::is_satisfy($item->name, $item->version) ){
  145. if(!function_exists($item->name.'_upgrade')){
  146. $this->update_plugin_version($item->name, $item->version);
  147. continue;
  148. }
  149. call_user_func($item->name.'_upgrade', $this->instaled[$item->name]->version);
  150. $status = false;
  151. }
  152. }
  153. }
  154. $this->save();
  155. }
  156. }