PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/core/dump.php

http://viet-group.googlecode.com/
PHP | 350 lines | 263 code | 41 blank | 46 comment | 44 complexity | 8c01a0e515b967c3f3528f4f556fe148 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * @Project NUKEVIET 3.0
  4. * @Author VINADES.,JSC (contact@vinades.vn)
  5. * @copyright 2010
  6. * @createdate 1/20/2010 20:48
  7. */
  8. if ( ! defined( 'NV_MAINFILE' ) ) die( 'Stop!!!' );
  9. /**
  10. * dumpsave
  11. *
  12. * @package
  13. * @author NUKEVIET commercial version 1.0
  14. * @copyright Anh Tu Nguyen
  15. * @version 2010
  16. * @access public
  17. */
  18. class dumpsave
  19. {
  20. var $savetype;
  21. var $filesavename;
  22. var $mode;
  23. var $comp_level = 9;
  24. var $fp = false;
  25. /**
  26. * dumpsave::dumpsave()
  27. *
  28. * @param mixed $save_type
  29. * @param mixed $filesave_name
  30. * @return
  31. */
  32. function dumpsave ( $save_type, $filesave_name )
  33. {
  34. $this->filesavename = $filesave_name;
  35. if ( $save_type == "gz" and extension_loaded( 'zlib' ) )
  36. {
  37. $this->savetype = "gz";
  38. $this->mode = "wb" . $this->comp_level;
  39. }
  40. else
  41. {
  42. $this->savetype = "sql";
  43. $this->mode = "wb";
  44. }
  45. }
  46. /**
  47. * dumpsave::open()
  48. *
  49. * @return
  50. */
  51. function open ( )
  52. {
  53. $this->fp = call_user_func_array( ( $this->savetype == 'gz' ) ? "gzopen" : "fopen", array(
  54. $this->filesavename, $this->mode
  55. ) );
  56. return $this->fp;
  57. }
  58. /**
  59. * dumpsave::write()
  60. *
  61. * @param mixed $content
  62. * @return
  63. */
  64. function write ( $content )
  65. {
  66. if ( $this->fp )
  67. {
  68. return @call_user_func_array( ( $this->savetype == 'gz' ) ? "gzwrite" : "fwrite", array(
  69. $this->fp, $content
  70. ) );
  71. }
  72. return false;
  73. }
  74. /**
  75. * dumpsave::close()
  76. *
  77. * @return
  78. */
  79. function close ( )
  80. {
  81. if ( $this->fp )
  82. {
  83. $return = @call_user_func( ( $this->savetype == 'gz' ) ? "gzclose" : "fclose", $this->fp );
  84. if ( $return )
  85. {
  86. @chmod( $this->filesavename, 0666 );
  87. return true;
  88. }
  89. }
  90. return false;
  91. }
  92. }
  93. /**
  94. * nv_dump_save()
  95. *
  96. * @param mixed $params
  97. * @return
  98. */
  99. function nv_dump_save ( $params )
  100. {
  101. global $db, $sys_info, $global_config;
  102. if ( $sys_info['allowed_set_time_limit'] )
  103. {
  104. set_time_limit( 1200 );
  105. }
  106. if ( ! isset( $params['tables'] ) or ! is_array( $params['tables'] ) or $params['tables'] == array() )
  107. {
  108. return false;
  109. }
  110. $params['tables'] = array_map( "trim", $params['tables'] );
  111. $tables = array();
  112. $dbsize = 0;
  113. $result = $db->sql_query( "SHOW TABLE STATUS" );
  114. $a = 0;
  115. while ( $item = $db->sql_fetch_assoc( $result ) )
  116. {
  117. unset( $m );
  118. if ( in_array( $item['Name'], $params['tables'] ) )
  119. {
  120. $tables[$a]['name'] = $item['Name'];
  121. $tables[$a]['size'] = intval( $item['Data_length'] ) + intval( $item['Index_length'] );
  122. $tables[$a]['limit'] = 1 + round( 1048576 / ( $item['Avg_row_length'] + 1 ) );
  123. $tables[$a]['numrow'] = $item['Rows'];
  124. $tables[$a]['charset'] = ( preg_match( "/^([a-z0-9]+)_/i", $item['Collation'], $m ) ) ? $m[1] : "";
  125. $tables[$a]['type'] = isset( $item['Engine'] ) ? $item['Engine'] : $item['Type'];
  126. $a ++;
  127. $dbsize += intval( $item['Data_length'] ) + intval( $item['Index_length'] );
  128. }
  129. }
  130. $db->sql_freeresult( $result );
  131. if ( empty( $a ) )
  132. {
  133. return false;
  134. }
  135. $dumpsave = new dumpsave( $params['savetype'], $params['filename'] );
  136. if ( ! $dumpsave->open() )
  137. {
  138. return false;
  139. }
  140. $path_dump = "";
  141. if ( file_exists( NV_ROOTDIR . "/themes/" . $global_config['site_theme'] . "/system/dump.tpl" ) )
  142. {
  143. $path_dump = NV_ROOTDIR . "/themes/" . $global_config['site_theme'] . "/system/dump.tpl";
  144. }
  145. else
  146. {
  147. $path_dump = NV_ROOTDIR . "/themes/default/system/dump.tpl";
  148. }
  149. $template = explode( "@@@", file_get_contents( $path_dump ) );
  150. $patterns = array(
  151. "/\{\|SERVER_NAME\|\}/", "/\{\|GENERATION_TIME\|\}/", "/\{\|SQL_VERSION\|\}/", "/\{\|PHP_VERSION\|\}/", "/\{\|DB_NAME\|\}/"
  152. );
  153. $replacements = array(
  154. $db->server, gmdate( "F j, Y, h:i A", NV_CURRENTTIME ) . " GMT", $db->sql_version, PHP_VERSION, $db->dbname
  155. );
  156. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[0] ) ) )
  157. {
  158. return false;
  159. }
  160. $db->sql_query( "SET NAMES 'utf8'" );
  161. $db->sql_query( "SET SQL_QUOTE_SHOW_CREATE = 1" );
  162. $a = 0;
  163. foreach ( $tables as $table )
  164. {
  165. $result = $db->sql_query( "SHOW CREATE TABLE `" . $table['name'] . "`" );
  166. $content = $db->sql_fetchrow( $result );
  167. $db->sql_freeresult( $result );
  168. $content = preg_replace( '/(KEY[^\(]+)(\([^\)]+\))[\s\r\n\t]+(USING BTREE)/i', '\\1\\3 \\2', $content[1] );
  169. $content = preg_replace( '/(default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP|DEFAULT CHARSET=\w+|COLLATE=\w+|character set \w+|collate \w+|AUTO_INCREMENT=\w+)/i', ' \\1', $content );
  170. $patterns = array(
  171. "/\{\|TABLE_NAME\|\}/", "/\{\|TABLE_STR\|\}/"
  172. );
  173. $replacements = array(
  174. $table['name'], $content
  175. );
  176. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[1] ) ) )
  177. {
  178. return false;
  179. }
  180. if ( $params['type'] == 'str' )
  181. {
  182. continue;
  183. }
  184. if ( ! empty( $table['numrow'] ) )
  185. {
  186. $patterns = array(
  187. "/\{\|TABLE_NAME\|\}/"
  188. );
  189. $replacements = array(
  190. $table['name']
  191. );
  192. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[2] ) ) )
  193. {
  194. return false;
  195. }
  196. $columns = array();
  197. $result = $db->sql_query( "SHOW COLUMNS FROM `" . $table['name'] . "`" );
  198. while ( $col = $db->sql_fetchrow( $result ) )
  199. {
  200. $columns[$col['Field']] = preg_match( "/^(\w*int|year)/", $col[1] ) ? 'int' : 'txt';
  201. }
  202. $db->sql_freeresult( $result );
  203. $maxi = ceil( $table['numrow'] / $table['limit'] );
  204. $from = 0;
  205. $a = 0;
  206. for ( $i = 0; $i < $maxi; $i ++ )
  207. {
  208. $result = $db->sql_query( "SELECT * FROM `" . $table['name'] . "` LIMIT " . $from . ", " . $table['limit'] . "" );
  209. while ( $row = $db->sql_fetchrow( $result ) )
  210. {
  211. $row2 = array();
  212. foreach ( $columns as $key => $kt )
  213. {
  214. $row2[] = isset( $row[$key] ) ? ( ( $kt == 'int' ) ? $row[$key] : "'" . mysql_real_escape_string( $row[$key] ) . "'" ) : "NULL";
  215. }
  216. $row2 = NV_EOL . "(" . implode( ", ", $row2 ) . ")";
  217. $a ++;
  218. if ( $a < $table['numrow'] )
  219. {
  220. if ( ! $dumpsave->write( $row2 . ", " ) )
  221. {
  222. return false;
  223. }
  224. }
  225. else
  226. {
  227. if ( ! $dumpsave->write( $row2 . ";" ) )
  228. {
  229. return false;
  230. }
  231. break;
  232. }
  233. }
  234. $db->sql_freeresult( $result );
  235. $from += $table['limit'];
  236. }
  237. }
  238. }
  239. if ( ! $dumpsave->close() )
  240. {
  241. return false;
  242. }
  243. return array(
  244. $params['filename'], $dbsize
  245. );
  246. }
  247. function nv_dump_restore ( $file )
  248. {
  249. global $db, $db_config, $sys_info;
  250. if ( $sys_info['allowed_set_time_limit'] ) set_time_limit( 1200 );
  251. //kiem tra file
  252. if ( ! file_exists( $file ) ) return false;
  253. //bat doc doc file
  254. $arr_file = explode( "/", $file );
  255. $ext = nv_getextension( end( $arr_file ) );
  256. $str = ( $ext == "gz" ) ? @gzfile( $file ) : @file( $file );
  257. $sql = $insert = "";
  258. $query_len = 0;
  259. $execute = false;
  260. foreach ( $str as $st )
  261. {
  262. if ( empty( $st ) || preg_match( "/^(#|--)/", $st ) )
  263. {
  264. continue;
  265. }
  266. else
  267. {
  268. $query_len += strlen( $st );
  269. unset( $m );
  270. if ( empty( $insert ) && preg_match( "/^(INSERT INTO `?[^` ]+`? .*?VALUES)(.*)$/i", $st, $m ) )
  271. {
  272. $insert = $m[1] . ' ';
  273. $sql .= $m[2];
  274. }
  275. else
  276. {
  277. $sql .= $st;
  278. }
  279. if ( $sql )
  280. {
  281. if ( preg_match( "/;\s*$/", $st ) )
  282. {
  283. $sql = rtrim( $insert . $sql, ";" );
  284. $insert = '';
  285. $execute = true;
  286. }
  287. if ( $query_len >= 65536 && preg_match( "/,\s*$/", $st ) )
  288. {
  289. $sql = rtrim( $insert . $sql, "," );
  290. $execute = true;
  291. }
  292. if ( $execute )
  293. {
  294. $sql = preg_replace( array(
  295. "/\{\|prefix\|\}/", "/\{\|lang\|\}/"
  296. ), array(
  297. $db_config['prefix'], NV_LANG_DATA
  298. ), $sql );
  299. if ( ! $db->sql_query( $sql ) ) return false;
  300. $sql = '';
  301. $query_len = 0;
  302. $execute = false;
  303. }
  304. }
  305. }
  306. }
  307. return true;
  308. }
  309. ?>