PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/firstrend/src/admin/Lib/Action/DataBaseAction.class.php

http://ownerpress.googlecode.com/
PHP | 417 lines | 349 code | 54 blank | 14 comment | 42 complexity | ac3c2d9de23325741deebf1a8c1e14a3 MD5 | raw file
Possible License(s): Apache-2.0, AGPL-1.0, GPL-2.0, GPL-3.0, LGPL-2.1
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ?????????? (Build on ThinkPHP)
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2011 http://fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: awfigq <awfigq@qq.com>
  10. // +----------------------------------------------------------------------
  11. /**
  12. +------------------------------------------------------------------------------
  13. * ????
  14. +------------------------------------------------------------------------------
  15. */
  16. class DataBaseAction extends CommonAction
  17. {
  18. public function index()
  19. {
  20. $db_back_dir = FANWE_ROOT."public/db_backup/";
  21. $sql_list = $this->dirFileInfo($db_back_dir);
  22. $this->assign("sql_list",$sql_list);
  23. $this->assign("name",toDate(gmtTime(),'YmdHis'));
  24. $this->display();
  25. }
  26. public function dump()
  27. {
  28. $time = gmtTime();
  29. $name = empty($_REQUEST['sql_file_name']) ? toDate($time,'YmdHis') : $_REQUEST['sql_file_name'];
  30. $tables = $this->getAllTable();
  31. $_SESSION['dump_table_data'] = array(
  32. 'file_dir'=>$name,
  33. 'tables'=>$tables,
  34. 'perfix'=>C('DB_PREFIX'),
  35. 'time'=>$time,
  36. );
  37. $this->redirect('DataBase/dumptable');
  38. }
  39. public function dumptable()
  40. {
  41. $table_data = $_SESSION['dump_table_data'];
  42. if(empty($table_data))
  43. $this->redirect('DataBase/index');
  44. else
  45. $_SESSION['dump_table_data'] = $table_data;
  46. @set_time_limit(3600);
  47. if(function_exists('ini_set'))
  48. {
  49. ini_set('max_execution_time',3600);
  50. ini_set("memory_limit","256M");
  51. }
  52. $begin = isset($_REQUEST['begin']) ? intval($_REQUEST['begin']) : 0;
  53. $index = isset($_REQUEST['index']) ? intval($_REQUEST['index']) : 0;
  54. $back_dir = FANWE_ROOT."public/db_backup/".$table_data['file_dir'].'/';
  55. if($index >= count($table_data['tables']))
  56. {
  57. $this->assign("tables",false);
  58. $this->display();
  59. ob_start();
  60. ob_end_flush();
  61. ob_implicit_flush(1);
  62. unset($_SESSION['dump_table_data']);
  63. echoFlush('<script type="text/javascript">showmessage(\''.L('DUMP_SUCCESS').'\',3);</script>');
  64. exit;
  65. }
  66. $table = $table_data['tables'][$index];
  67. $table_vars = array(
  68. 'count'=>count($table_data['tables']),
  69. "index"=>$index + 1,
  70. "name"=>$table);
  71. $this->assign("tables",$table_vars);
  72. $this->display();
  73. ob_start();
  74. ob_end_flush();
  75. ob_implicit_flush(1);
  76. if($index == 0)
  77. {
  78. mk_dir($back_dir);
  79. $table_data = '$table_data = '.var_export($table_data, true).";";
  80. $db_table_file = $back_dir."tables.php";
  81. @file_put_contents($db_table_file,"<?php\n$table_data\n?>");
  82. }
  83. $tbname = str_replace(C('DB_PREFIX'),'%DB_PREFIX%',$table);
  84. $modelname = str_replace(C('DB_PREFIX'),'',$table);
  85. $table_dir = $back_dir.$modelname.'/';
  86. mk_dir($table_dir);
  87. $modelname = parse_name($modelname,1);
  88. $model=D($modelname);
  89. $data_num = $model->count();
  90. $dumpsql_vol = '';
  91. if($begin == 0)
  92. {
  93. $sql_file_path = $table_dir."table.sql";
  94. $dumpsql_vol .= "DROP TABLE IF EXISTS `$tbname`;\r\n"; //??????????Sql??
  95. $tmp_arr = M()->query("SHOW CREATE TABLE `$table`");
  96. $tmp_sql = $tmp_arr[0]['Create Table'].";\r\n";
  97. $tmp_sql = str_replace(C('DB_PREFIX'),'%DB_PREFIX%',$tmp_sql);
  98. $dumpsql_vol .= $tmp_sql; //?????????
  99. if(@file_put_contents($sql_file_path,$dumpsql_vol) === false)
  100. {
  101. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DUMP_TIPS2'),$table,U('DataBase/dumptable',array('index'=>$index,'begin'=>$begin))).'\',-1);</script>');
  102. exit;
  103. }
  104. else
  105. {
  106. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DUMP_TIPS3'),$table).'\',1);</script>');
  107. }
  108. }
  109. if($data_num > $begin)
  110. {
  111. $sql_file_path = $table_dir.$begin.".sql";
  112. $dumpsql_vol = '';
  113. $limit = $data_num - $begin;
  114. if($limit > 5000)
  115. $limit = 5000;
  116. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DUMP_TIPS4'),$table,$begin,$begin + $limit).'\',1);</script>');
  117. $data_list=$model->limit($begin.','.$limit)->findAll();
  118. foreach($data_list as $data_row)
  119. {
  120. $dumpsql_row = "INSERT INTO `{$tbname}` VALUES ("; //?????????SQL????
  121. foreach($data_row as $col_value)
  122. {
  123. $dumpsql_row .="'".mysql_real_escape_string($col_value)."',";
  124. }
  125. $dumpsql_row=substr($dumpsql_row,0,-1); //????????
  126. $dumpsql_row .= ");\r\n";
  127. $dumpsql_vol.= $dumpsql_row;
  128. }
  129. if(@file_put_contents($sql_file_path,$dumpsql_vol) === false)
  130. {
  131. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DUMP_TIPS5'),$table,$begin,$begin + $limit,U('DataBase/dumptable',array('index'=>$index,'begin'=>$begin))).'\',-1);</script>');
  132. exit;
  133. }
  134. else
  135. {
  136. if($limit < 5000)
  137. {
  138. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/dumptable',array('index'=>$index + 1,'begin'=>0)).'\',2);</script>');
  139. exit;
  140. }
  141. else
  142. {
  143. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/dumptable',array('index'=>$index,'begin'=>$begin + $limit)).'\',2);</script>');
  144. exit;
  145. }
  146. }
  147. }
  148. else
  149. {
  150. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/dumptable',array('index'=>$index + 1,'begin'=>0)).'\',2);</script>');
  151. exit;
  152. }
  153. }
  154. public function delete()
  155. {
  156. $dir = $_REQUEST['dir'];
  157. if(empty($dir))
  158. exit;
  159. $_SESSION['delete_table_dir'] = $dir;
  160. $this->redirect('DataBase/deletetable');
  161. }
  162. public function deletetable()
  163. {
  164. $name = $_SESSION['delete_table_dir'];
  165. if(empty($name))
  166. $this->redirect('DataBase/index');
  167. else
  168. $_SESSION['delete_table_dir'] = $name;
  169. @set_time_limit(3600);
  170. if(function_exists('ini_set'))
  171. {
  172. ini_set('max_execution_time',3600);
  173. ini_set("memory_limit","256M");
  174. }
  175. $this->display();
  176. ob_start();
  177. ob_end_flush();
  178. ob_implicit_flush(1);
  179. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DELETE_TIPS1'),$name).'\',1);</script>');
  180. $dir = FANWE_ROOT."public/db_backup/".$name.'/';
  181. $dirhandle=opendir($dir);
  182. while(($file = readdir($dirhandle)) !== false)
  183. {
  184. if(($file!=".") && ($file!=".."))
  185. {
  186. if(is_dir($dir.$file))
  187. {
  188. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DELETE_TIPS2'),$file).'\',1);</script>');
  189. usleep(10);
  190. $this->clearSqlDir($dir.$file.'/',$file);
  191. @rmdir($dir.$file.'/');
  192. }
  193. else
  194. {
  195. @unlink($dir.$file);
  196. }
  197. }
  198. }
  199. @closedir($dirhandle);
  200. usleep(10);
  201. @rmdir($dir);
  202. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DELETE_TIPS4'),$name).'\',3);</script>');
  203. exit;
  204. }
  205. public function restore()
  206. {
  207. $dir = $_REQUEST['dir'];
  208. if(empty($dir))
  209. exit;
  210. $_SESSION['restore_table_dir'] = $dir;
  211. $this->redirect('DataBase/restoretable');
  212. }
  213. public function restoretable()
  214. {
  215. $restore_table_dir = $_SESSION['restore_table_dir'];
  216. $back_dir = FANWE_ROOT."public/db_backup/".$restore_table_dir.'/';
  217. if(!@include($back_dir."tables.php"))
  218. $this->redirect('DataBase/index');
  219. else
  220. $_SESSION['restore_table_dir'] = $restore_table_dir;
  221. @set_time_limit(3600);
  222. if(function_exists('ini_set'))
  223. {
  224. ini_set('max_execution_time',3600);
  225. ini_set("memory_limit","256M");
  226. }
  227. $begin = isset($_REQUEST['begin']) ? intval($_REQUEST['begin']) : 0;
  228. $index = isset($_REQUEST['index']) ? intval($_REQUEST['index']) : 0;
  229. $this->assign("restore_tips",sprintf(L('RESTORE_TIPS0'),U('DataBase/restoretable',array('index'=>$index,'begin'=>0))));
  230. if($index >= count($table_data['tables']))
  231. {
  232. $this->assign("tables",false);
  233. $this->display();
  234. ob_start();
  235. ob_end_flush();
  236. ob_implicit_flush(1);
  237. echoFlush('<script type="text/javascript">showmessage(\''.L('RESTORE_SUCCESS').'\',3);</script>');
  238. exit;
  239. }
  240. $table = $table_data['tables'][$index];
  241. $table = str_replace($table_data['perfix'],'',$table);
  242. $table_dir = $back_dir.$table.'/';
  243. $table_vars = array(
  244. 'count'=>count($table_data['tables']),
  245. "index"=>$index + 1,
  246. "name"=>$table);
  247. $this->assign("tables",$table_vars);
  248. $this->display();
  249. ob_start();
  250. ob_end_flush();
  251. ob_implicit_flush(1);
  252. if(!file_exists($table_dir.'table.sql'))
  253. {
  254. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/restoretable',array('index'=>$index + 1,'begin'=>0)).'\',2);</script>');
  255. exit;
  256. }
  257. $db = Db::getInstance();
  258. if($begin == 0)
  259. {
  260. $sql = @file_get_contents($table_dir.'table.sql');
  261. $sql = str_replace("\r", '', $sql);
  262. $segmentSql = explode(";\n", $sql);
  263. foreach($segmentSql as $itemSql)
  264. {
  265. $itemSql = trim($itemSql);
  266. if(empty($itemSql))
  267. continue;
  268. $itemSql = str_replace("%DB_PREFIX%",C('DB_PREFIX'),$itemSql);
  269. $db->query($itemSql);
  270. if($db->getError() != "")
  271. {
  272. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('RESTORE_TIPS2'),$table,U('DataBase/restoretable',array('index'=>$index,'begin'=>0))).'\',-1);</script>');
  273. exit;
  274. }
  275. }
  276. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('RESTORE_TIPS3'),$table).'\',1);</script>');
  277. }
  278. if(file_exists($table_dir.$begin.'.sql'))
  279. {
  280. $limit = 5000;
  281. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('RESTORE_TIPS4'),$table,$begin,($begin + $limit)).'\',1);</script>');
  282. $sql = @file_get_contents($table_dir.$begin.'.sql');
  283. $sql = str_replace("\r", '', $sql);
  284. $segmentSql = explode(";\n", $sql);
  285. $sql_index = 0;
  286. foreach($segmentSql as $itemSql)
  287. {
  288. $sql_index++;
  289. if(!empty($itemSql))
  290. {
  291. $itemSql = str_replace("%DB_PREFIX%",C('DB_PREFIX'),$itemSql);
  292. $db->query($itemSql);
  293. if($db->getError() != "")
  294. {
  295. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('RESTORE_TIPS5'),$table,$sql_index,U('DataBase/restoretable',array('index'=>$index,'begin'=>0))).'\',-1);</script>');
  296. exit;
  297. }
  298. }
  299. }
  300. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/restoretable',array('index'=>$index,'begin'=>$begin + $limit)).'\',2);</script>');
  301. exit;
  302. }
  303. else
  304. {
  305. echoFlush('<script type="text/javascript">showmessage(\''.U('DataBase/restoretable',array('index'=>$index + 1,'begin'=>0)).'\',2);</script>');
  306. exit;
  307. }
  308. }
  309. private function getAllTable()
  310. {
  311. $tables_all = Db::getInstance()->getTables();
  312. $tables = array();
  313. foreach($tables_all as $table)
  314. {
  315. if(preg_match("/".C('DB_PREFIX')."/",$table))
  316. array_push($tables,$table);
  317. }
  318. return $tables;
  319. }
  320. private function dirFileInfo($dir)
  321. {
  322. if(!is_dir($dir))
  323. return false;
  324. $dirhandle=opendir($dir);
  325. $list=array();
  326. while(($file = readdir($dirhandle)) !== false)
  327. {
  328. if(($file!=".") && ($file!="..") && is_dir($dir.$file) && file_exists($dir.$file.'/tables.php'))
  329. {
  330. include $dir.$file.'/tables.php';
  331. $list[]=array(
  332. 'filename'=>$table_data['file_dir'],
  333. 'filetime'=>$table_data['time'],
  334. 'filedate'=>toDate($table_data['time'])
  335. );
  336. }
  337. }
  338. @closedir($dirhandle);
  339. usort($list,fileSort);
  340. return $list;
  341. }
  342. private function clearSqlDir($dir,$name)
  343. {
  344. $dirhandle=opendir($dir);
  345. while(($file = readdir($dirhandle)) !== false)
  346. {
  347. if(($file!=".") && ($file!=".."))
  348. {
  349. echoFlush('<script type="text/javascript">showmessage(\''.sprintf(L('DELETE_TIPS3'),$name,$file).'\',1);</script>');
  350. usleep(10);
  351. @unlink($dir.$file);
  352. }
  353. }
  354. @closedir($dirhandle);
  355. }
  356. }
  357. function fileSort($a, $b)
  358. {
  359. if ($a['filetime'] == $a['filetime'])
  360. return 0;
  361. return ($a['filetime'] < $a['filetime']) ? 1 : -1;
  362. }
  363. ?>