PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/app/admin/db_import.php

https://github.com/sony88/answion
PHP | 303 lines | 219 code | 72 blank | 12 comment | 43 complexity | 52a19547fb0d0424b956a2ae7538842a MD5 | raw file
  1. <?php
  2. /*
  3. +--------------------------------------------------------------------------
  4. | Anwsion [#RELEASE_VERSION#]
  5. | ========================================
  6. | by Anwsion dev team
  7. | (c) 2011 - 2012 Anwsion Software
  8. | http://www.anwsion.com
  9. | ========================================
  10. | Support: zhengqiang@gmail.com
  11. |
  12. +---------------------------------------------------------------------------
  13. */
  14. class db_import
  15. {
  16. var $max_length = 16384;
  17. var $max_line = 10000;
  18. var $line_p_time = 1000; //每次执行读取行数
  19. public function get_access_rule()
  20. {
  21. $rule_action['rule_type'] = 'black'; //黑名单,黑名单中的检查 'white'白名单,白名单以外的检查
  22. return $rule_action;
  23. }
  24. public function __construct()
  25. {
  26. if (! $_SESSION['admin_login'])
  27. {
  28. HTTP::redirect(get_setting() . '/?/admin/login/');
  29. }
  30. admin_session_class::init();
  31. }
  32. public function index_action()
  33. {
  34. $filename = rawurldecode($_GET['filename']);
  35. if (! $filename)
  36. {
  37. HTTP::redirect('/admin/tool/database/');
  38. }
  39. TPL::assign('page_title', '还原数据库');
  40. TPL::assign('filename', $filename);
  41. TPL::assign('user_id', USER::get_client_uid());
  42. TPL::assign('menu_list', AWS_APP::model('admin_group')->get_menu_list(1, 302));
  43. TPL::output('admin/tool/database_import');
  44. }
  45. public function import_process_action()
  46. {
  47. HTTP::no_cache_header();
  48. @set_time_limit(0);
  49. $filename = $_GET['filename'];
  50. $page = $_GET['page'];
  51. $totalqueries = $_GET['totalqueries'];
  52. $_GET['start'] = floor($_GET['start']);
  53. $_GET['foffset'] = floor($_GET['foffset']);
  54. $_GET['mb_sum'] = floor($_GET['mb_sum']);
  55. $linenumber = $_GET['start'];
  56. $comment[] = '#';
  57. $comment[] = '-- ';
  58. $comment[] = 'DELIMITER';
  59. $comment[] = '/*!';
  60. @set_time_limit(0);
  61. $filename = $_GET['filename'];
  62. $file_list = $this->get_file_list(dirname($filename));
  63. $filename_s = pathinfo($filename, PATHINFO_FILENAME);
  64. if (! $file_list[$filename_s])
  65. {
  66. H::redirect_msg('备份文件不存在。', '?/admin/tool/database/');
  67. }
  68. $page = (! $page) ? 1 : $page;
  69. if ($page <= $file_list[$filename_s]['page'])
  70. {
  71. $db_config = AWS_APP::config()->get('database')->master;
  72. $dbconnection = @mysql_connect($db_config['host'], $db_config['username'], $db_config['password']);
  73. if ($dbconnection)
  74. {
  75. $db = mysql_select_db($db_config['dbname']);
  76. }
  77. @mysql_query("SET NAMES utf8", $dbconnection);
  78. $filepath = realpath(AWS_PATH) . '/' . $filename . '-' . $page . '.sql';
  79. if (! $file = @fopen($filepath, "rb"))
  80. {
  81. die('无法读取文件');
  82. }
  83. else if (@fseek($file, 0, SEEK_END) == 0)
  84. {
  85. $filesize = ftell($file);
  86. }
  87. if(fseek($file, $_GET['foffset']) != 0)
  88. {
  89. die ("无法定位:" . $_GET['foffset'] . "\n");
  90. }
  91. $query = '';
  92. $delimiter = ';';
  93. $querylines = 0;
  94. $queries = 0;
  95. $inparents = false;
  96. $string_quotes = '\'';
  97. while ($linenumber < $_GET['start'] + $this->line_p_time || $query != "")
  98. {
  99. $dumpline = "";
  100. while (! feof($file) && substr($dumpline, - 1) != "\n" && substr($dumpline, - 1) != "\r")
  101. {
  102. $dumpline .= fgets($file, $this->max_length);
  103. }
  104. if ($dumpline === "")
  105. {
  106. break;
  107. }
  108. if ($_GET['foffset'] == 0)
  109. {
  110. $dumpline = preg_replace('|^\xEF\xBB\xBF|', '', $dumpline);
  111. }
  112. $dumpline = str_replace("\r\n", "\n", $dumpline);
  113. $dumpline = str_replace("\r", "\n", $dumpline);
  114. if (! $inparents && strpos($dumpline, "DELIMITER ") === 0)
  115. {
  116. $delimiter = str_replace("DELIMITER ", "", trim($dumpline));
  117. }
  118. if (! $inparents)
  119. {
  120. $skipline = false;
  121. reset($comment);
  122. foreach ($comment as $comment_value)
  123. {
  124. if (trim($dumpline) == "" || strpos(trim($dumpline), $comment_value) === 0)
  125. {
  126. $skipline = true;
  127. break;
  128. }
  129. }
  130. if ($skipline)
  131. {
  132. $linenumber ++;
  133. continue;
  134. }
  135. }
  136. $dumpline_deslashed = str_replace("\\\\", "", $dumpline);
  137. $parents = substr_count($dumpline_deslashed, $string_quotes) - substr_count($dumpline_deslashed, "\\$string_quotes");
  138. if ($parents % 2 != 0)
  139. {
  140. $inparents = ! $inparents;
  141. }
  142. $query .= $dumpline;
  143. if (! $inparents)
  144. {
  145. $querylines ++;
  146. }
  147. if (preg_match('/' . preg_quote($delimiter) . '$/', trim($dumpline)) && ! $inparents)
  148. {
  149. $query = substr(trim($query), 0, - 1 * strlen($delimiter));
  150. if (! mysql_query($query, $dbconnection))
  151. {
  152. echo ("<p class=\"error\">Error at the line $linenumber: " . trim($dumpline) . "</p>\n");
  153. echo ("<p>Query: " . trim(nl2br(htmlentities($query))) . "</p>\n");
  154. echo ("<p>MySQL: " . mysql_error() . "</p>\n");
  155. die;
  156. }
  157. $totalqueries ++;
  158. $queries ++;
  159. $query = "";
  160. $querylines = 0;
  161. }
  162. $linenumber ++;
  163. }
  164. $foffset = ftell($file);
  165. fclose($file);
  166. if($foffset - $_GET['foffset'] > 0)
  167. {
  168. $mb_sum = $_GET['mb_sum'] + round(($foffset - $_GET['foffset']) / 1048576, 2);
  169. }
  170. else
  171. {
  172. $mb_sum = $_GET['mb_sum'];
  173. }
  174. if ($linenumber < $_GET['start'] + $this->line_p_time)
  175. {
  176. $page++;
  177. $linenumber = 0;
  178. $foffset = 0;
  179. }
  180. $q_data =array(
  181. 'filename' => $filename,
  182. 'page' => $page,
  183. 'start' => $linenumber,
  184. 'foffset' => $foffset,
  185. 'totalqueries' => $totalqueries,
  186. 'mb_sum' => $mb_sum,
  187. 'percent' => ceil((($page - 1 + $foffset / $filesize) / $file_list[$filename_s]['page']) * 100),
  188. );
  189. foreach($q_data as $key => $val)
  190. {
  191. $q_arr[] = $key . '-' . $val;
  192. }
  193. H::ajax_json_output(AWS_APP::RSM($q_data, 1, "导入成功"));
  194. }
  195. else if($page > $file_list[$filename_s]['page'])
  196. {
  197. H::ajax_json_output(AWS_APP::RSM(null, 2, "导入成功"));
  198. }
  199. }
  200. public function get_file_list($backup_dir)
  201. {
  202. $b_dir = AWS_PATH . $backup_dir;
  203. if (is_dir($b_dir))
  204. {
  205. $file_list = array();
  206. $read_dir = dir($b_dir);
  207. while ($file = $read_dir->read())
  208. {
  209. $file = $b_dir . '/' . $file;
  210. if (preg_match('/\.sql$/i', $file))
  211. {
  212. $handle = fopen($file, 'r');
  213. $timestamp = preg_replace('/^# TIMESTAMP\s:\s([0-9]+)\s*/s', '$1', fgets($handle, 256));
  214. fclose($handle);
  215. $fsize = filesize($file);
  216. $s_name = preg_replace('/(.+)\-[0-9]+/', '$1', pathinfo($file, PATHINFO_FILENAME));
  217. $page = preg_replace('/.*\-([0-9]+)/', '$1', pathinfo($file, PATHINFO_FILENAME));
  218. $file_list[$s_name]['time'] = $timestamp;
  219. $file_list[$s_name]['page'] ++;
  220. $file_list[$s_name]['size'] += $fsize;
  221. }
  222. }
  223. $read_dir->close();
  224. return $file_list;
  225. }
  226. else
  227. {
  228. return false;
  229. }
  230. }
  231. }