function _demo_dump_table_schema in Demonstration site (Sandbox / Snapshot) 7
Same name and namespace in other branches
- 8 demo.module \_demo_dump_table_schema()
- 6 database_mysql_dump.inc \_demo_dump_table_schema()
Dump table schema.
Parameters
$fp: The file handle of the output file.
$table: A table name to export the schema for.
1 call to _demo_dump_table_schema()
- demo_dump_db in ./
database_mysql_dump.inc - Dump active database.
File
- ./
database_mysql_dump.inc, line 115
Code
function _demo_dump_table_schema($fp, $table) {
$output = "\n";
$output .= "--\n";
$output .= "-- Table structure for table '{$table}'\n";
$output .= "--\n\n";
$data = db_query("SHOW CREATE TABLE `{$table}`")
->fetchAssoc();
$status = db_query('SHOW TABLE STATUS LIKE :table', array(
':table' => $table,
))
->fetchAssoc();
// Capitalization of keys depends on PDO database connection options.
// Convert them to lowercase.
foreach ($data as $key => $value) {
unset($data[$key]);
$data[strtolower($key)] = $value;
}
foreach ($status as $key => $value) {
unset($status[$key]);
$status[strtolower($key)] = $value;
}
// Add IF NOT EXISTS to CREATE TABLE, replace double quotes with MySQL quotes.
$output .= preg_replace(array(
'/^CREATE TABLE/',
'/"/',
), array(
'CREATE TABLE IF NOT EXISTS',
'`',
), $data['create table']);
// @todo Rethink the following code. Perhaps try to strip + parse the existing
// table definition (after leading ")" on last line) and merge anything
// missing into it, and re-append it again. There are too many differences
// between MySQL 5.0 and 5.1+, and PHP mysql(i) and pdo_mysql extensions.
// PDO is missing the table engine.
if (!strpos($output, ' ENGINE=')) {
$output .= ' ENGINE=' . $status['engine'];
}
// Always add charset and collation info to table definitions.
// SHOW CREATE TABLE does not contain collation information, if the collation
// is equal to the default collation of the connection. Since dumps can be
// moved across servers, we need to ensure correct collations.
// Note that [DEFAULT] CHARSET or [DEFAULT] CHARACTER SET is always contained
// on MySQL 5.1, even if it is equal to the default.
// This addition assumes that a collation specified for a table is taken over
// for the table's columns. The MySQL manual does not state whether this is
// the case, but manual tests confirmed that it works that way.
// Like Drupal core, we need to enforce UTF8 as character set and
// utf8_general_ci as default database collation, if not overridden via
// settings.php.
if (!strpos($output, 'COLLATE=')) {
// If there is a character set defined already, just append the collation.
// Only look for the table definition (on the last line); column definitions
// may use a special collation, which must not be changed.
if (preg_match('@^\\).+(?:CHARSET|CHARACTER SET)@m', $output)) {
$output = preg_replace('@((?:DEFAULT )?(?:CHARSET|CHARACTER SET) \\w+)@', '$1 ', $output);
}
else {
$output .= ' DEFAULT CHARSET=utf8 ';
}
}
// Add the table comment, if any.
if (!preg_match('@^\\) .*COMMENT.+$@', $output) && !empty($status['comment'])) {
// On PHP 5.2.6/Win32 with PDO MySQL 5.0 with InnoDB, the table comment has
// a trailing "; InnoDB free: 84992 kB".
$status['comment'] = preg_replace('@; InnoDB free: .+$@', '', $status['comment']);
$output .= " COMMENT='" . $status['comment'] . "'";
}
// @todo Depends on whether we dump data and table existence on import.
// if (!empty($status['auto_increment'])) {
// $output .= ' AUTO_INCREMENT=' . $status['auto_increment'];
// }
$output .= ";\n";
fwrite($fp, $output);
}