PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/Flux/Installer/Schema.php

https://github.com/chokoleytdesignoper/fluxcp_choko
PHP | 289 lines | 139 code | 34 blank | 116 comment | 18 complexity | b74dd45a7e8a1f76f5ff4c74d1c9cbf0 MD5 | raw file
Possible License(s): LGPL-2.1, LGPL-3.0, BSD-3-Clause
  1. <?php
  2. require_once 'Flux/Installer/SchemaPermissionError.php';
  3. /**
  4. *
  5. */
  6. class Flux_Installer_Schema {
  7. /**
  8. *
  9. */
  10. public $mainServerName;
  11. /**
  12. *
  13. */
  14. public $charMapServerName;
  15. /**
  16. *
  17. */
  18. public $databaseName;
  19. /**
  20. *
  21. */
  22. public $connection;
  23. /**
  24. *
  25. */
  26. public $availableSchemaDir;
  27. /**
  28. *
  29. */
  30. public $installedSchemaDir;
  31. /**
  32. *
  33. */
  34. public $schemaInfo;
  35. /**
  36. *
  37. */
  38. public $latestVersion;
  39. /**
  40. *
  41. */
  42. public $latestVersionInstalled;
  43. /**
  44. *
  45. */
  46. public $versionInstalled = false;
  47. /**
  48. *
  49. */
  50. private function __construct(array $dataArray)
  51. {
  52. $this->mainServerName = $dataArray['mainServerName'];
  53. $this->charMapServerName = $dataArray['charMapServerName'];
  54. $this->databaseName = $dataArray['databaseName'];
  55. $this->connection = $dataArray['connection'];
  56. $this->availableSchemaDir = $dataArray['availableSchemaDir'];
  57. $this->installedSchemaDir = $dataArray['installedSchemaDir'];
  58. $this->schemaInfo = $dataArray['schemaInfo'];
  59. ksort($this->schemaInfo['versions']);
  60. $this->determineInstalledVersions();
  61. }
  62. /**
  63. *
  64. */
  65. protected function determineInstalledVersions()
  66. {
  67. foreach ($this->schemaInfo['versions'] as $version => $installed) {
  68. if ($installed) {
  69. $this->versionInstalled = $version;
  70. }
  71. $this->latestVersion = $version;
  72. $this->latestVersionInstalled = $installed;
  73. }
  74. }
  75. /**
  76. *
  77. */
  78. public function install($version)
  79. {
  80. $version = (int)$version;
  81. if (!array_key_exists($version, $this->schemaInfo['versions']) || !$this->schemaInfo['versions'][$version]) {
  82. // Switch database.
  83. $this->connection->useDatabase($this->databaseName);
  84. // Get schema content.
  85. $sql = file_get_contents($this->schemaInfo['files'][$version]);
  86. $sth = $this->connection->getStatement($sql);
  87. // Execute.
  88. $sth->execute();
  89. if ($sth->errorCode()) {
  90. list ($sqlstate, $errnum, $errmsg) = $sth->errorInfo();
  91. if ($errnum == 1045) {
  92. throw new Flux_Error("Critical MySQL error in Installer/Updater: $errnum: $errmsg");
  93. }
  94. elseif ($errnum == 1142) {
  95. // Bail-out.
  96. $message = "MySQL error: $errmsg\n\n";
  97. throw new Flux_Installer_SchemaPermissionError(
  98. $message,
  99. $this->schemaInfo['files'][$version],
  100. $this->databaseName,
  101. $this->mainServerName,
  102. $this->charMapServerName,
  103. $sql
  104. );
  105. }
  106. }
  107. $this->schemaInfo['versions'][$version] = true;
  108. $this->determineInstalledVersions();
  109. // Create file indicating schema is installed.
  110. $file = "{$this->schemaInfo['name']}.$version.txt";
  111. fclose(fopen("{$this->installedSchemaDir}/{$file}", 'w'));
  112. }
  113. else {
  114. return false;
  115. }
  116. }
  117. /**
  118. *
  119. */
  120. public function update()
  121. {
  122. if (!$this->isLatest()) {
  123. foreach ($this->schemaInfo['versions'] as $version => $installed) {
  124. if (!$installed) {
  125. $this->install($version);
  126. }
  127. }
  128. return true;
  129. }
  130. else {
  131. return false;
  132. }
  133. }
  134. /**
  135. *
  136. */
  137. public function versionInstalled($version)
  138. {
  139. $installed = array_key_exists($version, $this->schemaInfo['versions']) && $this->schemaInfo['versions'][$version];
  140. return $installed;
  141. }
  142. /**
  143. *
  144. */
  145. public function isLatest()
  146. {
  147. return $this->latestVersionInstalled;
  148. }
  149. /**
  150. *
  151. */
  152. public static function getSchemas(Flux_Installer_MainServer $mainServer, Flux_Installer_CharMapServer $charMapServer = null)
  153. {
  154. $mainServerName = $mainServer->loginAthenaGroup->serverName;
  155. if (is_null($charMapServer)) {
  156. $charMapServerName = null;
  157. $databaseName = $mainServer->loginAthenaGroup->loginDatabase;
  158. $connection = $mainServer->loginAthenaGroup->connection;
  159. $availableSchemaDir = array(FLUX_DATA_DIR."/schemas/logindb");
  160. $installedSchemaDir = FLUX_DATA_DIR."/logs/schemas/logindb/$mainServerName";
  161. foreach (Flux::$addons as $addon) {
  162. $_schemaDir = "{$addon->addonDir}/schemas/logindb";
  163. if (file_exists($_schemaDir) && is_dir($_schemaDir)) {
  164. $availableSchemaDir[] = $_schemaDir;
  165. }
  166. }
  167. }
  168. else {
  169. $charMapServerName = $charMapServer->athena->serverName;
  170. $databaseName = $charMapServer->athena->charMapDatabase;
  171. $connection = $charMapServer->athena->connection;
  172. $availableSchemaDir = array(FLUX_DATA_DIR."/schemas/charmapdb");
  173. $installedSchemaDir = FLUX_DATA_DIR."/logs/schemas/charmapdb/$mainServerName/{$charMapServer->athena->serverName}";
  174. foreach (Flux::$addons as $addon) {
  175. $_schemaDir = "{$addon->addonDir}/schemas/charmapdb";
  176. if (file_exists($_schemaDir) && is_dir($_schemaDir)) {
  177. $availableSchemaDir[] = $_schemaDir;
  178. }
  179. }
  180. }
  181. $dataArray = array(
  182. 'mainServerName' => $mainServerName,
  183. 'charMapServerName' => $charMapServerName,
  184. 'databaseName' => $databaseName,
  185. 'connection' => $connection,
  186. //'availableSchemaDir' => $availableSchemaDir,
  187. 'installedSchemaDir' => $installedSchemaDir,
  188. );
  189. $availableSchemas = array();
  190. $installedSchemas = array();
  191. $directories = array();
  192. foreach ($availableSchemaDir as $dir) {
  193. $directories[] = array($dir, 'availableSchemas', 'sql');
  194. }
  195. $directories[] = array($installedSchemaDir, 'installedSchemas', 'txt');
  196. /*$directories = array(
  197. array($availableSchemaDir, 'availableSchemas', 'sql'),
  198. array($installedSchemaDir, 'installedSchemas', 'txt')
  199. );*/
  200. foreach ($directories as $directory) {
  201. list ($schemaDir, $schemaArray, $fileExt) = $directory;
  202. $schemas = &$$schemaArray;
  203. $sFiles = glob("$schemaDir/*.$fileExt");
  204. if (!$sFiles) {
  205. $sFiles = array();
  206. }
  207. foreach ($sFiles as $schemaFilePath) {
  208. $schemaName = basename($schemaFilePath, ".$fileExt");
  209. if (preg_match('/^(\w+)\.(\d+)$/', $schemaName, $m)) {
  210. $schemaName = $m[1];
  211. $schemaVersion = $m[2];
  212. // Dynamically set schema directory.
  213. $dataArray['availableSchemaDir'] = $directory;
  214. if (!array_key_exists($schemaName, $schemas)) {
  215. $schemas[$schemaName] = array(
  216. 'name' => $schemaName,
  217. 'versions' => array(),
  218. );
  219. }
  220. $schemas[$schemaName]['versions'][$schemaFilePath] = $schemaVersion;
  221. }
  222. }
  223. }
  224. $objects = array();
  225. foreach ($availableSchemas as $schemaName => $schema) {
  226. $schemaInfo = array(
  227. 'name' => $schemaName,
  228. 'versions' => array_flip($schema['versions']),
  229. 'files' => array_flip($schema['versions'])
  230. );
  231. foreach ($schemaInfo['versions'] as $key => $value) {
  232. $schemaInfo['versions'][$key] = false;
  233. }
  234. if (array_key_exists($schemaName, $installedSchemas)) {
  235. foreach ($installedSchemas[$schemaName]['versions'] as $key => $value) {
  236. $schemaInfo['versions'][$value] = true;
  237. }
  238. }
  239. $dataArray['schemaInfo'] = $schemaInfo;
  240. $objects[] = new Flux_Installer_Schema($dataArray);
  241. }
  242. return $objects;
  243. }
  244. }
  245. ?>