PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/01.Source/01.CORE/includes/core/dump.php

http://creative-portal.googlecode.com/
PHP | 348 lines | 261 code | 41 blank | 46 comment | 44 complexity | 6bed6564d63ba17956a159c2d6759bc3 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. set_time_limit( 1200 );
  104. }
  105. if ( ! isset( $params['tables'] ) or ! is_array( $params['tables'] ) or $params['tables'] == array() )
  106. {
  107. return false;
  108. }
  109. $params['tables'] = array_map( "trim", $params['tables'] );
  110. $tables = array();
  111. $dbsize = 0;
  112. $result = $db->sql_query( "SHOW TABLE STATUS" );
  113. $a = 0;
  114. while ( $item = $db->sql_fetch_assoc( $result ) )
  115. {
  116. unset( $m );
  117. if ( in_array( $item['Name'], $params['tables'] ) )
  118. {
  119. $tables[$a]['name'] = $item['Name'];
  120. $tables[$a]['size'] = intval( $item['Data_length'] ) + intval( $item['Index_length'] );
  121. $tables[$a]['limit'] = 1 + round( 1048576 / ( $item['Avg_row_length'] + 1 ) );
  122. $tables[$a]['numrow'] = $item['Rows'];
  123. $tables[$a]['charset'] = ( preg_match( "/^([a-z0-9]+)_/i", $item['Collation'], $m ) ) ? $m[1] : "";
  124. $tables[$a]['type'] = isset( $item['Engine'] ) ? $item['Engine'] : $item['Type'];
  125. $a ++;
  126. $dbsize += intval( $item['Data_length'] ) + intval( $item['Index_length'] );
  127. }
  128. }
  129. $db->sql_freeresult( $result );
  130. if ( empty( $a ) )
  131. {
  132. return false;
  133. }
  134. $dumpsave = new dumpsave( $params['savetype'], $params['filename'] );
  135. if ( ! $dumpsave->open() )
  136. {
  137. return false;
  138. }
  139. $path_dump = "";
  140. if ( file_exists( NV_ROOTDIR . "/themes/" . $global_config['site_theme'] . "/system/dump.tpl" ) )
  141. {
  142. $path_dump = NV_ROOTDIR . "/themes/" . $global_config['site_theme'] . "/system/dump.tpl";
  143. }
  144. else
  145. {
  146. $path_dump = NV_ROOTDIR . "/themes/default/system/dump.tpl";
  147. }
  148. $template = explode( "@@@", file_get_contents( $path_dump ) );
  149. $patterns = array(
  150. "/\{\|SERVER_NAME\|\}/", "/\{\|GENERATION_TIME\|\}/", "/\{\|SQL_VERSION\|\}/", "/\{\|PHP_VERSION\|\}/", "/\{\|DB_NAME\|\}/"
  151. );
  152. $replacements = array(
  153. $db->server, gmdate( "F j, Y, h:i A", NV_CURRENTTIME ) . " GMT", $db->sql_version, PHP_VERSION, $db->dbname
  154. );
  155. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[0] ) ) )
  156. {
  157. return false;
  158. }
  159. $db->sql_query( "SET NAMES 'utf8'" );
  160. $db->sql_query( "SET SQL_QUOTE_SHOW_CREATE = 1" );
  161. $a = 0;
  162. foreach ( $tables as $table )
  163. {
  164. $result = $db->sql_query( "SHOW CREATE TABLE `" . $table['name'] . "`" );
  165. $content = $db->sql_fetchrow( $result );
  166. $db->sql_freeresult( $result );
  167. $content = preg_replace( '/(KEY[^\(]+)(\([^\)]+\))[\s\r\n\t]+(USING BTREE)/i', '\\1\\3 \\2', $content[1] );
  168. $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 );
  169. $patterns = array(
  170. "/\{\|TABLE_NAME\|\}/", "/\{\|TABLE_STR\|\}/"
  171. );
  172. $replacements = array(
  173. $table['name'], $content
  174. );
  175. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[1] ) ) )
  176. {
  177. return false;
  178. }
  179. if ( $params['type'] == 'str' )
  180. {
  181. continue;
  182. }
  183. if ( ! empty( $table['numrow'] ) )
  184. {
  185. $patterns = array(
  186. "/\{\|TABLE_NAME\|\}/"
  187. );
  188. $replacements = array(
  189. $table['name']
  190. );
  191. if ( ! $dumpsave->write( preg_replace( $patterns, $replacements, $template[2] ) ) )
  192. {
  193. return false;
  194. }
  195. $columns = array();
  196. $result = $db->sql_query( "SHOW COLUMNS FROM `" . $table['name'] . "`" );
  197. while ( $col = $db->sql_fetchrow( $result ) )
  198. {
  199. $columns[$col['Field']] = preg_match( "/^(\w*int|year)/", $col[1] ) ? 'int' : 'txt';
  200. }
  201. $db->sql_freeresult( $result );
  202. $maxi = ceil( $table['numrow'] / $table['limit'] );
  203. $from = 0;
  204. $a = 0;
  205. for ( $i = 0; $i < $maxi; $i ++ )
  206. {
  207. $result = $db->sql_query( "SELECT * FROM `" . $table['name'] . "` LIMIT " . $from . ", " . $table['limit'] . "" );
  208. while ( $row = $db->sql_fetchrow( $result ) )
  209. {
  210. $row2 = array();
  211. foreach ( $columns as $key => $kt )
  212. {
  213. $row2[] = isset( $row[$key] ) ? ( ( $kt == 'int' ) ? $row[$key] : "'" . mysql_real_escape_string( $row[$key] ) . "'" ) : "NULL";
  214. }
  215. $row2 = NV_EOL . "(" . implode( ", ", $row2 ) . ")";
  216. $a ++;
  217. if ( $a < $table['numrow'] )
  218. {
  219. if ( ! $dumpsave->write( $row2 . ", " ) )
  220. {
  221. return false;
  222. }
  223. }
  224. else
  225. {
  226. if ( ! $dumpsave->write( $row2 . ";" ) )
  227. {
  228. return false;
  229. }
  230. break;
  231. }
  232. }
  233. $db->sql_freeresult( $result );
  234. $from += $table['limit'];
  235. }
  236. }
  237. }
  238. if ( ! $dumpsave->close() )
  239. {
  240. return false;
  241. }
  242. return array(
  243. $params['filename'], $dbsize
  244. );
  245. }
  246. function nv_dump_restore ( $file )
  247. {
  248. global $db, $db_config, $sys_info;
  249. if ( $sys_info['allowed_set_time_limit'] ) set_time_limit( 1200 );
  250. //kiem tra file
  251. if ( ! file_exists( $file ) ) return false;
  252. //bat doc doc file
  253. $ext = nv_getextension( end( explode( "/", $file ) ) );
  254. $str = ( $ext == "gz" ) ? @gzfile( $file ) : @file( $file );
  255. $sql = $insert = "";
  256. $query_len = 0;
  257. $execute = false;
  258. foreach ( $str as $st )
  259. {
  260. if ( empty( $st ) || preg_match( "/^(#|--)/", $st ) )
  261. {
  262. continue;
  263. }
  264. else
  265. {
  266. $query_len += strlen( $st );
  267. unset( $m );
  268. if ( empty( $insert ) && preg_match( "/^(INSERT INTO `?[^` ]+`? .*?VALUES)(.*)$/i", $st, $m ) )
  269. {
  270. $insert = $m[1] . ' ';
  271. $sql .= $m[2];
  272. }
  273. else
  274. {
  275. $sql .= $st;
  276. }
  277. if ( $sql )
  278. {
  279. if ( preg_match( "/;\s*$/", $st ) )
  280. {
  281. $sql = rtrim( $insert . $sql, ";" );
  282. $insert = '';
  283. $execute = true;
  284. }
  285. if ( $query_len >= 65536 && preg_match( "/,\s*$/", $st ) )
  286. {
  287. $sql = rtrim( $insert . $sql, "," );
  288. $execute = true;
  289. }
  290. if ( $execute )
  291. {
  292. $sql = preg_replace( array(
  293. "/\{\|prefix\|\}/", "/\{\|lang\|\}/"
  294. ), array(
  295. $db_config['prefix'], NV_LANG_DATA
  296. ), $sql );
  297. if ( ! $db->sql_query( $sql ) ) return false;
  298. $sql = '';
  299. $query_len = 0;
  300. $execute = false;
  301. }
  302. }
  303. }
  304. }
  305. return true;
  306. }
  307. ?>