diff --git a/src/MySql/AuditDiff.php b/src/MySql/AuditDiff.php index 5085ebe..5c5f958 100755 --- a/src/MySql/AuditDiff.php +++ b/src/MySql/AuditDiff.php @@ -22,7 +22,7 @@ class AuditDiff /** * The metadata (additional) audit columns (as stored in the config file). * - * @var TableColumnsMetadata + * @var array[] */ private $auditColumnsMetadata; @@ -181,7 +181,7 @@ private function getDiff() $this->diffColumns[$table['table_name']] = new AuditDiffTable($this->config['database']['data_schema'], $this->config['database']['audit_schema'], $table['table_name'], - $this->config['audit_columns'], + $this->auditColumnsMetadata, $this->configMetadata[$table['table_name']]); } } @@ -237,7 +237,7 @@ private function printDiff() $rows = new DiffTableHelper($this->config['database']['data_schema'], $this->config['database']['audit_schema'], $tableName, - $this->config['audit_columns'], + $this->auditColumnsMetadata, $this->full); $rows->appendRows($columns); $rows->addHighlighting(); @@ -306,6 +306,11 @@ private function resolveCanonicalAuditColumns() foreach ($this->config['audit_columns'] as $audit_column) { $key = StaticDataLayer::searchInRowSet('column_name', $audit_column['column_name'], $columns); + + if ($columns[$key]['is_nullable']==='NO') + { + $columns[$key]['column_type'] = sprintf('%s not null', $columns[$key]['column_type']); + } if (isset($audit_column['value_type'])) { $columns[$key]['value_type'] = $audit_column['value_type']; @@ -316,7 +321,7 @@ private function resolveCanonicalAuditColumns() } } - $this->auditColumnsMetadata = new TableColumnsMetadata($columns, 'AuditColumnMetadata'); + $this->auditColumnsMetadata = $columns; } } diff --git a/src/MySql/AuditDiffTable.php b/src/MySql/AuditDiffTable.php index 92ed3fa..59022ff 100755 --- a/src/MySql/AuditDiffTable.php +++ b/src/MySql/AuditDiffTable.php @@ -117,7 +117,8 @@ public function removeMatchingColumns() { if (isset($audit) && isset($config)) { - if ($audit->getProperty('column_type')==$config->getProperty('column_type')) + $check = $this->compareCollationCharSetName($audit, $config); + if ($audit->getProperty('column_type')==$config->getProperty('column_type') && $check) { if (isset($auditColumn)) { @@ -130,21 +131,8 @@ public function removeMatchingColumns() { if (isset($audit) && isset($config)) { - $config_character_set_name = $config->getProperty('character_set_name'); - $config_collation_name = $config->getProperty('collation_name'); - $audit_character_set_name = $audit->getProperty('character_set_name'); - $audit_collation_name = $audit->getProperty('collation_name'); - - $data_character_set_name = $data->getProperty('character_set_name'); - $data_collation_name = $data->getProperty('collation_name'); - - if ( - $audit->getProperty('column_type')==$data->getProperty('column_type') - && $audit_character_set_name==$data_character_set_name - && $audit_character_set_name==$config_character_set_name - && $audit_collation_name==$config_collation_name - && $audit_collation_name==$data_collation_name - ) + $check = $this->compareCollationCharSetName($data, $audit, $config); + if ($audit->getProperty('column_type')==$data->getProperty('column_type') && $check) { $metadata->removeColumn($columnName); } @@ -183,6 +171,48 @@ private function addNotNull($theColumns) return $modifiedColumns; } + //-------------------------------------------------------------------------------------------------------------------- + /** + * Compare collations and character set names. + * + * @param MultiSourceColumnMetadata $audit Column information from audit schema. + * @param MultiSourceColumnMetadata $config Column information from config file. + * @param MultiSourceColumnMetadata|null $data Column information from data schema. + * + * @return array + */ + private function compareCollationCharSetName($audit, $config, $data = null) + { + $config_character_set_name = $config->getProperty('character_set_name'); + $config_collation_name = $config->getProperty('collation_name'); + $audit_character_set_name = $audit->getProperty('character_set_name'); + $audit_collation_name = $audit->getProperty('collation_name'); + + if (isset($data)) + { + $data_character_set_name = $data->getProperty('character_set_name'); + $data_collation_name = $data->getProperty('collation_name'); + + if ($audit_character_set_name==$data_character_set_name + && $audit_character_set_name==$config_character_set_name + && $audit_collation_name==$config_collation_name + && $audit_collation_name==$data_collation_name + ) + { + return true; + } + } + else + { + if ($audit_character_set_name==$config_character_set_name && $audit_collation_name==$config_collation_name) + { + return true; + } + } + + return false; + } + //-------------------------------------------------------------------------------------------------------------------- /** * Get the difference between data and audit tables.