X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmysqlschema.php;h=f1fc0f46ecd5c600fa12c4d4e128387288718ac1;hb=4ea396f8718648ef6b900ea2aa8a7cad9f14d721;hp=937c20ea8baa87fd4be049fed5b4b95b09790acc;hpb=a67160e01ecd320b263923cd0a69a68e946a1937;p=quix0rs-gnu-social.git diff --git a/lib/mysqlschema.php b/lib/mysqlschema.php index 937c20ea8b..f1fc0f46ec 100644 --- a/lib/mysqlschema.php +++ b/lib/mysqlschema.php @@ -117,9 +117,14 @@ class MysqlSchema extends Schema $field['not null'] = true; } if ($row['COLUMN_DEFAULT'] !== null) { - $field['default'] = $row['COLUMN_DEFAULT']; - if ($this->isNumericType($type)) { - $field['default'] = intval($field['default']); + // Hack for timestamp cols + if ($type == 'timestamp' && $row['COLUMN_DEFAULT'] == 'CURRENT_TIMESTAMP') { + // skip + } else { + $field['default'] = $row['COLUMN_DEFAULT']; + if ($this->isNumericType($type)) { + $field['default'] = intval($field['default']); + } } } if ($row['COLUMN_KEY'] !== null) { @@ -239,6 +244,20 @@ class MysqlSchema extends Schema return $this->fetchQueryData($sql); } + /** + * Append an SQL statement with an index definition for a full-text search + * index over one or more columns on a table. + * + * @param array $statements + * @param string $table + * @param string $name + * @param array $def + */ + function appendCreateFulltextIndex(array &$statements, $table, $name, array $def) + { + $statements[] = "CREATE FULLTEXT INDEX $name ON $table " . $this->buildIndexList($def); + } + /** * Close out a 'create table' SQL statement. * @@ -251,7 +270,16 @@ class MysqlSchema extends Schema */ function endCreateTable($name, array $def) { - return ") ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin"; + $engine = $this->preferredEngine($def); + return ") ENGINE=$engine CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"; + } + + function preferredEngine($def) + { + if (!empty($def['fulltext indexes'])) { + return 'MyISAM'; + } + return 'InnoDB'; } /** @@ -270,6 +298,16 @@ class MysqlSchema extends Schema return "{$tableName}_{$columnName}_idx"; } + /** + * MySQL doesn't take 'DROP CONSTRAINT', need to treat primary keys as + * if they were indexes here, but can use 'PRIMARY KEY' special name. + * + * @param array $phrase + */ + function appendAlterDropPrimary(array &$phrase) + { + $phrase[] = 'DROP PRIMARY KEY'; + } /** * MySQL doesn't take 'DROP CONSTRAINT', need to treat unique keys as @@ -287,18 +325,20 @@ class MysqlSchema extends Schema * Throw some table metadata onto the ALTER TABLE if we have a mismatch * in expected type, collation. */ - function appendAlterExtras(array &$phrase, $tableName) + function appendAlterExtras(array &$phrase, $tableName, array $def) { // Check for table properties: make sure we're using a sane // engine type and charset/collation. // @fixme make the default engine configurable? $oldProps = $this->getTableProperties($tableName, array('ENGINE', 'TABLE_COLLATION')); - if (strtolower($oldProps['ENGINE']) != 'innodb') { - $phrase[] = 'ENGINE=InnoDB'; + $engine = $this->preferredEngine($def); + if (strtolower($oldProps['ENGINE']) != strtolower($engine)) { + $phrase[] = "ENGINE=$engine"; } - if (strtolower($oldProps['TABLE_COLLATION']) != 'utf8_bin') { - $phrase[] = 'DEFAULT CHARSET=utf8'; - $phrase[] = 'COLLATE=utf8_bin'; + if (strtolower($oldProps['TABLE_COLLATION']) != 'utf8mb4_bin') { + $phrase[] = 'CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin'; + $phrase[] = 'DEFAULT CHARACTER SET = utf8mb4'; + $phrase[] = 'DEFAULT COLLATE = utf8mb4_bin'; } } @@ -372,7 +412,14 @@ class MysqlSchema extends Schema $vals = array_map(array($this, 'quote'), $column['enum']); return 'enum(' . implode(',', $vals) . ')'; } else if ($this->_isString($column)) { - return parent::typeAndSize($column) . ' CHARSET utf8'; + $col = parent::typeAndSize($column); + if (!empty($column['charset'])) { + $col .= ' CHARSET ' . $column['charset']; + } + if (!empty($column['collate'])) { + $col .= ' COLLATE ' . $column['collate']; + } + return $col; } else { return parent::typeAndSize($column); }