View source
<?php
global $schema_engines;
function schema_phpprint($schema) {
$out = '';
foreach ($schema as $name => $table) {
$out .= schema_phpprint_table($name, $table);
}
return $out;
}
function schema_phpprint_table($name, $table) {
$cols = array();
if (isset($table['fields'])) {
foreach ($table['fields'] as $colname => $col) {
$cols[] = "'{$colname}' => " . schema_phpprint_column($col, TRUE);
}
}
$unique = $index = array();
if (isset($table['unique keys'])) {
foreach ($table['unique keys'] as $keyname => $key) {
$unique[] = "'{$keyname}' => " . schema_phpprint_key($key);
}
}
if (isset($table['indexes'])) {
foreach ($table['indexes'] as $keyname => $key) {
$index[] = "'{$keyname}' => " . schema_phpprint_key($key);
}
}
if (isset($table['description']) && trim($table['description'])) {
$description = $table['description'];
}
else {
$description = t('TODO: please describe this table!');
}
$out = '';
$out .= "\$schema['" . $name . "'] = array(\n";
$out .= " 'description' => '{$description}',\n";
$out .= " 'fields' => array(\n ";
$out .= implode(",\n ", $cols);
$out .= ",\n ),\n";
if (isset($table['primary key'])) {
$out .= " 'primary key' => array('" . implode("', '", $table['primary key']) . "'),\n";
}
if (count($unique) > 0) {
$out .= " 'unique keys' => array(\n ";
$out .= implode(",\n ", $unique);
$out .= "\n ),\n";
}
if (count($index) > 0) {
$out .= " 'indexes' => array(\n ";
$out .= implode(",\n ", $index);
$out .= ",\n ),\n";
}
$out .= ");\n";
return $out;
}
function schema_phpprint_column($col, $multiline = FALSE) {
$attrs = array();
if (isset($col['description']) && trim($col['description'])) {
$description = $col['description'];
}
else {
$description = t('TODO: please describe this field!');
}
unset($col['description']);
$attrs[] = "'description' => '{$description}'";
if (isset($col['size']) && ($col['type'] == 'varchar' || $col['size'] == 'normal')) {
unset($col['size']);
}
foreach (array(
'type',
'unsigned',
'size',
'length',
'not null',
'default',
) as $attr) {
if (isset($col[$attr])) {
if (is_string($col[$attr])) {
$attrs[] = "'{$attr}' => '{$col[$attr]}'";
}
else {
if (is_bool($col[$attr])) {
$attrs[] = "'{$attr}' => " . ($col[$attr] ? 'TRUE' : 'FALSE');
}
else {
$attrs[] = "'{$attr}' => {$col[$attr]}";
}
}
unset($col[$attr]);
}
}
foreach (array_keys($col) as $attr) {
if (is_string($col[$attr])) {
$attrs[] = "'{$attr}' => '{$col[$attr]}'";
}
else {
$attrs[] = "'{$attr}' => {$col[$attr]}";
}
}
if ($multiline) {
return "array(\n " . implode(",\n ", $attrs) . ",\n )";
}
return "array(" . implode(', ', $attrs) . ")";
}
function schema_phpprint_key($keys) {
$ret = array();
foreach ($keys as $key) {
if (is_array($key)) {
$ret[] = "array('{$key[0]}', {$key[1]})";
}
else {
$ret[] = "'{$key}'";
}
}
return "array(" . implode(", ", $ret) . ")";
}
function schema_unprefix_table($name) {
global $db_prefix;
static $_db_prefix;
if (is_array($db_prefix)) {
if (!isset($_db_prefix)) {
foreach ($db_prefix as $key => $val) {
$_db_prefix[$val . $key] = $key;
}
}
if (isset($_db_prefix[$name])) {
return $_db_prefix[$name];
}
else {
if (!empty($db_prefix['default']) && preg_match('@^' . $db_prefix['default'] . '(.*)@', $name, $m)) {
return $m[1];
}
else {
foreach ($db_prefix as $key => $val) {
if ($key != 'default' && preg_match('@^' . $val . '(' . $key . '.*)@', $name, $m) || $key == 'default' && preg_match('@^' . $val . '(.*)@', $name, $m)) {
return $m[1];
}
}
return $name;
}
}
}
else {
if (!empty($db_prefix) && preg_match('@^' . $db_prefix . '(.*)@', $name, $m)) {
return $m[1];
}
}
return $name;
}
function schema_invoke($op) {
$db_name = variable_get('schema_database_connection', 'default');
if ($db_name !== 'default') {
db_set_active($db_name);
}
schema_require();
global $db_type;
$function = 'schema_' . $db_type . '_' . $op;
$args = func_get_args();
array_shift($args);
$return = call_user_func_array($function, $args);
if ($db_name !== 'default') {
db_set_active('default');
}
return $return;
}
function schema_engine_invoke($engine, $op) {
global $db_type;
if (!isset($engine)) {
$engine = $db_type;
}
$function = 'schema_' . $engine . '_' . $op;
$args = func_get_args();
array_shift($args);
return call_user_func_array($function, $args);
}
function schema_engine_type($col, $table, $field, $engine = NULL) {
$map = schema_engine_invoke($engine, 'engine_type_map');
$size = isset($col['size']) ? $col['size'] : 'normal';
$type = $col['type'] . ':' . $size;
if (isset($map[$type])) {
return $map[$type];
}
else {
drupal_set_message(t('%table.%field: no %engine type for Schema type %type.', array(
'%engine' => $engine,
'%type' => $type,
'%table' => $table,
'%field' => $field,
)), 'warning');
return $col['type'];
}
}
function schema_schema_type($type, $table, $field, $engine = NULL) {
$map = schema_engine_invoke($engine, 'schema_type_map');
$type = strtolower($type);
if (isset($map[$type])) {
return explode(':', $map[$type]);
}
else {
if (!variable_get('schema_suppress_type_warnings', FALSE)) {
drupal_set_message(t('Field @table.@field: no Schema type for @engine type @type.', array(
'@engine' => $engine,
'@type' => $type,
'@table' => $table,
'@field' => $field,
)), 'warning');
}
return array(
$type,
'normal',
);
}
}
function schema_compare_schemas($ref, $inspect = NULL) {
if (!isset($inspect)) {
$inspect = schema_invoke('inspect');
}
$info = array();
foreach ($ref as $t_name => $table) {
if (!isset($table['fields']) || !is_array($table['fields'])) {
drupal_set_message(t('Table %table: Missing or invalid \'fields\' array.', array(
'%table' => $t_name,
)), 'warning');
continue;
}
foreach ($table['fields'] as $c_name => $col) {
switch ($col['type']) {
case 'int':
case 'float':
case 'numeric':
if (isset($col['default']) && (!is_numeric($col['default']) || is_string($col['default']))) {
$info['warn'][] = t('%table.%column is type %type but its default %default is PHP type %phptype', array(
'%table' => $t_name,
'%column' => $c_name,
'%type' => $col['type'],
'%default' => $col['default'],
'%phptype' => gettype($col['default']),
));
}
break;
default:
if (isset($col['default']) && !is_string($col['default'])) {
$info['warn'][] = t('%table.%column is type %type but its default %default is PHP type %phptype', array(
'%table' => $t_name,
'%column' => $c_name,
'%type' => $col['type'],
'%default' => $col['default'],
'%phptype' => gettype($col['default']),
));
}
break;
}
}
}
foreach ($ref as $t_name => $table) {
if (!isset($table['fields'])) {
continue;
}
foreach ($table['fields'] as $c_name => $col) {
switch ($col['type']) {
case 'text':
case 'blob':
if (isset($col['default'])) {
$info['warn'][] = t('%table.%column is type %type and may not have a default value', array(
'%table' => $t_name,
'%column' => $c_name,
'%type' => $col['type'],
));
}
break;
}
}
}
foreach ($ref as $t_name => $table) {
if (isset($table['primary key'])) {
$keys = db_field_names($table['primary key']);
foreach ($keys as $key) {
if (!isset($table['fields'][$key]['not null']) || $table['fields'][$key]['not null'] != TRUE) {
$info['warn'][] = t('%table.%column is part of the primary key but is not specified to be \'not null\'.', array(
'%table' => $t_name,
'%column' => $key,
));
}
}
}
}
foreach ($ref as $name => $table) {
if (isset($table['module'])) {
$module = $table['module'];
}
else {
$module = '';
}
if (!isset($inspect[$name])) {
$info['missing'][$module][$name] = array(
'status' => 'missing',
);
}
else {
$status = schema_compare_table($table, $inspect[$name]);
$info[$status['status']][$module][$name] = $status;
unset($inspect[$name]);
}
}
foreach ($inspect as $name => $table) {
$info['extra'][] = $name;
}
return $info;
}
function schema_compare_table($ref, $inspect = NULL) {
global $db_type;
$_db_type = $db_type;
if ($_db_type == 'mysqli') {
$_db_type = 'mysql';
}
if (!isset($inspect)) {
$ref_name = db_prefix_tables('{' . $ref['name'] . '}');
$inspect = schema_invoke('inspect', $ref_name);
$inspect = $inspect[$ref['name']];
}
if (!isset($inspect)) {
return array(
'status' => 'missing',
);
}
$reasons = $notes = array();
$col_keys = array_flip(array(
'type',
'size',
'not null',
'length',
'unsigned',
'default',
'scale',
'precision',
));
foreach ($ref['fields'] as $colname => $col) {
$serial = $col['type'] == 'serial' ? TRUE : FALSE;
$name = isset($ref['name']) ? $ref['name'] : '';
$dbtype = schema_engine_type($col, $name, $colname);
list($col['type'], $col['size']) = schema_schema_type($dbtype, $name, $colname);
if ($serial) {
$col['type'] = 'serial';
}
if (isset($col[$_db_type . '_type'])) {
$col['type'] = $col[$_db_type . '_type'];
}
$col = array_intersect_key($col, $col_keys);
if (!isset($inspect['fields'][$colname])) {
$reasons[] = "{$colname}: not in database";
continue;
}
if (!isset($col['default']) || is_null($col['default']) && !isset($inspect['fields'][$colname]['default'])) {
unset($col['default']);
}
$kdiffs = array();
foreach ($col_keys as $key => $val) {
if (!(isset($col[$key]) && !is_null($col[$key]) && $col[$key] !== FALSE && isset($inspect['fields'][$colname][$key]) && $inspect['fields'][$colname][$key] !== FALSE && $col[$key] == $inspect['fields'][$colname][$key] || (!isset($col[$key]) || is_null($col[$key]) || $col[$key] === FALSE) && (!isset($inspect['fields'][$colname][$key]) || $inspect['fields'][$colname][$key] === FALSE))) {
$kdiffs[] = $key;
}
}
if (count($kdiffs) != 0) {
$reasons[] = "column {$colname} - difference" . (count($kdiffs) > 1 ? 's' : '') . " on: " . implode(', ', $kdiffs) . "<br/>declared: " . schema_phpprint_column($col) . '<br/>actual: ' . schema_phpprint_column($inspect['fields'][$colname]);
}
unset($inspect['fields'][$colname]);
}
foreach ($inspect['fields'] as $colname => $col) {
$reasons[] = "{$colname}: unexpected column in database";
}
if (isset($ref['primary key'])) {
if (!isset($inspect['primary key'])) {
$reasons[] = "primary key: missing in database";
}
else {
if ($ref['primary key'] !== $inspect['primary key']) {
$reasons[] = "primary key:<br />declared: " . schema_phpprint_key($ref['primary key']) . '<br />actual: ' . schema_phpprint_key($inspect['primary key']);
}
}
}
else {
if (isset($inspect['primary key'])) {
$reasons[] = "primary key: missing in schema";
}
}
foreach (array(
'unique keys',
'indexes',
) as $type) {
if (isset($ref[$type])) {
foreach ($ref[$type] as $keyname => $key) {
if (!isset($inspect[$type][$keyname])) {
$reasons[] = "{$type} {$keyname}: missing in database";
continue;
}
if ($key !== $inspect[$type][$keyname]) {
$reasons[] = "{$type} {$keyname}:<br />declared: " . schema_phpprint_key($key) . '<br />actual: ' . schema_phpprint_key($inspect[$type][$keyname]);
}
unset($inspect[$type][$keyname]);
}
}
if (isset($inspect[$type])) {
foreach ($inspect[$type] as $keyname => $col) {
$notes[] = "{$type} {$keyname}: unexpected (not an error)";
}
}
}
$status = count($reasons) ? 'different' : 'same';
return array(
'status' => $status,
'reasons' => $reasons,
'notes' => $notes,
);
}
function schema_init() {
schema_require();
}
function schema_require() {
static $done = 0;
if ($done++) {
return;
}
$path = drupal_get_path('module', 'schema');
require_once "{$path}/schema_util.inc";
$files = drupal_system_listing('schema_.*\\.inc$', $path . '/modules', 'name', 0);
foreach ($files as $file) {
$module = substr_replace($file->name, '', 0, 7);
require_once "./{$file->filename}";
}
global $db_type, $schema_engines;
if (!isset($db_type)) {
return;
}
$schema_engines = array();
if (0) {
$engine = drupal_get_path('module', 'schema') . '/engines/schema_' . $db_type . '.inc';
if (is_file($engine)) {
require_once $engine;
$schema_engines[] = $db_type;
}
}
else {
$files = drupal_system_listing('schema_.*\\.inc$', $path . '/engines', 'name', 0);
foreach ($files as $file) {
require_once "./{$file->filename}";
$schema_engines[] = substr($file->filename, strlen($path) + 16, -4);
}
}
if (array_search($db_type, $schema_engines) === FALSE) {
drupal_set_message('The Schema module does not support the "' . $db_type . '" database type.', 'error');
}
}
function schema_perm() {
return array(
'administer schema',
);
}
function schema_menu() {
$items['admin/build/schema'] = array(
'title' => 'Schema',
'description' => 'Manage the database schema for this system.',
'page callback' => 'schema_report',
'access arguments' => array(
'administer schema',
),
);
$items['admin/build/schema/report'] = array(
'title' => 'Compare',
'type' => MENU_DEFAULT_LOCAL_TASK,
'page callback' => 'schema_report',
'weight' => -10,
'access arguments' => array(
'administer schema',
),
);
$items['admin/build/schema/describe'] = array(
'title' => 'Describe',
'type' => MENU_LOCAL_TASK,
'page callback' => 'schema_describe',
'weight' => -8,
'access arguments' => array(
'administer schema',
),
);
$items['admin/build/schema/inspect'] = array(
'title' => 'Inspect',
'type' => MENU_LOCAL_TASK,
'page callback' => 'schema_inspect',
'weight' => -6,
'access arguments' => array(
'administer schema',
),
);
$items['admin/build/schema/sql'] = array(
'title' => 'SQL',
'type' => MENU_LOCAL_TASK,
'page callback' => 'schema_sql',
'weight' => -4,
'access arguments' => array(
'administer schema',
),
);
global $db_type, $schema_engines;
if (FALSE && isset($schema_engines) && is_array($schema_engines)) {
foreach ($schema_engines as $engine) {
$items['admin/build/schema/sql/' . $engine] = array(
'title' => t($engine),
'type' => $engine == $db_type ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
'page callback' => 'schema_sql',
'callback arguments' => $engine,
'access arguments' => array(
'administer schema',
),
);
}
}
$items['admin/build/schema/show'] = array(
'title' => 'Show',
'type' => MENU_LOCAL_TASK,
'page callback' => 'schema_show',
'weight' => -2,
'access arguments' => array(
'administer schema',
),
);
$items['admin/build/schema/settings'] = array(
'title' => 'Settings',
'type' => MENU_LOCAL_TASK,
'page callback' => 'drupal_get_form',
'page arguments' => array(
'schema_settings',
),
'weight' => 0,
'access arguments' => array(
'administer schema',
),
);
return $items;
}
function _schema_process_description($desc) {
return preg_replace('@{([a-z_]+)}@i', '<a href="#" onclick="Drupal.toggleFieldset($(\'#table-$1\')[0]); return false;">$1</a>', $desc);
}
function schema_describe() {
$schema = drupal_get_schema(NULL, TRUE);
ksort($schema);
$row_hdrs = array(
t('Name'),
t('Type[:Size]'),
t('Null?'),
t('Default'),
);
$output = <<<EOT
<p>This page describes the Drupal database schema. Click on a table name
to see that table's description and fields. Table names within a table or
field description are hyperlinks to that table's description.</p>
EOT;
$default_table_description = t('TODO: please describe this table!');
$default_field_description = t('TODO: please describe this field!');
foreach ($schema as $t_name => $t_spec) {
$rows = array();
foreach ($t_spec['fields'] as $c_name => $c_spec) {
$row = array();
$row[] = $c_name;
$type = $c_spec['type'];
if (!empty($c_spec['length'])) {
$type .= '(' . $c_spec['length'] . ')';
}
if (!empty($c_spec['scale']) && !empty($c_spec['precision'])) {
$type .= '(' . $c_spec['precision'] . ', ' . $c_spec['scale'] . ')';
}
if (!empty($c_spec['size']) && $c_spec['size'] != 'normal') {
$type .= ':' . $c_spec['size'];
}
if ($c_spec['type'] == 'int' && !empty($c_spec['unsigned'])) {
$type .= ', unsigned';
}
$row[] = $type;
$row[] = !empty($c_spec['not null']) ? 'NO' : 'YES';
$row[] = isset($c_spec['default']) ? is_string($c_spec['default']) ? '\'' . $c_spec['default'] . '\'' : $c_spec['default'] : '';
$rows[] = $row;
if (!empty($c_spec['description']) && $c_spec['description'] != $default_field_description) {
$desc = _schema_process_description($c_spec['description']);
$rows[] = array(
array(
'colspan' => count($row_hdrs),
'data' => $desc,
),
);
}
else {
drupal_set_message(_schema_process_description(t('Field {!table}.@field has no description.', array(
'!table' => $t_name,
'@field' => $c_name,
))), 'warning');
}
}
if (empty($t_spec['description']) || $t_spec['description'] == $default_table_description) {
drupal_set_message(_schema_process_description(t('Table {!table} has no description.', array(
'!table' => $t_name,
))), 'warning');
}
$form = array();
$form[$t_name] = array(
'#type' => 'fieldset',
'#title' => t('@table (@module module)', array(
'@table' => $t_name,
'@module' => isset($t_spec['module']) ? $t_spec['module'] : '',
)),
'#description' => !empty($t_spec['description']) ? _schema_process_description($t_spec['description']) : '',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attributes' => array(
'id' => 'table-' . $t_name,
),
);
$form[$t_name]['content'] = array(
'#value' => theme('table', $row_hdrs, $rows),
);
$output .= drupal_render($form);
}
return $output;
}
function schema_report() {
$states = array(
'same' => t('Match'),
'different' => t('Mismatch'),
'missing' => t('Missing'),
'extra' => t('Extra'),
);
$descs = array(
'same' => 'Tables for which the schema and database agree.',
'different' => 'Tables for which the schema and database are different.',
'missing' => 'Tables in the schema that are not present in the database.',
'extra' => 'Tables in the database that are not present in the schema. This indicates previously installed modules that are disabled but not un-installed or modules that do not use the Schema API.',
);
$schema = drupal_get_schema(NULL, TRUE);
$info = schema_compare_schemas($schema);
foreach ($info as $state => $modules) {
$counts[$state] = 0;
$data[$state] = $state == 'extra' ? array() : '';
if ($state == 'extra') {
$data[$state] = array_merge($data[$state], $modules);
$counts[$state] += count($modules);
continue;
}
else {
if ($state == 'warn') {
foreach ($modules as $msg) {
drupal_set_message($msg, 'warning');
}
continue;
}
}
foreach ($modules as $module => $tables) {
$counts[$state] += count($tables);
switch ($state) {
case 'same':
case 'missing':
$data[$state] .= theme('item_list', array_keys($tables), $module);
break;
case 'different':
$items = array();
foreach ($tables as $name => $stuff) {
$items[] = "<h4>{$name}</h4>" . theme('item_list', array_merge($tables[$name]['reasons'], $tables[$name]['notes']));
}
$form = array();
$form[$module] = array(
'#type' => 'fieldset',
'#title' => t($module),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#value' => '',
);
$form[$module]['content'] = array(
'#value' => theme('item_list', $items),
);
$data[$state] .= drupal_render($form);
break;
}
}
}
if (isset($data['extra'])) {
$data['extra'] = theme('item_list', $data['extra']);
}
$form = array();
$weight = 0;
foreach ($states as $state => $content) {
$content = isset($data[$state]) ? $data[$state] : '';
$form[$state] = array(
'#type' => 'fieldset',
'#title' => t('@state (@count)', array(
'@state' => $states[$state],
'@count' => isset($counts[$state]) ? $counts[$state] : 0,
)),
'#description' => t($descs[$state]),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => $weight++,
'#value' => '',
);
$form[$state]['content'] = array(
'#type' => 'markup',
'#value' => $content,
);
}
$output = <<<EOT
<p>This page compares the live database as it currently exists against
the combination of all schema information provided by all enabled modules.</p>
EOT;
$output .= drupal_render($form);
return $output;
}
function schema_inspect() {
$mods = module_list();
sort($mods);
$mods = array_flip($mods);
$schema = drupal_get_schema(NULL, TRUE);
$inspect = schema_invoke('inspect');
foreach ($inspect as $name => $table) {
$module = isset($schema[$name]['module']) ? $schema[$name]['module'] : 'Unknown';
if (!isset($form[$module])) {
$form[$module] = array(
'#type' => 'fieldset',
'#access' => TRUE,
'#title' => check_plain($module),
'#collapsible' => TRUE,
'#collapsed' => $module != 'Unknown',
'#weight' => $module == 'Unknown' ? 0 : $mods[$module] + 1,
'#value' => '',
);
}
if (isset($schema[$name]['module'])) {
$form[$module][$name] = array(
'#type' => 'markup',
'#value' => '<textarea style="width:100%" rows="10">' . check_plain(schema_phpprint_table($name, $schema[$name])) . '</textarea>',
);
}
else {
$form[$module][$name] = array(
'#type' => 'markup',
'#value' => '<textarea style="width:100%" rows="10">' . check_plain(schema_phpprint_table($name, $inspect[$name])) . '</textarea>',
);
}
}
$output = <<<EOT
<p>This page shows the live database schema as it currently
exists on this system. Known tables are grouped by the module that
defines them; unknown tables are all grouped together.</p>
<p>To implement hook_schema() for a module that has existing tables, copy
the schema structure for those tables directly into the module's
hook_schema() and return \$schema.</p>
EOT;
$output .= drupal_render($form);
return $output;
}
function schema_sql($engine = NULL) {
$schema = drupal_get_schema(NULL, TRUE);
$sql = '';
foreach ($schema as $name => $table) {
if (substr($name, 0, 1) == '#') {
continue;
}
if ($engine) {
$stmts = call_user_func('schema_' . $engine . '_create_table_sql', $table);
}
else {
$stmts = db_create_table_sql($name, $table);
}
$sql .= implode(";\n", $stmts) . ";\n\n";
}
$output = <<<EOT
<p>This page shows the CREATE TABLE statements that the Schema module
generates for the selected database engine for each table defined by a
module. It is for debugging purposes.</p>
<textarea style="width:100%" rows="30">{<span class="php-variable">$sql</span>}</textarea>
EOT;
return $output;
}
function schema_show() {
$schema = drupal_get_schema(NULL, TRUE);
$show = var_export($schema, 1);
$output = <<<EOT
<p>This page displays the Drupal database schema data structure. It is for
debugging purposes.</p>
<textarea style="width:100%" rows="30">{<span class="php-variable">$show</span>}</textarea>
EOT;
return $output;
}
function schema_settings() {
global $db_url;
if (is_array($db_url) && count($db_url) > 1) {
$form['schema_database_connection'] = array(
'#type' => 'select',
'#title' => t('Database connection to use'),
'#default_value' => variable_get('schema_database_connection', 'default'),
'#options' => array_combine(array_keys($db_url), array_keys($db_url)),
'#description' => t('If you use a secondary database other than the default
Drupal database you can select it here and use schema\'s "compare" and
"inspect" functions on that other database.'),
);
}
$form['schema_status_report'] = array(
'#type' => 'checkbox',
'#title' => t('Include schema comparison reports in site status report'),
'#default_value' => variable_get('schema_status_report', TRUE),
'#description' => t('When checked, schema comparison reports are run on
the Administer page, and included in the site status report.'),
);
$form['schema_suppress_type_warnings'] = array(
'#type' => 'checkbox',
'#title' => t('Suppress schema warnings.'),
'#default_value' => variable_get('schema_suppress_type_warnings', FALSE),
'#description' => t('When checked, missing schema type warnings will be suppressed.'),
);
return system_settings_form($form);
}