mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-04-28 23:03:25 +09:00
Restrict index size to 191 chars for utf8mb4 and 255 chars for utf8 (767 chars total)
This commit is contained in:
parent
93e597989d
commit
93be42c477
3 changed files with 58 additions and 10 deletions
|
|
@ -14,6 +14,8 @@ class Column
|
|||
public $utf8mb4 = true;
|
||||
public $default_value;
|
||||
public $not_null = false;
|
||||
public $is_indexed = false;
|
||||
public $is_unique = false;
|
||||
public $is_primary_key = false;
|
||||
public $auto_increment = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,12 +28,18 @@ class Table
|
|||
|
||||
// Add columns.
|
||||
$columns = array();
|
||||
$adjusted_sizes = array();
|
||||
foreach ($this->columns as $column)
|
||||
{
|
||||
$columndef = ' `' . $column->name . '`' . ' ' . strtoupper($column->type);
|
||||
$max_size = $column->utf8mb4 ? 191 : 255;
|
||||
if (preg_match('/char/i', $column->type) && $column->size > $max_size && ($column->is_unique || $column->is_primary_key))
|
||||
{
|
||||
$adjusted_sizes[$column->name] = $max_size;
|
||||
}
|
||||
if ($column->size)
|
||||
{
|
||||
$columndef .= '(' . $column->size . ')';
|
||||
$columndef .= '(' . (isset($adjusted_sizes[$column->name]) ? $adjusted_sizes[$column->name] : $column->size) . ')';
|
||||
}
|
||||
if ($column->utf8mb4 === false && $charset === 'utf8mb4')
|
||||
{
|
||||
|
|
@ -72,9 +78,18 @@ class Table
|
|||
}
|
||||
foreach ($this->indexes as $index)
|
||||
{
|
||||
$idxcolumns = array_map(function($str) {
|
||||
return '`' . $str . '`';
|
||||
}, $index->columns);
|
||||
$idxcolumns = array();
|
||||
foreach ($index->columns as $column_name => $prefix_size)
|
||||
{
|
||||
$column_info = $this->columns[$column_name];
|
||||
$current_size = isset($adjusted_sizes[$column->name]) ? $adjusted_sizes[$column->name] : $column->size;
|
||||
$max_size = $column_info->utf8mb4 ? 191 : 255;
|
||||
if (preg_match('/char/i', $column->type) && $current_size > $max_size)
|
||||
{
|
||||
$prefix_size = $max_size;
|
||||
}
|
||||
$idxcolumns[] = '`' . $column_name . '`' . ($prefix_size > 0 ? "($prefix_size)" : '');
|
||||
}
|
||||
$idxtype = ($index->is_unique ? 'UNIQUE' : 'INDEX');
|
||||
$idxdef = ' ' . $idxtype . ' `' . $index->name . '` (' . implode(', ', $idxcolumns) . ')';
|
||||
$columns[] = $idxdef;
|
||||
|
|
|
|||
|
|
@ -29,12 +29,21 @@ class DBTableParser
|
|||
* Load a table definition XML file.
|
||||
*
|
||||
* @param string $filename
|
||||
* @param string $content
|
||||
* @return object|false
|
||||
*/
|
||||
public static function loadXML(string $filename)
|
||||
public static function loadXML(string $filename = '', string $content = '')
|
||||
{
|
||||
// Load the XML file.
|
||||
$xml = simplexml_load_string(file_get_contents($filename));
|
||||
// Load the XML content.
|
||||
if ($content)
|
||||
{
|
||||
$xml = simplexml_load_string($content);
|
||||
}
|
||||
else
|
||||
{
|
||||
$xml = simplexml_load_string(file_get_contents($filename));
|
||||
}
|
||||
|
||||
if ($xml === false)
|
||||
{
|
||||
return false;
|
||||
|
|
@ -107,7 +116,8 @@ class DBTableParser
|
|||
$table->indexes[$index_name] = new DBTable\Index;
|
||||
$table->indexes[$index_name]->name = $index_name;
|
||||
}
|
||||
$table->indexes[$index_name]->columns[] = $column->name;
|
||||
$table->indexes[$index_name]->columns[$column->name] = 0;
|
||||
$column->is_indexed = true;
|
||||
}
|
||||
if (isset($column_info['unique']))
|
||||
{
|
||||
|
|
@ -118,7 +128,9 @@ class DBTableParser
|
|||
$table->indexes[$index_name]->name = $index_name;
|
||||
$table->indexes[$index_name]->is_unique = true;
|
||||
}
|
||||
$table->indexes[$index_name]->columns[] = $column->name;
|
||||
$table->indexes[$index_name]->columns[$column->name] = 0;
|
||||
$column->is_indexed = true;
|
||||
$column->is_unique = true;
|
||||
}
|
||||
|
||||
// Get primary key information.
|
||||
|
|
@ -128,6 +140,8 @@ class DBTableParser
|
|||
if ($attr === 'primary_key' || $attr === 'primary-key' || toBool($attr))
|
||||
{
|
||||
$table->primary_key[] = $column->name;
|
||||
$column->is_indexed = true;
|
||||
$column->is_unique = true;
|
||||
$column->is_primary_key = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -151,8 +165,25 @@ class DBTableParser
|
|||
{
|
||||
$index = new DBTable\Index;
|
||||
$index->name = strval($index_info['name']);
|
||||
$index->columns = array_map('trim', explode(',', strval($index_info['columns'])));
|
||||
$idxcolumns = array_map('trim', explode(',', strval($index_info['columns'])));
|
||||
foreach ($idxcolumns as $idxcolumn)
|
||||
{
|
||||
if (preg_match('/^(\S+)\s*\(([0-9]+)\)$/', $idxcolumn, $matches))
|
||||
{
|
||||
$index->columns[$matches[1]] = intval($matches[2]);
|
||||
$idxcolumn = $matches[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
$index->columns[$idxcolumn] = 0;
|
||||
}
|
||||
}
|
||||
$index->is_unique = ($index_info['unique'] === 'unique' || toBool(strval($index_info['unique'])));
|
||||
if (isset($table->columns[$idxcolumn]) && is_object($table->columns[$idxcolumn]))
|
||||
{
|
||||
$table->columns[$idxcolumn]->is_indexed = true;
|
||||
$table->columns[$idxcolumn]->is_unique = $index->is_unique;
|
||||
}
|
||||
$table->indexes[$index->name] = $index;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue