/** * Functions creates dump of tables in $file. * * @param mixed $tables Array of tables * @param string $dir Directory for saving file with table names * @param string $file Dump file name \ * @param Logger $log * @return bool Boolean False on failure */ function fn_uc_backup_tables($tables, $dir, $file, $log) { if (empty($tables)) { return array(); } if (!is_array($tables)) { $tables = array($tables); } $new_license_data = fn_uc_get_new_license_data(); if (!empty($new_license_data['new_license']) && !in_array(Registry::get('config.table_prefix') . 'settings', $tables)) { $tables[] = Registry::get('config.table_prefix') . 'settings'; } $file_backuped_tables = "{$dir}/db_backup_tables.txt"; $backuped_tables = is_file($file_backuped_tables) ? explode("\n", fn_get_contents($file_backuped_tables)) : array(); foreach ($tables as $key => &$table) { $table = fn_check_db_prefix($table, Registry::get('config.table_prefix')); if (in_array($table, $backuped_tables)) { unset($tables[$key]); } } if (empty($tables)) { return $tables; } if (false === fn_uc_is_enough_disk_space($file, $tables)) { fn_set_notification('W', __('warning'), __('text_uc_no_enough_space_to_backup_database')); return false; } if (fn_uc_is_mysqldump_available(Registry::get('config.db_password'))) { $log->write('Using mysqldump', __FILE__, __LINE__); $command = 'mysqldump --compact --no-create-db --add-drop-table --default-character-set=utf8 --skip-comments --verbose --host=' . Registry::get('config.db_host') . ' --user='******'config.db_user') . ' --password=\'' . Registry::get('config.db_password') . '\' --databases ' . Registry::get('config.db_name') . ' --tables ' . implode(' ', $tables) . ' >> ' . $file; system($command, $retval); if (0 === $retval) { $backuped_tables = array_merge($backuped_tables, $tables); fn_put_contents($file_backuped_tables, implode("\n", $backuped_tables)); return $tables; } $log->write('mysqldump has reported failure', __FILE__, __LINE__); } $rows_per_pass = 40; $max_row_size = 10000; $t_status = db_get_hash_array("SHOW TABLE STATUS", 'Name'); $f = fopen($file, 'ab'); if (!empty($f)) { foreach ($tables as &$table) { $log->write('Backing up table: ' . $table, __FILE__, __LINE__); fwrite($f, "\nDROP TABLE IF EXISTS " . str_replace('?:', Registry::get('config.table_prefix'), $table) . ";\n"); if (empty($t_status[str_replace('?:', Registry::get('config.table_prefix'), $table)])) { // new table in upgrade, we need drop statement only continue; } $scheme = db_get_row("SHOW CREATE TABLE {$table}"); fwrite($f, array_pop($scheme) . ";\n\n"); $total_rows = db_get_field("SELECT COUNT(*) FROM {$table}"); // Define iterator if ($t_status[str_replace('?:', Registry::get('config.table_prefix'), $table)]['Avg_row_length'] < $max_row_size) { $it = $rows_per_pass; } else { $it = 1; } fn_echo(' .'); for ($i = 0; $i < $total_rows; $i = $i + $it) { $table_data = db_get_array("SELECT * FROM {$table} LIMIT {$i}, {$it}"); foreach ($table_data as $_tdata) { $_tdata = fn_add_slashes($_tdata, true); $values = array(); foreach ($_tdata as $v) { $values[] = $v !== null ? "'{$v}'" : 'NULL'; } fwrite($f, "INSERT INTO " . str_replace('?:', Registry::get('config.table_prefix'), $table) . " (`" . implode('`, `', array_keys($_tdata)) . "`) VALUES (" . implode(', ', $values) . ");\n"); } } $backuped_tables[] = "{$table}"; } fclose($f); @chmod($file, DEFAULT_FILE_PERMISSIONS); fn_put_contents($file_backuped_tables, implode("\n", $backuped_tables)); return $tables; } }
/** * Fuctnions parses SQL file and import data from it * * @param string $file File for import * @param integer $buffer Buffer size for fread function * @param bool $show_status Show or do not show process by printing ' .' * @param integer $show_create_table 0 - Do not print the name of created table, 1 - Print name and get lang_var('create_table'), 2 - Print name without getting lang_var * @param bool $check_prefix Check table prefix and replace it with the installed in config.php * @param bool $track Use queries cache. Do not execute queries that already are executed. * @param bool $skip_errors Skip errors or not * @param bool $move_progress_bar Move COMET progress bar or not on show progress * @return bool false, if file is not accessible */ function db_import_sql_file($file, $buffer = 16384, $show_status = true, $show_create_table = 1, $check_prefix = false, $track = false, $skip_errors = false, $move_progress_bar = true) { if (file_exists($file)) { $path = dirname($file); $file_name = fn_basename($file); $tmp_file = $path . "/{$file_name}.tmp"; $executed_queries = array(); if ($track && file_exists($tmp_file)) { $executed_queries = unserialize(fn_get_contents($tmp_file)); } if ($skip_errors) { $_skip_errors = Registry::get('runtime.database.skip_errors'); Registry::set('runtime.database.skip_errors', true); } $fd = fopen($file, 'r'); if ($fd) { $ret = array(); $rest = ''; $fs = filesize($file); if ($show_status && $move_progress_bar) { fn_set_progress('step_scale', ceil($fs / $buffer)); } while (!feof($fd)) { $str = $rest . fread($fd, $buffer); $rest = fn_parse_queries($ret, $str); if ($show_status) { fn_set_progress('echo', '<br />' . __('importing_data'), $move_progress_bar); } if (!empty($ret)) { foreach ($ret as $query) { if (!in_array($query, $executed_queries)) { if ($show_create_table && preg_match('/CREATE\\s+TABLE\\s+`?(\\w+)`?/i', $query, $matches)) { if ($show_create_table == 1) { $_text = __('creating_table'); } elseif ($show_create_table == 2) { $_text = 'Creating table'; } $table_name = $check_prefix ? fn_check_db_prefix($matches[1], Registry::get('config.table_prefix')) : $matches[1]; if ($show_status) { fn_set_progress('echo', '<br />' . $_text . ': <b>' . $table_name . '</b>', $move_progress_bar); } } if ($check_prefix) { $query = fn_check_db_prefix($query); } Database::query($query); if ($track) { $executed_queries[] = $query; fn_put_contents($tmp_file, serialize($executed_queries)); } if ($show_status) { fn_echo(' .'); } } } $ret = array(); } } fclose($fd); return true; } if ($skip_errors) { Registry::set('runtime.database.skip_errors', $_skip_errors); } } return false; }
/** * Functions creates dump of tables in $file. * * @param mixed $tables Array of tables * @param string $file Dump file name * @return Boolean False on failure */ function fn_uc_backup_tables($tables, $file) { $rows_per_pass = 40; $max_row_size = 10000; if (!empty($tables)) { if (!is_array($tables)) { $tables = array($tables); } $t_status = db_get_hash_array("SHOW TABLE STATUS", 'Name'); $f = fopen($file, 'ab'); if (!empty($f)) { foreach ($tables as &$table) { $table = fn_check_db_prefix($table); fwrite($f, "\nDROP TABLE IF EXISTS " . str_replace('?:', TABLE_PREFIX, $table) . ";\n"); if (empty($t_status[str_replace('?:', TABLE_PREFIX, $table)])) { // new table in upgrade, we need drop statement only continue; } $scheme = db_get_row("SHOW CREATE TABLE {$table}"); fwrite($f, array_pop($scheme) . ";\n\n"); $total_rows = db_get_field("SELECT COUNT(*) FROM {$table}"); // Define iterator if ($t_status[str_replace('?:', TABLE_PREFIX, $table)]['Avg_row_length'] < $max_row_size) { $it = $rows_per_pass; } else { $it = 1; } fn_echo(' .'); for ($i = 0; $i < $total_rows; $i = $i + $it) { $table_data = db_get_array("SELECT * FROM {$table} LIMIT {$i}, {$it}"); foreach ($table_data as $_tdata) { $_tdata = fn_add_slashes($_tdata, true); fwrite($f, "INSERT INTO " . str_replace('?:', TABLE_PREFIX, $table) . " (`" . implode('`, `', array_keys($_tdata)) . "`) VALUES ('" . implode('\', \'', array_values($_tdata)) . "');\n"); } } } fclose($f); @chmod($file, DEFAULT_FILE_PERMISSIONS); return $tables; } } else { return array(); } }