View source
<?php
if (!defined('MYSQLI_BINARY_FLAG')) {
define('MYSQLI_BINARY_FLAG', 128);
}
function demo_dump_db($filename, $options = array()) {
$directory = dirname($filename);
if (!file_check_directory($directory, FILE_CREATE_DIRECTORY)) {
return FALSE;
}
if ($fp = fopen($filename, 'wb')) {
$header = array();
$header[] = '-- Demo module database dump';
$header[] = '-- Version ' . DEMO_DUMP_VERSION;
$header[] = '-- http://drupal.org/project/demo';
$header[] = '--';
$header[] = '-- Database: ' . _demo_get_database();
$header[] = '-- Date: ' . format_date(time(), 'small');
$header[] = '-- Server version: ' . db_version();
$header[] = '-- PHP version: ' . PHP_VERSION;
$header[] = '-- Drupal version: ' . VERSION;
$header[] = '';
$header[] = 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";';
$header[] = 'SET FOREIGN_KEY_CHECKS = 0;';
$header[] = '';
$header[] = 'SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;';
$header[] = 'SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;';
$header[] = 'SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;';
$header[] = 'SET NAMES utf8;';
$header[] = '';
fwrite($fp, implode("\n", $header));
foreach ($options['tables'] as $table => $dump_options) {
if (!_demo_table_is_view($table)) {
if ($dump_options['schema']) {
_demo_dump_table_schema($fp, $table);
}
if ($dump_options['data']) {
_demo_dump_table_data($fp, $table);
}
}
}
$footer = array();
$footer[] = '';
$footer[] = 'SET FOREIGN_KEY_CHECKS = 1;';
$footer[] = 'SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;';
$footer[] = 'SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;';
$footer[] = 'SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;';
$footer[] = '';
$footer[] = '';
fwrite($fp, implode("\n", $footer));
fclose($fp);
return TRUE;
}
return FALSE;
}
function _demo_get_database() {
$database = array_keys(db_fetch_array(db_query('SHOW TABLES')));
$database = preg_replace('/^Tables_in_/i', '', $database[0]);
return $database;
}
function _demo_enum_tables() {
return db_query('SHOW TABLES');
}
function _demo_dump_table_schema($fp, $table) {
$output = "\n";
$output .= "--\n";
$output .= "-- Structure for table '{$table}'\n";
$output .= "--\n\n";
$data = db_fetch_array(db_query("SHOW CREATE TABLE %s", $table));
$status = db_fetch_array(db_query("SHOW TABLE STATUS LIKE '%s'", $table));
foreach ($data as $key => $value) {
$key_lower = drupal_strtolower($key);
if ($key != $key_lower) {
$data[$key_lower] = $value;
unset($data[$key]);
}
}
foreach ($status as $key => $value) {
$key_lower = drupal_strtolower($key);
if ($key != $key_lower) {
$status[$key_lower] = $value;
unset($status[$key]);
}
}
$output .= preg_replace(array(
'/^CREATE TABLE/',
'/"/',
), array(
'CREATE TABLE IF NOT EXISTS',
'`',
), $data['create table']);
if (!strpos($output, ' ENGINE=')) {
$output .= ' ENGINE=' . $status['engine'];
}
if (!strpos($output, 'COLLATE=')) {
if (strpos($status['collation'], '_')) {
$collate = 'COLLATE=' . $status['collation'];
}
if (strpos($output, 'CHARSET') || strpos($output, 'CHARACTER SET')) {
$output = preg_replace('@((?:DEFAULT )?(?:CHARSET|CHARACTER SET) \\w+)@', '$1 ' . $collate, $output);
}
else {
$output .= ' DEFAULT CHARSET=utf8 ' . $collate;
}
}
if (!preg_match('@^\\) .*COMMENT.+$@', $output) && !empty($status['comment'])) {
$status['comment'] = preg_replace('@; InnoDB free: .+$@', '', $status['comment']);
$output .= " COMMENT='" . $status['comment'] . "'";
}
$output .= ";\n";
fwrite($fp, $output);
}
function _demo_dump_table_data($fp, $table) {
$output = "\n";
$output .= "--\n";
$output .= "-- Data for table '{$table}'\n";
$output .= "--\n\n";
$result = db_query("SELECT * FROM %s", $table);
if ($fields = _demo_get_fields($result)) {
$output .= "/*!40000 ALTER TABLE {$table} DISABLE KEYS */;\n";
$search = array(
'\\',
"'",
"\0",
"\n",
"\r",
"\32",
);
$replace = array(
'\\\\',
"''",
'\\0',
'\\n',
'\\r',
'\\Z',
);
$insert_cmd = "INSERT INTO `{$table}` VALUES\n";
$insert_buffer = '';
$current_row = 0;
$query_size = 0;
while ($row = db_fetch_array($result)) {
$current_row++;
$values = array();
$field = 0;
foreach ($row as $value) {
if (!isset($value) || is_null($value)) {
$values[] = 'NULL';
}
else {
if ($fields[$field]->numeric && !$fields[$field]->timestamp && !$fields[$field]->blob) {
$values[] = $value;
}
else {
if ($fields[$field]->binary && $fields[$field]->blob) {
if (empty($value) && $value != '0') {
$values[] = "''";
}
else {
$values[] = '0x' . bin2hex($value);
}
}
else {
$values[] = "'" . str_replace($search, $replace, $value) . "'";
}
}
}
$field++;
}
if ($current_row == 1) {
$insert_buffer = $insert_cmd . '(' . implode(', ', $values) . ')';
}
else {
$insert_buffer = '(' . implode(', ', $values) . ')';
if ($query_size + strlen($insert_buffer) > 50000) {
fwrite($fp, $output . ";\n");
$output = '';
$current_row = 1;
$query_size = 0;
$insert_buffer = $insert_cmd . $insert_buffer;
}
}
$query_size += strlen($insert_buffer);
$output .= ($current_row == 1 ? '' : ",\n") . $insert_buffer;
}
if ($current_row > 0) {
$output .= ";\n";
}
$output .= "/*!40000 ALTER TABLE {$table} ENABLE KEYS */;\n";
}
fwrite($fp, $output);
}
function _demo_get_fields($result) {
$fields = array();
switch ($GLOBALS['db_type']) {
case 'mysql':
$num_fields = mysql_num_fields($result);
for ($i = 0; $i < $num_fields; $i++) {
$meta = mysql_fetch_field($result, $i);
$meta->timestamp = (int) ($meta->type == 'timestamp');
$flags = mysql_field_flags($result, $i);
$meta->binary = (int) (stristr($flags, 'binary') !== FALSE);
$fields[] = $meta;
}
break;
case 'mysqli':
while ($meta = mysqli_fetch_field($result)) {
$meta->numeric = (int) (bool) ($meta->flags & MYSQLI_NUM_FLAG);
$meta->blob = (int) (bool) ($meta->flags & MYSQLI_BLOB_FLAG);
$meta->timestamp = (int) ($meta->type == MYSQLI_TYPE_TIMESTAMP);
$meta->binary = (int) (bool) ($meta->flags & MYSQLI_BINARY_FLAG);
$fields[] = $meta;
}
break;
}
return $fields;
}
function _demo_table_is_view($table) {
static $tables = array();
if (!isset($tables[$table])) {
$status = db_fetch_array(db_query("SHOW TABLE STATUS LIKE '%s'", $table));
foreach ($status as $key => $value) {
$key_lower = drupal_strtolower($key);
if ($key != $key_lower) {
$status[$key_lower] = $value;
}
}
$tables[$table] = drupal_strtoupper(drupal_substr($status['comment'], 0, 4)) == 'VIEW';
}
return $tables[$table];
}