UpdateDao.class.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. /**
  3. * @name eolinker ams open source,eolinker开源版本
  4. * @link https://www.eolinker.com/
  5. * @package eolinker
  6. * @author www.eolinker.com 广州银云信息科技有限公司 ©2015-2018
  7. * eoLinker是目前全球领先、国内最大的在线API接口管理平台,提供自动生成API文档、API自动化测试、Mock测试、团队协作等功能,旨在解决由于前后端分离导致的开发效率低下问题。
  8. * 如在使用的过程中有任何问题,欢迎加入用户讨论群进行反馈,我们将会以最快的速度,最好的服务态度为您解决问题。
  9. *
  10. * eoLinker AMS开源版的开源协议遵循Apache License 2.0,如需获取最新的eolinker开源版以及相关资讯,请访问:https://www.eolinker.com/#/os/download
  11. *
  12. * 官方网站:https://www.eolinker.com/
  13. * 官方博客以及社区:http://blog.eolinker.com/
  14. * 使用教程以及帮助:http://help.eolinker.com/
  15. * 商务合作邮箱:market@eolinker.com
  16. * 用户讨论QQ群:284421832
  17. */
  18. class UpdateDao
  19. {
  20. /**
  21. * 获取所有项目表
  22. */
  23. public function getAllTable()
  24. {
  25. $db = getDatabase();
  26. $result = $db->queryAll('SHOW TABLES');
  27. return $result;
  28. }
  29. /**
  30. * 获取相应表的字段名
  31. * @param $tableName string 数据表名
  32. * @return bool|array
  33. */
  34. public function getTableColumns(&$tableName)
  35. {
  36. $db = getDatabase();
  37. $result = $db->queryAll('SHOW COLUMNS FROM ' . $tableName);
  38. return $result;
  39. }
  40. /**
  41. * 修改数据库表名称
  42. * @param $oldTableName string 旧数据表名
  43. * @param $newTableName string 新数据表名
  44. * @return bool
  45. */
  46. public function changeTableName(&$oldTableName, $newTableName)
  47. {
  48. $db = getDatabase();
  49. $db->execute('RENAME TABLE ' . $oldTableName . ' TO ' . $newTableName);
  50. return TRUE;
  51. }
  52. /**
  53. * 删除数据库表
  54. * @param $oldTables array 旧数据表
  55. * @return bool
  56. */
  57. public function dropTable(&$oldTables)
  58. {
  59. $db = getDatabase();
  60. $db->beginTransaction();
  61. foreach ($oldTables as &$oldTable) {
  62. $db->execute("DROP TABLE IF EXISTS {$oldTable['tableName']}");
  63. }
  64. $db->commit();
  65. return TRUE;
  66. }
  67. /**
  68. * 转移数据
  69. * @param $oldTables array 旧数据表
  70. * @param $newTables array 新数据表
  71. * @return bool
  72. */
  73. public function dumpData(&$oldTables, &$newTables)
  74. {
  75. $db = getDatabase();
  76. $db->beginTransaction();
  77. $oldTablesCount = count($oldTables) - 1;
  78. $newTablesCount = count($newTables) - 1;
  79. for ($i = 0, $j = 0; $i <= $oldTablesCount; $i++, $j = 0) {
  80. //检查是否有相同的表
  81. for (; $j <= $newTablesCount; $j++) {
  82. //如果有相同的表
  83. if ($oldTables[$i]['tableName'] == 'old_' . $newTables[$j]['tableName']) {
  84. $columnSQL = '';
  85. foreach ($oldTables[$i]['columns'] as $column) {
  86. $columnSQL .= "`{$column}`,";
  87. }
  88. //过滤空参数
  89. if (empty($columnSQL))
  90. continue;
  91. $columnSQL = substr($columnSQL, 0, -1);
  92. $db->execute("INSERT INTO {$newTables[$j]['tableName']} ($columnSQL) SELECT $columnSQL FROM {$oldTables[$i]['tableName']}");
  93. if ($db->getAffectRow() < 1) {
  94. $db->rollback();
  95. return FALSE;
  96. }
  97. } else
  98. continue;
  99. }
  100. }
  101. $db->commit();
  102. return TRUE;
  103. }
  104. /**
  105. * 更新数据库
  106. * @return bool
  107. * @throws Exception
  108. */
  109. public function updateDatabase()
  110. {
  111. $db = getDatabase();
  112. $db->beginTransaction();
  113. try {
  114. //查询所有表
  115. $oldTablesCache = $db->queryAll('SHOW TABLES');
  116. $oldTables = array();
  117. $i = 0;
  118. defined('DB_TABLE_PREFIXION') or define('DB_TABLE_PREFIXION', 'eo');
  119. foreach ($oldTablesCache as $oldTable) {
  120. if (!(strpos($oldTable['Tables_in_' . DB_NAME], DB_TABLE_PREFIXION) === 0))
  121. continue;
  122. //获取表之后,遍历新建数组以存放表字段
  123. $oldTables[$i]['tableName'] = $oldTable['Tables_in_' . DB_NAME];
  124. //遍历获取所有表的字段名
  125. $columnFields = $db->queryAll('SHOW COLUMNS FROM ' . $oldTables[$i]['tableName']);
  126. foreach ($columnFields as $field) {
  127. $oldTables[$i]['columns'][] = $field['Field'];
  128. }
  129. ++$i;
  130. }
  131. unset($i);
  132. //开始重命名所有旧数据表
  133. foreach ($oldTables as &$oldTable) {
  134. $db->execute('RENAME TABLE ' . $oldTable['tableName'] . ' TO ' . 'old_' . $oldTable['tableName']);
  135. $oldTable['tableName'] = 'old_' . $oldTable['tableName'];
  136. }
  137. //开始创建新的数据表
  138. //读取数据库文件
  139. $sql = file_get_contents(PATH_FW . DIRECTORY_SEPARATOR . 'db/eolinker_os_mysql.sql');
  140. $sqlArray = array_filter(explode(';', $sql));
  141. foreach ($sqlArray as $query) {
  142. $db->query($query);
  143. if ($db->getError()) {
  144. $db->rollback();
  145. return FALSE;
  146. }
  147. }
  148. //获取新的数据表
  149. $newTablesCache = $db->queryAll('SHOW TABLES');
  150. $newTables = array();
  151. $i = 0;
  152. foreach ($newTablesCache as $newTable) {
  153. //获取表之后,遍历新建数组以存放表字段
  154. //先判断是否含有old关键字,有则跳过
  155. if (!strstr($newTable['Tables_in_' . DB_NAME], 'old_'))
  156. $newTables[$i]['tableName'] = $newTable['Tables_in_' . DB_NAME];
  157. else
  158. continue;
  159. //遍历获取所有表的字段名
  160. $columnFields = $db->queryAll('SHOW COLUMNS FROM ' . $newTables[$i]['tableName']);
  161. foreach ($columnFields as $field) {
  162. $newTables[$i]['columns'][] = $field['Field'];
  163. }
  164. ++$i;
  165. }
  166. unset($i);
  167. //开始转移数据
  168. $oldTablesCount = count($oldTables) - 1;
  169. $newTablesCount = count($newTables) - 1;
  170. for ($i = 0, $j = 0; $i <= $oldTablesCount; $i++, $j = 0) {
  171. //检查是否有相同的表
  172. for (; $j <= $newTablesCount; $j++) {
  173. //如果有相同的表
  174. if ($oldTables[$i]['tableName'] == 'old_' . $newTables[$j]['tableName']) {
  175. $columnSQL = '';
  176. foreach ($oldTables[$i]['columns'] as $column) {
  177. $columnSQL .= "`{$column}`,";
  178. }
  179. //过滤空参数
  180. if (empty($columnSQL))
  181. continue;
  182. $columnSQL = substr($columnSQL, 0, -1);
  183. $db->execute("INSERT INTO {$newTables[$j]['tableName']} ($columnSQL) SELECT $columnSQL FROM {$oldTables[$i]['tableName']}");
  184. if ($db->getAffectRow() < 1) {
  185. $db->rollback();
  186. return FALSE;
  187. }
  188. } else
  189. continue;
  190. }
  191. }
  192. //删除旧表格
  193. foreach ($oldTables as &$oldTable) {
  194. $db->execute("DROP TABLE IF EXISTS {$oldTable['tableName']}");
  195. }
  196. $db->commit();
  197. return TRUE;
  198. } catch (\Exception $e) {
  199. $db->rollback();
  200. throw new Exception($e->getMessage(), 100001);
  201. }
  202. }
  203. }
  204. ?>