DbVersionInfo.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Module;
  7. use Magento\Framework\Setup\ModuleDataSetupInterface;
  8. /**
  9. * Class DbVersionInfo
  10. *
  11. */
  12. class DbVersionInfo
  13. {
  14. /**#@+
  15. * Constants defined for keys of version info array
  16. */
  17. const KEY_MODULE = 'module';
  18. const KEY_TYPE = 'type';
  19. const KEY_CURRENT = 'current';
  20. const KEY_REQUIRED = 'required';
  21. /**#@-*/
  22. /**#@-*/
  23. private $moduleList;
  24. /**
  25. * @var ResourceInterface
  26. */
  27. private $moduleResource;
  28. /**
  29. * @var array
  30. */
  31. private $dbVersionErrorsCache = null;
  32. /**
  33. * @param ModuleListInterface $moduleList
  34. * @param ResourceInterface $moduleResource
  35. */
  36. public function __construct(
  37. ModuleListInterface $moduleList,
  38. ResourceInterface $moduleResource
  39. ) {
  40. $this->moduleList = $moduleList;
  41. $this->moduleResource = $moduleResource;
  42. }
  43. /**
  44. * Check if DB schema is up to date
  45. *
  46. * @param string $moduleName
  47. * @return bool
  48. */
  49. public function isSchemaUpToDate($moduleName)
  50. {
  51. $dbVer = $this->moduleResource->getDbVersion($moduleName);
  52. return $this->isModuleVersionEqual($moduleName, $dbVer);
  53. }
  54. /**
  55. * @param string $moduleName
  56. * @return bool
  57. */
  58. public function isDataUpToDate($moduleName)
  59. {
  60. $dataVer = $this->moduleResource->getDataVersion($moduleName);
  61. return $this->isModuleVersionEqual($moduleName, $dataVer);
  62. }
  63. /**
  64. * Check if DB schema is up to date, version info if it is not.
  65. *
  66. * @param string $moduleName
  67. * @return string[] Contains current and needed version strings
  68. */
  69. private function getSchemaInfo($moduleName)
  70. {
  71. $dbVer = $this->moduleResource->getDbVersion($moduleName); // version saved in DB
  72. $module = $this->moduleList->getOne($moduleName);
  73. $configVer = $module['setup_version'];
  74. $dbVer = $dbVer ?: 'none';
  75. return [
  76. self::KEY_CURRENT => $dbVer,
  77. self::KEY_REQUIRED => $configVer,
  78. self::KEY_MODULE => $moduleName,
  79. self::KEY_TYPE => 'schema'
  80. ];
  81. }
  82. /**
  83. * Get array of errors if DB is out of date, return [] if DB is current.
  84. *
  85. * @return string[] Array of errors, each error contains module name, current version, required version,
  86. * and type (schema or data). The array will be empty if all schema and data are current.
  87. */
  88. public function getDbVersionErrors()
  89. {
  90. if ($this->dbVersionErrorsCache === null) {
  91. $this->dbVersionErrorsCache = [];
  92. foreach ($this->moduleList->getNames() as $moduleName) {
  93. if (!$this->isSchemaUpToDate($moduleName)) {
  94. $this->dbVersionErrorsCache[] = $this->getSchemaInfo($moduleName);
  95. }
  96. if (!$this->isDataUpToDate($moduleName)) {
  97. $this->dbVersionErrorsCache[] = $this->getDataInfo($moduleName);
  98. }
  99. }
  100. }
  101. return $this->dbVersionErrorsCache;
  102. }
  103. /**
  104. * Get error data for an out-of-date schema or data.
  105. *
  106. * @param string $moduleName
  107. * @return string[]
  108. */
  109. private function getDataInfo($moduleName)
  110. {
  111. $dataVer = $this->moduleResource->getDataVersion($moduleName);
  112. $module = $this->moduleList->getOne($moduleName);
  113. $configVer = $module['setup_version'];
  114. $dataVer = $dataVer ?: 'none';
  115. return [
  116. self::KEY_CURRENT => $dataVer,
  117. self::KEY_REQUIRED => $configVer,
  118. self::KEY_MODULE => $moduleName,
  119. self::KEY_TYPE => 'data'
  120. ];
  121. }
  122. /**
  123. * Check if DB data is up to date
  124. *
  125. * @param string $moduleName
  126. * @param string|bool $version
  127. * @return bool
  128. */
  129. private function isModuleVersionEqual($moduleName, $version)
  130. {
  131. $module = $this->moduleList->getOne($moduleName);
  132. $configVer = isset($module['setup_version']) ? $module['setup_version'] : null;
  133. if (empty($configVer)) {
  134. /**
  135. * If setup_version was removed, this means that we want to ignore old scripts and do installation only
  136. * with declarative schema and data/schema patches
  137. */
  138. return true;
  139. }
  140. return version_compare($configVer, $version) === ModuleDataSetupInterface::VERSION_COMPARE_EQUAL;
  141. }
  142. }